Home | History | Annotate | Download | only in cert
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package tests.security.cert;
     19 
     20 import java.io.ByteArrayInputStream;
     21 import java.io.IOException;
     22 import java.math.BigInteger;
     23 import java.security.InvalidAlgorithmParameterException;
     24 import java.security.InvalidKeyException;
     25 import java.security.NoSuchAlgorithmException;
     26 import java.security.NoSuchProviderException;
     27 import java.security.Principal;
     28 import java.security.PublicKey;
     29 import java.security.SignatureException;
     30 import java.security.cert.CertPath;
     31 import java.security.cert.CertPathBuilder;
     32 import java.security.cert.CertPathBuilderException;
     33 import java.security.cert.CertificateEncodingException;
     34 import java.security.cert.CertificateException;
     35 import java.security.cert.CertificateExpiredException;
     36 import java.security.cert.CertificateFactory;
     37 import java.security.cert.CertificateNotYetValidException;
     38 import java.security.cert.CertificateParsingException;
     39 import java.security.cert.PKIXBuilderParameters;
     40 import java.security.cert.PKIXCertPathBuilderResult;
     41 import java.security.cert.TrustAnchor;
     42 import java.security.cert.X509CertSelector;
     43 import java.security.cert.X509Certificate;
     44 import java.util.ArrayList;
     45 import java.util.Arrays;
     46 import java.util.Calendar;
     47 import java.util.Collection;
     48 import java.util.Collections;
     49 import java.util.Date;
     50 import java.util.HashSet;
     51 import java.util.List;
     52 import java.util.Set;
     53 import javax.security.auth.x500.X500Principal;
     54 
     55 import junit.framework.TestCase;
     56 
     57 import org.apache.harmony.security.tests.support.TestKeyPair;
     58 import org.apache.harmony.security.tests.support.cert.MyCRL;
     59 import org.apache.harmony.security.tests.support.cert.TestUtils;
     60 
     61 import sun.security.util.ObjectIdentifier;
     62 import sun.security.util.DerOutputStream;
     63 
     64 import sun.security.x509.CertificatePoliciesExtension;
     65 import sun.security.x509.CertificatePolicyId;
     66 import sun.security.x509.DNSName;
     67 import sun.security.x509.EDIPartyName;
     68 import sun.security.x509.GeneralNames;
     69 import sun.security.x509.GeneralName;
     70 import sun.security.x509.GeneralNameInterface;
     71 import sun.security.x509.IPAddressName;
     72 import sun.security.x509.OIDName;
     73 import sun.security.x509.OtherName;
     74 import sun.security.x509.PolicyInformation;
     75 import sun.security.x509.PrivateKeyUsageExtension;
     76 import sun.security.x509.RFC822Name;
     77 import sun.security.x509.SubjectAlternativeNameExtension;
     78 import sun.security.x509.URIName;
     79 import sun.security.x509.X400Address;
     80 import sun.security.x509.X500Name;
     81 
     82 /**
     83  * X509CertSelectorTest
     84  */
     85 public class X509CertSelectorTest extends TestCase {
     86 
     87     byte[][] constraintBytes = new byte[][] {
     88             {
     89                     48, 28, -96, 12, 48, 10, -127, 8, 56, 50, 50, 46, 78,
     90                     97, 109, 101, -95, 12, 48, 10, -127, 8, 56, 50, 50, 46, 78,
     91                     97, 109, 101},
     92             {       48, 36, -96, 16, 48, 14, -127, 12, 114, 102, 99, 64, 56, 50,
     93                     50, 46, 78, 97, 109, 101, -95, 16, 48, 14, -127, 12, 114,
     94                     102, 99, 64, 56, 50, 50, 46, 78, 97, 109, 101},
     95             {       48, 28, -96, 12, 48, 10, -126, 8, 78, 97, 109, 101, 46, 111,
     96                     114, 103, -95, 12, 48, 10, -126, 8, 78, 97, 109, 101, 46,
     97                     111, 114, 103},
     98             {       48, 36, -96, 16, 48, 14, -126, 12, 100, 78, 83, 46, 78, 97,
     99                     109, 101, 46, 111, 114, 103, -95, 16, 48, 14, -126, 12, 100,
    100                     78, 83, 46, 78, 97, 109, 101, 46, 111, 114, 103},
    101             {       48, 34, -96, 15, 48, 13, -122, 11, 82, 101, 115, 111, 117,
    102                     114, 99, 101, 46, 73, 100, -95, 15, 48, 13, -122, 11, 82,
    103                     101, 115, 111, 117, 114, 99, 101, 46, 73, 100},
    104             {       48, 50, -96, 23, 48, 21, -122, 19, 117, 110, 105, 102, 111,
    105                     114, 109, 46, 82, 101, 115, 111, 117, 114, 99, 101, 46, 73,
    106                     100, -95, 23, 48, 21, -122, 19, 117, 110, 105, 102, 111,
    107                     114, 109, 46, 82, 101, 115, 111, 117, 114, 99, 101, 46, 73,
    108                     100},
    109             {       48, 20, -96, 8, 48, 6, -121, 4, 1, 1, 1, 1, -95, 8, 48, 6,
    110                     -121, 4, 1, 1, 1, 1},
    111             {       48, 44, -96, 20, 48, 18, -121, 16, 1, 1, 1, 1, 1, 1, 1, 1,
    112                     1, 1, 1, 1, 1, 1, 1, 1, -95, 20, 48, 18, -121, 16, 1, 1, 1,
    113                     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    114             };
    115 
    116     /**
    117      * java.security.cert.X509CertSelector#addSubjectAlternativeName(int, byte[])
    118      */
    119     public void test_addSubjectAlternativeNameLintLbyte_array() throws IOException {
    120         // Regression for HARMONY-2487
    121         int[] types = { GeneralNameInterface.NAME_ANY,
    122                 GeneralNameInterface.NAME_RFC822,
    123                 GeneralNameInterface.NAME_DNS,
    124                 GeneralNameInterface.NAME_X400,
    125                 GeneralNameInterface.NAME_DIRECTORY,
    126                 GeneralNameInterface.NAME_EDI,
    127                 GeneralNameInterface.NAME_URI,
    128                 GeneralNameInterface.NAME_IP,
    129                 GeneralNameInterface.NAME_OID };
    130         for (int i = 0; i < types.length; i++) {
    131             try {
    132                 new X509CertSelector().addSubjectAlternativeName(types[i],
    133                         (byte[]) null);
    134                 fail("No expected NullPointerException for type: " + types[i]);
    135             } catch (NullPointerException expected) {
    136             }
    137         }
    138     }
    139 
    140     /**
    141      * java.security.cert.X509CertSelector#addSubjectAlternativeName(int, String)
    142      */
    143     public void test_addSubjectAlternativeNameLintLjava_lang_String() {
    144         // Regression for HARMONY-727
    145         int[] types = { GeneralNameInterface.NAME_ANY,
    146                 // The test was disabled in M: bd7a7c87692d3b5be341fbc5022eaa07611ae751
    147                 // and was reintroduced after the test was enabled after some
    148                 // time it wasn't run: 5ef40918006efad4c7194b505c3ad176928711a3
    149                 // Disabling again for N as it's failing and wasn't being run for M anyway
    150                 // GeneralNameInterface.NAME_RFC822,
    151                 GeneralNameInterface.NAME_DNS,
    152                 GeneralNameInterface.NAME_X400,
    153                 GeneralNameInterface.NAME_DIRECTORY,
    154                 GeneralNameInterface.NAME_EDI,
    155                 GeneralNameInterface.NAME_URI,
    156                 GeneralNameInterface.NAME_IP,
    157                 GeneralNameInterface.NAME_OID };
    158         for (int i = 0; i < types.length; i++) {
    159             try {
    160                 new X509CertSelector().addSubjectAlternativeName(types[i],
    161                         "-0xDFRF");
    162                 fail("IOException expected for type: " + types[i]);
    163             } catch (IOException expected) {
    164             }
    165         }
    166     }
    167 
    168     /**
    169      * java.security.cert.X509CertSelector#addPathToName(int, byte[])
    170      */
    171     public void test_addPathToNameLintLbyte_array() throws IOException {
    172         // Regression for HARMONY-2487
    173         int[] types = { GeneralNameInterface.NAME_ANY,
    174                         GeneralNameInterface.NAME_RFC822,
    175                         GeneralNameInterface.NAME_DNS,
    176                         GeneralNameInterface.NAME_X400,
    177                         GeneralNameInterface.NAME_DIRECTORY,
    178                         GeneralNameInterface.NAME_EDI,
    179                         GeneralNameInterface.NAME_URI,
    180                         GeneralNameInterface.NAME_IP,
    181                         GeneralNameInterface.NAME_OID };
    182         for (int i = 0; i < types.length; i++) {
    183             try {
    184                 new X509CertSelector().addPathToName(types[i], (byte[]) null);
    185                 fail("No expected NullPointerException for type: " + types[i]);
    186             } catch (NullPointerException expected) {
    187             }
    188         }
    189     }
    190 
    191     /**
    192      * java.security.cert.X509CertSelector#addPathToName(int, String)
    193      */
    194     public void test_addPathToNameLintLjava_lang_String() {
    195         // Regression for HARMONY-724
    196         for (int type = 0; type <= 8; type++) {
    197             try {
    198                 new X509CertSelector().addPathToName(type, (String) null);
    199                 fail();
    200             } catch (IOException expected) {
    201             }
    202         }
    203 
    204 
    205     }
    206 
    207     /**
    208      * java.security.cert.X509CertSelector#X509CertSelector()
    209      */
    210     public void test_X509CertSelector() {
    211         X509CertSelector selector = new X509CertSelector();
    212         assertEquals(-1, selector.getBasicConstraints());
    213         assertTrue(selector.getMatchAllSubjectAltNames());
    214     }
    215 
    216     /**
    217      * java.security.cert.X509CertSelector#clone()
    218      */
    219     public void test_clone() throws Exception {
    220         X509CertSelector selector = new X509CertSelector();
    221         X509CertSelector selector1 = (X509CertSelector) selector.clone();
    222 
    223         assertEquals(selector.getMatchAllSubjectAltNames(), selector1.getMatchAllSubjectAltNames());
    224         assertEquals(selector.getAuthorityKeyIdentifier(), selector1.getAuthorityKeyIdentifier());
    225         assertEquals(selector.getBasicConstraints(), selector1.getBasicConstraints());
    226         assertEquals(selector.getCertificate(), selector1.getCertificate());
    227         assertEquals(selector.getCertificateValid(), selector1.getCertificateValid());
    228         assertEquals(selector.getExtendedKeyUsage(), selector1.getExtendedKeyUsage());
    229         assertEquals(selector.getIssuer(), selector1.getIssuer());
    230         assertEquals(selector.getIssuerAsBytes(), selector1.getIssuerAsBytes());
    231         assertEquals(selector.getIssuerAsString(), selector1.getIssuerAsString());
    232         assertEquals(selector.getKeyUsage(), selector1.getKeyUsage());
    233         assertEquals(selector.getNameConstraints(), selector1.getNameConstraints());
    234         assertEquals(selector.getPathToNames(), selector1.getPathToNames());
    235         assertEquals(selector.getPolicy(), selector1.getPolicy());
    236         assertEquals(selector.getPrivateKeyValid(), selector1.getPrivateKeyValid());
    237         assertEquals(selector.getSerialNumber(), selector1.getSerialNumber());
    238         assertEquals(selector.getSubject(), selector1.getSubject());
    239         assertEquals(selector.getSubjectAlternativeNames(), selector1.getSubjectAlternativeNames());
    240         assertEquals(selector.getSubjectAsBytes(), selector1.getSubjectAsBytes());
    241         assertEquals(selector.getSubjectAsString(), selector1.getSubjectAsString());
    242         assertEquals(selector.getSubjectKeyIdentifier(), selector1.getSubjectKeyIdentifier());
    243         assertEquals(selector.getSubjectPublicKey(), selector1.getSubjectPublicKey());
    244         assertEquals(selector.getSubjectPublicKeyAlgID(), selector1.getSubjectPublicKeyAlgID());
    245 
    246         selector = null;
    247         try {
    248             selector.clone();
    249             fail();
    250         } catch (NullPointerException expected) {
    251         }
    252     }
    253 
    254     /**
    255      * java.security.cert.X509CertSelector#getAuthorityKeyIdentifier()
    256      */
    257     public void test_getAuthorityKeyIdentifier() {
    258         byte[] akid1 = new byte[] { 4, 5, 1, 2, 3, 4, 5 }; // random value
    259         byte[] akid2 = new byte[] { 4, 5, 5, 4, 3, 2, 1 }; // random value
    260         X509CertSelector selector = new X509CertSelector();
    261 
    262         assertNull("Selector should return null",
    263                    selector.getAuthorityKeyIdentifier());
    264         assertFalse("The returned keyID should be equal to specified",
    265                    Arrays.equals(akid1, selector.getAuthorityKeyIdentifier()));
    266         selector.setAuthorityKeyIdentifier(akid1);
    267         assertTrue("The returned keyID should be equal to specified",
    268                    Arrays.equals(akid1, selector.getAuthorityKeyIdentifier()));
    269         assertFalse("The returned keyID should differ",
    270                     Arrays.equals(akid2, selector.getAuthorityKeyIdentifier()));
    271     }
    272 
    273     /**
    274      * java.security.cert.X509CertSelector#getBasicConstraints()
    275      */
    276     public void test_getBasicConstraints() {
    277         X509CertSelector selector = new X509CertSelector();
    278         int[] validValues = { 2, 1, 0, 1, 2, 3, 10, 20 };
    279         for (int i = 0; i < validValues.length; i++) {
    280             selector.setBasicConstraints(validValues[i]);
    281             assertEquals(validValues[i], selector.getBasicConstraints());
    282         }
    283     }
    284 
    285     /**
    286      * java.security.cert.X509CertSelector#getCertificate()
    287      */
    288     public void test_getCertificate() throws Exception {
    289         X509CertSelector selector = new X509CertSelector();
    290         CertificateFactory certFact = CertificateFactory.getInstance("X509");
    291         X509Certificate cert1 = (X509Certificate)
    292                 certFact.generateCertificate(new ByteArrayInputStream(
    293                         TestUtils.getX509Certificate_v3()));
    294 
    295         X509Certificate cert2 = (X509Certificate)
    296                 certFact.generateCertificate(new ByteArrayInputStream(
    297                         TestUtils.getX509Certificate_v1()));
    298 
    299         selector.setCertificate(cert1);
    300         assertEquals(cert1, selector.getCertificate());
    301 
    302         selector.setCertificate(cert2);
    303         assertEquals(cert2, selector.getCertificate());
    304 
    305         selector.setCertificate(null);
    306         assertNull(selector.getCertificate());
    307     }
    308 
    309     /**
    310      * java.security.cert.X509CertSelector#getCertificateValid()
    311      */
    312     public void test_getCertificateValid() {
    313         Date date1 = new Date(100);
    314         Date date2 = new Date(200);
    315         Date date3 = Calendar.getInstance().getTime();
    316         X509CertSelector selector = new X509CertSelector();
    317 
    318         assertNull("Selector should return null",
    319                    selector.getCertificateValid());
    320         selector.setCertificateValid(date1);
    321         assertTrue("The returned date should be equal to specified",
    322                    date1.equals(selector.getCertificateValid()));
    323         selector.getCertificateValid().setTime(200);
    324         assertTrue("The returned date should be equal to specified",
    325                    date1.equals(selector.getCertificateValid()));
    326         assertFalse("The returned date should differ",
    327                     date2.equals(selector.getCertificateValid()));
    328         selector.setCertificateValid(date3);
    329         assertTrue("The returned date should be equal to specified",
    330                    date3.equals(selector.getCertificateValid()));
    331         selector.setCertificateValid(null);
    332         assertNull(selector.getCertificateValid());
    333     }
    334 
    335     /**
    336      * java.security.cert.X509CertSelector#getExtendedKeyUsage()
    337      */
    338     public void test_getExtendedKeyUsage() throws Exception {
    339         HashSet<String> ku = new HashSet<String>(Arrays.asList(new String[] {
    340             "1.3.6.1.5.5.7.3.1",
    341             "1.3.6.1.5.5.7.3.2",
    342             "1.3.6.1.5.5.7.3.3",
    343             "1.3.6.1.5.5.7.3.4",
    344             "1.3.6.1.5.5.7.3.8",
    345             "1.3.6.1.5.5.7.3.9",
    346             "1.3.6.1.5.5.7.3.5",
    347             "1.3.6.1.5.5.7.3.6",
    348             "1.3.6.1.5.5.7.3.7"
    349         }));
    350         X509CertSelector selector = new X509CertSelector();
    351 
    352         assertNull("Selector should return null", selector.getExtendedKeyUsage());
    353         selector.setExtendedKeyUsage(ku);
    354         assertTrue("The returned extendedKeyUsage should be equal to specified",
    355                    ku.equals(selector.getExtendedKeyUsage()));
    356         try {
    357             selector.getExtendedKeyUsage().add("KRIBLEGRABLI");
    358             fail("The returned Set should be immutable.");
    359         } catch (UnsupportedOperationException expected) {
    360         }
    361     }
    362 
    363     /**
    364      * java.security.cert.X509CertSelector#getIssuer()
    365      */
    366     public void test_getIssuer() {
    367         X500Principal iss1 = new X500Principal("O=First Org.");
    368         X500Principal iss2 = new X500Principal("O=Second Org.");
    369         X509CertSelector selector = new X509CertSelector();
    370 
    371         assertNull("Selector should return null", selector.getIssuer());
    372         selector.setIssuer(iss1);
    373         assertEquals("The returned issuer should be equal to specified",
    374                      iss1, selector.getIssuer());
    375         assertFalse("The returned issuer should differ",
    376                     iss2.equals(selector.getIssuer()));
    377     }
    378 
    379     /**
    380      * java.security.cert.X509CertSelector#getIssuerAsBytes()
    381      */
    382     public void test_getIssuerAsBytes() throws Exception {
    383         byte[] name1 = new byte[]
    384         // manually obtained DER encoding of "O=First Org." issuer name;
    385         { 48, 21, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10, 70, 105, 114, 115,
    386                 116, 32, 79, 114, 103, 46 };
    387 
    388         byte[] name2 = new byte[]
    389         // manually obtained DER encoding of "O=Second Org." issuer name;
    390         { 48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 10, 19, 11, 83, 101, 99, 111,
    391                 110, 100, 32, 79, 114, 103, 46 };
    392         X500Principal iss1 = new X500Principal(name1);
    393         X500Principal iss2 = new X500Principal(name2);
    394         X509CertSelector selector = new X509CertSelector();
    395 
    396         assertNull("Selector should return null", selector.getIssuerAsBytes());
    397         selector.setIssuer(iss1);
    398         assertTrue("The returned issuer should be equal to specified",
    399                    Arrays.equals(name1, selector.getIssuerAsBytes()));
    400         assertFalse("The returned issuer should differ", name2.equals(selector.getIssuerAsBytes()));
    401         selector.setIssuer(iss2);
    402         assertTrue("The returned issuer should be equal to specified",
    403                    Arrays.equals(name2, selector.getIssuerAsBytes()));
    404     }
    405 
    406     /**
    407      * java.security.cert.X509CertSelector#getIssuerAsString()
    408      */
    409     public void test_getIssuerAsString() {
    410         String name1 = "O=First Org.";
    411         String name2 = "O=Second Org.";
    412         X500Principal iss1 = new X500Principal(name1);
    413         X500Principal iss2 = new X500Principal(name2);
    414         X509CertSelector selector = new X509CertSelector();
    415 
    416         assertNull("Selector should return null", selector.getIssuerAsString());
    417         selector.setIssuer(iss1);
    418         assertEquals("The returned issuer should be equal to specified", name1,
    419                      selector.getIssuerAsString());
    420         assertFalse("The returned issuer should differ",
    421                     name2.equals(selector.getIssuerAsString()));
    422         selector.setIssuer(iss2);
    423         assertEquals("The returned issuer should be equal to specified", name2,
    424                      selector.getIssuerAsString());
    425     }
    426 
    427     /**
    428      * java.security.cert.X509CertSelector#getKeyUsage()
    429      */
    430     public void test_getKeyUsage() {
    431         boolean[] ku = new boolean[] { true, false, true, false, true, false,
    432                 true, false, true };
    433         X509CertSelector selector = new X509CertSelector();
    434 
    435         assertNull("Selector should return null", selector.getKeyUsage());
    436         selector.setKeyUsage(ku);
    437         assertTrue("The returned date should be equal to specified",
    438                    Arrays.equals(ku, selector.getKeyUsage()));
    439         boolean[] result = selector.getKeyUsage();
    440         result[0] = !result[0];
    441         assertTrue("The returned keyUsage should be equal to specified",
    442                    Arrays.equals(ku, selector.getKeyUsage()));
    443     }
    444 
    445     /**
    446      * java.security.cert.X509CertSelector#getMatchAllSubjectAltNames()
    447      */
    448     public void test_getMatchAllSubjectAltNames() {
    449         X509CertSelector selector = new X509CertSelector();
    450         assertTrue("The matchAllNames initially should be true",
    451                    selector.getMatchAllSubjectAltNames());
    452         selector.setMatchAllSubjectAltNames(false);
    453         assertFalse("The value should be false",
    454                     selector.getMatchAllSubjectAltNames());
    455     }
    456 
    457     /**
    458      * java.security.cert.X509CertSelector#getNameConstraints()
    459      */
    460     public void test_getNameConstraints() throws IOException {
    461 
    462 // Used to generate following byte array
    463 //      org.bouncycastle.asn1.x509.GeneralName[] name_constraints =
    464 //          new org.bouncycastle.asn1.x509.GeneralName[] {
    465 //                new org.bouncycastle.asn1.x509.GeneralName(1, "822.Name"),
    466 //                new org.bouncycastle.asn1.x509.GeneralName(1, "rfc (at) 822.Name"),
    467 //                new org.bouncycastle.asn1.x509.GeneralName(2, "Name.org"),
    468 //                new org.bouncycastle.asn1.x509.GeneralName(2, "dNS.Name.org"),
    469 //
    470 //                new org.bouncycastle.asn1.x509.GeneralName(6, "Resource.Id"),
    471 //                new org.bouncycastle.asn1.x509.GeneralName(6,
    472 //                    "uniform.Resource.Id"),
    473 //                new org.bouncycastle.asn1.x509.GeneralName(7, "1.1.1.1"),
    474 //
    475 //                new org.bouncycastle.asn1.x509.GeneralName(7,
    476 //                    new org.bouncycastle.asn1.DEROctetString(new byte[] {
    477 //                        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 })),
    478 //          };
    479 //
    480 //        constraintBytes = new byte[name_constraints.length][];
    481 //
    482 //        for (int i = 0; i < name_constraints.length; i++) {
    483 //          org.bouncycastle.asn1.x509.GeneralSubtree subtree =
    484 //              new org.bouncycastle.asn1.x509.GeneralSubtree(
    485 //                  name_constraints[i]);
    486 //          org.bouncycastle.asn1.x509.GeneralSubtree[] subtrees =
    487 //              new org.bouncycastle.asn1.x509.GeneralSubtree[1];
    488 //          subtrees[0] = subtree;
    489 //          org.bouncycastle.asn1.x509.NameConstraints constraints =
    490 //              new org.bouncycastle.asn1.x509.NameConstraints(
    491 //                  subtrees, subtrees);
    492 //            constraintBytes[i] = constraints.getEncoded();
    493 //        }
    494 //        System.out.println("XXX"+Arrays.deepToString(constraintBytes)+"XXX");
    495         X509CertSelector selector = new X509CertSelector();
    496 
    497         for (int i = 0; i < constraintBytes.length; i++) {
    498             selector.setNameConstraints(constraintBytes[i]);
    499             assertTrue(Arrays.equals(constraintBytes[i],
    500                                      selector.getNameConstraints()));
    501         }
    502     }
    503 
    504     /**
    505      * java.security.cert.X509CertSelector#getPathToNames()
    506      */
    507     public void test_getPathToNames() throws Exception {
    508         GeneralName san0 = new GeneralName(new OtherName(new ObjectIdentifier("1.2.3.4.5"),
    509                 new byte[] { 1, 2, 0, 1 }));
    510         GeneralName san1 = new GeneralName(new RFC822Name("rfc (at) 822.Name"));
    511         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
    512 
    513         // http://b/27197633 (Missing replacement for ORAddress)
    514         // GeneralName san3 = new GeneralName(new X400Address((byte[])null));
    515         GeneralName san4 = new GeneralName(new X500Name("O=Organization"));
    516         GeneralName san6 = new GeneralName(new URIName("http://uniform.Resource.Id"));
    517         GeneralName san7 = new GeneralName(new IPAddressName("1.1.1.1"));
    518         GeneralName san8 = new GeneralName(new OIDName("1.2.3.4444.55555"));
    519 
    520 
    521         GeneralNames sans1 = new GeneralNames();
    522         sans1.add(san0);
    523         sans1.add(san1);
    524         sans1.add(san2);
    525 
    526         // http://b/27197633 (Missing replacement for ORAddress)
    527         // sans1.add(san3);
    528         sans1.add(san4);
    529         sans1.add(san6);
    530         sans1.add(san7);
    531         sans1.add(san8);
    532         GeneralNames sans2 = new GeneralNames();
    533         sans2.add(san0);
    534 
    535         TestCert cert1 = new TestCert(sans1);
    536         TestCert cert2 = new TestCert(sans2);
    537         X509CertSelector selector = new X509CertSelector();
    538         selector.setMatchAllSubjectAltNames(true);
    539 
    540         selector.setPathToNames(null);
    541         assertTrue("Any certificate should match in the case of null "
    542                    + "subjectAlternativeNames criteria.",
    543                    selector.match(cert1) && selector.match(cert2));
    544 
    545         Collection<List<?>> sans = getGeneralNamePairList(sans1);
    546 
    547         selector.setPathToNames(sans);
    548         selector.getPathToNames();
    549     }
    550 
    551     /**
    552      * java.security.cert.X509CertSelector#getPolicy()
    553      */
    554     public void test_getPolicy() throws IOException {
    555         String[] policies1 = new String[] {
    556             "1.3.6.1.5.5.7.3.1",
    557             "1.3.6.1.5.5.7.3.2",
    558             "1.3.6.1.5.5.7.3.3",
    559             "1.3.6.1.5.5.7.3.4",
    560             "1.3.6.1.5.5.7.3.8",
    561             "1.3.6.1.5.5.7.3.9",
    562             "1.3.6.1.5.5.7.3.5",
    563             "1.3.6.1.5.5.7.3.6",
    564             "1.3.6.1.5.5.7.3.7"
    565         };
    566 
    567         String[] policies2 = new String[] { "1.3.6.7.3.1" };
    568 
    569         HashSet<String> p1 = new HashSet<String>(Arrays.asList(policies1));
    570         HashSet<String> p2 = new HashSet<String>(Arrays.asList(policies2));
    571 
    572         X509CertSelector selector = new X509CertSelector();
    573 
    574         selector.setPolicy(null);
    575         assertNull(selector.getPolicy());
    576 
    577         selector.setPolicy(p1);
    578         assertEquals("The returned date should be equal to specified", p1, selector.getPolicy());
    579 
    580         selector.setPolicy(p2);
    581         assertEquals("The returned date should be equal to specified", p2, selector.getPolicy());
    582     }
    583 
    584     /**
    585      * java.security.cert.X509CertSelector#getPrivateKeyValid()
    586      */
    587     public void test_getPrivateKeyValid() {
    588         Date date1 = new Date(100);
    589         Date date2 = new Date(200);
    590         X509CertSelector selector = new X509CertSelector();
    591 
    592         assertNull("Selector should return null", selector.getPrivateKeyValid());
    593         selector.setPrivateKeyValid(date1);
    594         assertTrue("The returned date should be equal to specified",
    595                    date1.equals(selector.getPrivateKeyValid()));
    596         selector.getPrivateKeyValid().setTime(200);
    597         assertTrue("The returned date should be equal to specified",
    598                    date1.equals(selector.getPrivateKeyValid()));
    599         assertFalse("The returned date should differ",
    600                     date2.equals(selector.getPrivateKeyValid()));
    601     }
    602 
    603     /**
    604      * java.security.cert.X509CertSelector#getSerialNumber()
    605      */
    606     public void test_getSerialNumber() {
    607         BigInteger ser1 = new BigInteger("10000");
    608         BigInteger ser2 = new BigInteger("10001");
    609         X509CertSelector selector = new X509CertSelector();
    610 
    611         assertNull("Selector should return null", selector.getSerialNumber());
    612         selector.setSerialNumber(ser1);
    613         assertEquals("The returned serial number should be equal to specified",
    614                      ser1, selector.getSerialNumber());
    615         assertFalse("The returned serial number should differ",
    616                     ser2.equals(selector.getSerialNumber()));
    617     }
    618 
    619     /**
    620      * java.security.cert.X509CertSelector#getSubject()
    621      */
    622     public void test_getSubject() {
    623         X500Principal sub1 = new X500Principal("O=First Org.");
    624         X500Principal sub2 = new X500Principal("O=Second Org.");
    625         X509CertSelector selector = new X509CertSelector();
    626 
    627         assertNull("Selector should return null", selector.getSubject());
    628         selector.setSubject(sub1);
    629         assertEquals("The returned subject should be equal to specified", sub1,
    630                      selector.getSubject());
    631         assertFalse("The returned subject should differ",
    632                     sub2.equals(selector.getSubject()));
    633     }
    634 
    635     /**
    636      * java.security.cert.X509CertSelector#getSubjectAlternativeNames()
    637      */
    638     public void test_getSubjectAlternativeNames() throws Exception {
    639         GeneralName san1 = new GeneralName(new RFC822Name("rfc (at) 822.Name"));
    640         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
    641 
    642         GeneralNames sans = new GeneralNames();
    643         sans.add(san1);
    644         sans.add(san2);
    645 
    646         TestCert cert_1 = new TestCert(sans);
    647         X509CertSelector selector = new X509CertSelector();
    648 
    649         assertNull("Selector should return null",
    650                    selector.getSubjectAlternativeNames());
    651 
    652         selector.setSubjectAlternativeNames(getGeneralNamePairList(sans));
    653         assertTrue("The certificate should match the selection criteria.",
    654                    selector.match(cert_1));
    655         selector.getSubjectAlternativeNames().clear();
    656         assertTrue("The modification of initialization object "
    657                    + "should not affect the modification "
    658                    + "of internal object.",
    659                    selector.match(cert_1));
    660     }
    661 
    662     /**
    663      * java.security.cert.X509CertSelector#getSubjectAsBytes()
    664      */
    665     public void test_getSubjectAsBytes() throws Exception {
    666         byte[] name1 = new byte[]
    667         // manually obtained DER encoding of "O=First Org." issuer name;
    668                 { 48, 21, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10, 70, 105, 114, 115,
    669                   116, 32, 79, 114, 103, 46 };
    670         byte[] name2 = new byte[]
    671         // manually obtained DER encoding of "O=Second Org." issuer name;
    672                 { 48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 10, 19, 11, 83, 101, 99, 111,
    673                   110, 100, 32, 79, 114, 103, 46 };
    674 
    675         X500Principal sub1 = new X500Principal(name1);
    676         X500Principal sub2 = new X500Principal(name2);
    677         X509CertSelector selector = new X509CertSelector();
    678 
    679         assertNull("Selector should return null",
    680                    selector.getSubjectAsBytes());
    681         selector.setSubject(sub1);
    682         assertTrue("The returned issuer should be equal to specified",
    683                    Arrays.equals(name1, selector.getSubjectAsBytes()));
    684         assertFalse("The returned issuer should differ",
    685                     name2.equals(selector.getSubjectAsBytes()));
    686         selector.setSubject(sub2);
    687         assertTrue("The returned issuer should be equal to specified",
    688                    Arrays.equals(name2, selector.getSubjectAsBytes()));
    689     }
    690 
    691     /**
    692      * java.security.cert.X509CertSelector#getSubjectAsString()
    693      */
    694     public void test_getSubjectAsString() {
    695         String name1 = "O=First Org.";
    696         String name2 = "O=Second Org.";
    697         X500Principal sub1 = new X500Principal(name1);
    698         X500Principal sub2 = new X500Principal(name2);
    699         X509CertSelector selector = new X509CertSelector();
    700 
    701         assertNull("Selector should return null", selector.getSubjectAsString());
    702         selector.setSubject(sub1);
    703         assertEquals("The returned subject should be equal to specified",
    704                      name1, selector.getSubjectAsString());
    705         assertFalse("The returned subject should differ",
    706                     name2.equals(selector.getSubjectAsString()));
    707         selector.setSubject(sub2);
    708         assertEquals("The returned subject should be equal to specified",
    709                      name2, selector.getSubjectAsString());
    710     }
    711 
    712     /**
    713      * java.security.cert.X509CertSelector#getSubjectKeyIdentifier()
    714      */
    715     public void test_getSubjectKeyIdentifier() {
    716         byte[] skid1 = new byte[] { 1, 2, 3, 4, 5 }; // random value
    717         byte[] skid2 = new byte[] { 4, 5, 5, 4, 3, 2, 1 }; // random value
    718         X509CertSelector selector = new X509CertSelector();
    719 
    720         assertNull("Selector should return null", selector.getSubjectKeyIdentifier());
    721         selector.setSubjectKeyIdentifier(skid1);
    722         assertTrue("The returned keyID should be equal to specified",
    723                    Arrays.equals(skid1, selector.getSubjectKeyIdentifier()));
    724         selector.getSubjectKeyIdentifier()[0]++;
    725         assertTrue("The returned keyID should be equal to specified",
    726                    Arrays.equals(skid1, selector.getSubjectKeyIdentifier()));
    727         assertFalse("The returned keyID should differ",
    728                     Arrays.equals(skid2, selector.getSubjectKeyIdentifier()));
    729     }
    730 
    731     /**
    732      * java.security.cert.X509CertSelector#getSubjectPublicKey()
    733      */
    734     public void test_getSubjectPublicKey() throws Exception {
    735 
    736         // SubjectPublicKeyInfo ::= SEQUENCE {
    737         // algorithm AlgorithmIdentifier,
    738         // subjectPublicKey BIT STRING }
    739         byte[] enc = { 0x30, 0x0E, // SEQUENCE
    740                 0x30, 0x07, // SEQUENCE
    741                 0x06, 0x02, 0x03, 0x05,// OID
    742                 0x01, 0x01, 0x07, // ANY
    743                 0x03, 0x03, 0x01, 0x01, 0x06, // subjectPublicKey
    744         };
    745 
    746         X509CertSelector selector = new X509CertSelector();
    747 
    748         selector.setSubjectPublicKey(enc);
    749         PublicKey key = selector.getSubjectPublicKey();
    750         assertEquals("0.3.5", key.getAlgorithm());
    751         assertEquals("X.509", key.getFormat());
    752         assertTrue(Arrays.equals(enc, key.getEncoded()));
    753         assertNotNull(key.toString());
    754 
    755         key = new MyPublicKey();
    756 
    757         selector.setSubjectPublicKey(key);
    758         PublicKey keyActual = selector.getSubjectPublicKey();
    759         assertEquals(key, keyActual);
    760         assertEquals(key.getAlgorithm(), keyActual.getAlgorithm());
    761     }
    762 
    763     /**
    764      * java.security.cert.X509CertSelector#getSubjectPublicKeyAlgID()
    765      */
    766     public void test_getSubjectPublicKeyAlgID() throws Exception {
    767 
    768         X509CertSelector selector = new X509CertSelector();
    769         String[] validOIDs = { "0.0.20", "1.25.0", "2.0.39", "0.2.10", "1.35.15", "2.17.89" };
    770 
    771         assertNull("Selector should return null", selector.getSubjectPublicKeyAlgID());
    772 
    773         for (int i = 0; i < validOIDs.length; i++) {
    774             try {
    775                 selector.setSubjectPublicKeyAlgID(validOIDs[i]);
    776                 assertEquals(validOIDs[i], selector.getSubjectPublicKeyAlgID());
    777             } catch (IOException e) {
    778                 System.out.println("t = " + e.getMessage());
    779                 //fail("Unexpected exception " + e.getMessage());
    780             }
    781         }
    782 
    783         String pkaid1 = "1.2.840.113549.1.1.1"; // RSA encryption
    784         String pkaid2 = "1.2.840.113549.1.1.4"; // MD5 with RSA encryption
    785 
    786         selector.setSubjectPublicKeyAlgID(pkaid1);
    787         assertTrue("The returned oid should be equal to specified",
    788                    pkaid1.equals(selector.getSubjectPublicKeyAlgID()));
    789         assertFalse("The returned oid should differ",
    790                     pkaid2.equals(selector.getSubjectPublicKeyAlgID()));
    791     }
    792 
    793     /**
    794      * java.security.cert.X509CertSelector#match(java.security.cert.Certificate)
    795      */
    796     public void test_matchLjava_security_cert_Certificate() throws Exception {
    797         X509CertSelector selector = new X509CertSelector();
    798         assertFalse(selector.match(null));
    799 
    800         CertificateFactory certFact = CertificateFactory.getInstance("X509");
    801         X509Certificate cert1 = (X509Certificate)
    802                 certFact.generateCertificate(new ByteArrayInputStream(
    803                         TestUtils.getX509Certificate_v3()));
    804 
    805         X509Certificate cert2 = (X509Certificate)
    806                 certFact.generateCertificate(new ByteArrayInputStream(
    807                         TestUtils.getX509Certificate_v1()));
    808 
    809         selector.setCertificate(cert1);
    810         assertTrue(selector.match(cert1));
    811         assertFalse(selector.match(cert2));
    812 
    813         selector.setCertificate(cert2);
    814         assertFalse(selector.match(cert1));
    815         assertTrue(selector.match(cert2));
    816     }
    817 
    818     /**
    819      * java.security.cert.X509CertSelector#setAuthorityKeyIdentifier(byte[])
    820      */
    821     public void test_setAuthorityKeyIdentifierLB$() throws Exception {
    822         X509CertSelector selector = new X509CertSelector();
    823 
    824         byte[] akid1 = new byte[] { 1, 2, 3, 4, 5 }; // random value
    825         byte[] akid2 = new byte[] { 5, 4, 3, 2, 1 }; // random value
    826         TestCert cert1 = new TestCert(akid1);
    827         TestCert cert2 = new TestCert(akid2);
    828 
    829         selector.setAuthorityKeyIdentifier(null);
    830         assertTrue("The certificate should match the selection criteria.",
    831                 selector.match(cert1));
    832         assertTrue("The certificate should match the selection criteria.",
    833                 selector.match(cert2));
    834         assertNull(selector.getAuthorityKeyIdentifier());
    835 
    836         selector.setAuthorityKeyIdentifier(akid1);
    837         assertTrue("The certificate should not match the selection criteria.",
    838                 selector.match(cert1));
    839         assertFalse("The certificate should not match the selection criteria.",
    840                 selector.match(cert2));
    841         selector.setAuthorityKeyIdentifier(akid2);
    842         assertFalse("The certificate should not match the selection criteria.",
    843                 selector.match(cert1));
    844         assertTrue("The certificate should not match the selection criteria.",
    845                 selector.match(cert2));
    846 
    847         akid2[0]++;
    848         assertTrue("The certificate should match the selection criteria.",
    849                 selector.match(cert2));
    850     }
    851 
    852     /**
    853      * java.security.cert.X509CertSelector#setBasicConstraints(int)
    854      */
    855     public void test_setBasicConstraintsLint() {
    856         X509CertSelector selector = new X509CertSelector();
    857         int[] invalidValues = { -3, -4, -5, 1000000000 };
    858         for (int i = 0; i < invalidValues.length; i++) {
    859             try {
    860                 selector.setBasicConstraints(-3);
    861             } catch (IllegalArgumentException expected) {
    862             }
    863         }
    864 
    865         int[] validValues = { -2, -1, 0, 1, 2, 3, 10, 20 };
    866         for (int i = 0; i < validValues.length; i++) {
    867             selector.setBasicConstraints(validValues[i]);
    868             assertEquals(validValues[i], selector.getBasicConstraints());
    869         }
    870     }
    871 
    872     /**
    873      * java.security.cert.X509CertSelector#setCertificate(java.security.cert.Certificate)
    874      */
    875     public void test_setCertificateLjava_security_cert_X509Certificate()
    876             throws Exception {
    877 
    878         TestCert cert1 = new TestCert("same certificate");
    879         TestCert cert2 = new TestCert("other certificate");
    880         X509CertSelector selector = new X509CertSelector();
    881 
    882         selector.setCertificate(null);
    883         assertTrue("Any certificates should match in the case of null "
    884                 + "certificateEquals criteria.",
    885                    selector.match(cert1) && selector.match(cert2));
    886         selector.setCertificate(cert1);
    887         assertTrue("The certificate should match the selection criteria.",
    888                    selector.match(cert1));
    889         assertFalse("The certificate should not match the selection criteria.",
    890                     selector.match(cert2));
    891         selector.setCertificate(cert2);
    892         assertTrue("The certificate should match the selection criteria.",
    893                    selector.match(cert2));
    894         selector.setCertificate(null);
    895         assertNull(selector.getCertificate());
    896     }
    897 
    898     /**
    899      * java.security.cert.X509CertSelector#setCertificateValid(java.util.Date)
    900      */
    901     public void test_setCertificateValidLjava_util_Date()
    902             throws Exception {
    903         X509CertSelector selector = new X509CertSelector();
    904 
    905         Date date1 = new Date(100);
    906         Date date2 = new Date(200);
    907         TestCert cert1 = new TestCert(date1);
    908         TestCert cert2 = new TestCert(date2);
    909 
    910         selector.setCertificateValid(null);
    911         assertNull(selector.getCertificateValid());
    912         selector.setCertificateValid(date1);
    913         assertTrue("The certificate should match the selection criteria.",
    914                 selector.match(cert1));
    915         assertFalse("The certificate should not match the selection criteria.",
    916                 selector.match(cert2));
    917         selector.setCertificateValid(date2);
    918         date2.setTime(300);
    919         assertTrue("The certificate should match the selection criteria.",
    920                 selector.match(cert2));
    921     }
    922 
    923     /**
    924      * java.security.cert.X509CertSelector#setExtendedKeyUsage(Set<String>)
    925      */
    926     public void test_setExtendedKeyUsageLjava_util_Set() throws Exception {
    927         HashSet<String> ku1 = new HashSet<String>(Arrays.asList(new String[] {
    928             "1.3.6.1.5.5.7.3.1",
    929             "1.3.6.1.5.5.7.3.2",
    930             "1.3.6.1.5.5.7.3.3",
    931             "1.3.6.1.5.5.7.3.4",
    932             "1.3.6.1.5.5.7.3.8",
    933             "1.3.6.1.5.5.7.3.9",
    934             "1.3.6.1.5.5.7.3.5",
    935             "1.3.6.1.5.5.7.3.6",
    936             "1.3.6.1.5.5.7.3.7"
    937         }));
    938         HashSet<String> ku2 = new HashSet<String>(Arrays.asList(new String[] {
    939             "1.3.6.1.5.5.7.3.1",
    940             "1.3.6.1.5.5.7.3.2",
    941             "1.3.6.1.5.5.7.3.3",
    942             "1.3.6.1.5.5.7.3.4",
    943             "1.3.6.1.5.5.7.3.8",
    944             "1.3.6.1.5.5.7.3.9",
    945             "1.3.6.1.5.5.7.3.5",
    946             "1.3.6.1.5.5.7.3.6"
    947         }));
    948         TestCert cert1 = new TestCert(ku1);
    949         TestCert cert2 = new TestCert(ku2);
    950 
    951         X509CertSelector selector = new X509CertSelector();
    952 
    953         selector.setExtendedKeyUsage(null);
    954         assertTrue("Any certificate should match in the case of null "
    955                    + "extendedKeyUsage criteria.",
    956                    selector.match(cert1)&& selector.match(cert2));
    957         selector.setExtendedKeyUsage(ku1);
    958         assertEquals(ku1, selector.getExtendedKeyUsage());
    959 
    960         selector.setExtendedKeyUsage(ku2);
    961         assertEquals(ku2, selector.getExtendedKeyUsage());
    962     }
    963 
    964     /**
    965      * java.security.cert.X509CertSelector#setIssuer(byte[])
    966      */
    967     public void test_setIssuerLB$() throws Exception {
    968         byte[] name1 = new byte[]
    969         // manually obtained DER encoding of "O=First Org." issuer name;
    970         { 48, 21, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10, 70, 105, 114, 115,
    971                 116, 32, 79, 114, 103, 46 };
    972         byte[] name2 = new byte[]
    973         // manually obtained DER encoding of "O=Second Org." issuer name;
    974         { 48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 10, 19, 11, 83, 101, 99, 111,
    975                 110, 100, 32, 79, 114, 103, 46 };
    976         X500Principal iss1 = new X500Principal(name1);
    977         X500Principal iss2 = new X500Principal(name2);
    978         TestCert cert1 = new TestCert(iss1);
    979         TestCert cert2 = new TestCert(iss2);
    980 
    981         X509CertSelector selector = new X509CertSelector();
    982 
    983         selector.setIssuer((byte[]) null);
    984         assertTrue("Any certificates should match "
    985                    + "in the case of null issuer criteria.", selector.match(cert1)
    986                    && selector.match(cert2));
    987         selector.setIssuer(name1);
    988         assertTrue("The certificate should match the selection criteria.",
    989                    selector.match(cert1));
    990         assertFalse("The certificate should not match the selection criteria.",
    991                     selector.match(cert2));
    992         selector.setIssuer(name2);
    993         assertTrue("The certificate should match the selection criteria.",
    994                    selector.match(cert2));
    995     }
    996 
    997     /**
    998      * java.security.cert.X509CertSelector#setIssuer(java.lang.String)
    999      */
   1000     public void test_setIssuerLjava_lang_String() throws Exception {
   1001 
   1002         String name1 = "O=First Org.";
   1003         String name2 = "O=Second Org.";
   1004         X500Principal iss1 = new X500Principal(name1);
   1005         X500Principal iss2 = new X500Principal(name2);
   1006         TestCert cert1 = new TestCert(iss1);
   1007         TestCert cert2 = new TestCert(iss2);
   1008 
   1009         X509CertSelector selector = new X509CertSelector();
   1010 
   1011         selector.setIssuer((String) null);
   1012         assertTrue("Any certificates should match "
   1013                    + "in the case of null issuer criteria.",
   1014                    selector.match(cert1) && selector.match(cert2));
   1015         selector.setIssuer(name1);
   1016         assertTrue("The certificate should match the selection criteria.",
   1017                    selector.match(cert1));
   1018         assertFalse("The certificate should not match the selection criteria.",
   1019                     selector.match(cert2));
   1020         selector.setIssuer(name2);
   1021         assertTrue("The certificate should match the selection criteria.",
   1022                    selector.match(cert2));
   1023     }
   1024 
   1025     /**
   1026      * java.security.cert.X509CertSelector#setIssuer(javax.security.auth.x500.X500Principal)
   1027      */
   1028     public void test_setIssuerLjavax_security_auth_x500_X500Principal()
   1029             throws Exception {
   1030         X500Principal iss1 = new X500Principal("O=First Org.");
   1031         X500Principal iss2 = new X500Principal("O=Second Org.");
   1032         TestCert cert1 = new TestCert(iss1);
   1033         TestCert cert2 = new TestCert(iss2);
   1034         X509CertSelector selector = new X509CertSelector();
   1035 
   1036         selector.setIssuer((X500Principal) null);
   1037         assertTrue("Any certificates should match "
   1038                    + "in the case of null issuer criteria.",
   1039                    selector.match(cert1) && selector.match(cert2));
   1040         selector.setIssuer(iss1);
   1041         assertTrue("The certificate should match the selection criteria.",
   1042                    selector.match(cert1));
   1043         assertFalse("The certificate should not match the selection criteria.",
   1044                     selector.match(cert2));
   1045         selector.setIssuer(iss2);
   1046         assertTrue("The certificate should match the selection criteria.",
   1047                    selector.match(cert2));
   1048     }
   1049 
   1050     /**
   1051      * java.security.cert.X509CertSelector#setKeyUsage(boolean)
   1052      */
   1053     public void test_setKeyUsageZ() throws Exception {
   1054         boolean[] ku1 = new boolean[] { true, true, true, true, true, true,
   1055                 true, true, true };
   1056         // decipherOnly is disallowed
   1057         boolean[] ku2 = new boolean[] { true, true, true, true, true, true,
   1058                 true, true, false };
   1059         TestCert cert1 = new TestCert(ku1);
   1060         TestCert cert2 = new TestCert(ku2);
   1061         TestCert cert3 = new TestCert((boolean[]) null);
   1062 
   1063         X509CertSelector selector = new X509CertSelector();
   1064 
   1065         selector.setKeyUsage(null);
   1066         assertTrue("Any certificate should match in the case of null keyUsage criteria.",
   1067                    selector.match(cert1) && selector.match(cert2));
   1068         selector.setKeyUsage(ku1);
   1069         assertTrue("The certificate should match the selection criteria.",
   1070                    selector.match(cert1));
   1071         assertFalse("The certificate should not match the selection criteria.",
   1072                     selector.match(cert2));
   1073         assertTrue("The certificate which does not have a keyUsage extension "
   1074                    + "implicitly allows all keyUsage values.",
   1075                    selector.match(cert3));
   1076         selector.setKeyUsage(ku2);
   1077         ku2[0] = !ku2[0];
   1078         assertTrue("The certificate should match the selection criteria.",
   1079                 selector.match(cert2));
   1080     }
   1081 
   1082     /**
   1083      * java.security.cert.X509CertSelector#setMatchAllSubjectAltNames(boolean)
   1084      */
   1085     public void test_setMatchAllSubjectAltNamesZ() {
   1086         TestCert cert = new TestCert();
   1087         X509CertSelector selector = new X509CertSelector();
   1088 
   1089         assertTrue(selector.match(cert));
   1090 
   1091         assertFalse(selector.match(null));
   1092     }
   1093 
   1094     /**
   1095      * java.security.cert.X509CertSelector#setNameConstraints(byte[]
   1096      *        bytes)
   1097      */
   1098     public void test_setNameConstraintsLB$() throws IOException {
   1099    // Used to generate following byte array
   1100 //    org.bouncycastle.asn1.x509.GeneralName[] name_constraints =
   1101 //        new org.bouncycastle.asn1.x509.GeneralName[] {
   1102 //              new org.bouncycastle.asn1.x509.GeneralName(1, "822.Name"),
   1103 //              new org.bouncycastle.asn1.x509.GeneralName(1, "rfc (at) 822.Name"),
   1104 //              new org.bouncycastle.asn1.x509.GeneralName(2, "Name.org"),
   1105 //              new org.bouncycastle.asn1.x509.GeneralName(2, "dNS.Name.org"),
   1106 //
   1107 //              new org.bouncycastle.asn1.x509.GeneralName(6, "Resource.Id"),
   1108 //              new org.bouncycastle.asn1.x509.GeneralName(6,
   1109 //                  "uniform.Resource.Id"),
   1110 //              new org.bouncycastle.asn1.x509.GeneralName(7, "1.1.1.1"),
   1111 //
   1112 //              new org.bouncycastle.asn1.x509.GeneralName(7,
   1113 //                  new org.bouncycastle.asn1.DEROctetString(new byte[] {
   1114 //                      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 })),
   1115 //        };
   1116 //
   1117 //      constraintBytes = new byte[name_constraints.length][];
   1118 //
   1119 //      for (int i = 0; i < name_constraints.length; i++) {
   1120 //        org.bouncycastle.asn1.x509.GeneralSubtree subtree =
   1121 //            new org.bouncycastle.asn1.x509.GeneralSubtree(
   1122 //                name_constraints[i]);
   1123 //        org.bouncycastle.asn1.x509.GeneralSubtree[] subtrees =
   1124 //            new org.bouncycastle.asn1.x509.GeneralSubtree[1];
   1125 //        subtrees[0] = subtree;
   1126 //        org.bouncycastle.asn1.x509.NameConstraints constraints =
   1127 //            new org.bouncycastle.asn1.x509.NameConstraints(
   1128 //                subtrees, subtrees);
   1129 //          constraintBytes[i] = constraints.getEncoded();
   1130 //      }
   1131 //      System.out.println("XXX"+Arrays.deepToString(constraintBytes)+"XXX");
   1132         X509CertSelector selector = new X509CertSelector();
   1133 
   1134         for (int i = 0; i < constraintBytes.length; i++) {
   1135             selector.setNameConstraints(constraintBytes[i]);
   1136             assertTrue(Arrays.equals(constraintBytes[i], selector.getNameConstraints()));
   1137         }
   1138     }
   1139 
   1140     /**
   1141      * java.security.cert.X509CertSelector#setPathToNames(Collection<List<?>>)
   1142      */
   1143     public void test_setPathToNamesLjava_util_Collection() throws Exception {
   1144         GeneralName san0 = new GeneralName(new OtherName(new ObjectIdentifier("1.2.3.4.5"),
   1145                                                          new byte[] { 1, 2, 0, 1 }));
   1146         GeneralName san1 = new GeneralName(new RFC822Name("rfc (at) 822.Name"));
   1147         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
   1148 
   1149         // http://b/27197633 (Missing replacement for ORAddress)
   1150         // GeneralName san3 = new GeneralName(new X400Address(new byte[8]));
   1151         GeneralName san4 = new GeneralName(new X500Name("O=Organization"));
   1152         GeneralName san6 = new GeneralName(new URIName("http://uniform.Resource.Id"));
   1153         GeneralName san7 = new GeneralName(new IPAddressName("1.1.1.1"));
   1154         GeneralName san8 = new GeneralName(new OIDName("1.2.3.4444.55555"));
   1155 
   1156         GeneralNames sans1 = new GeneralNames();
   1157         sans1.add(san0);
   1158         sans1.add(san1);
   1159         sans1.add(san2);
   1160 
   1161         // http://b/27197633 (Missing replacement for ORAddress)
   1162         // sans1.add(san3);
   1163         sans1.add(san4);
   1164         sans1.add(san6);
   1165         sans1.add(san7);
   1166         sans1.add(san8);
   1167         GeneralNames sans2 = new GeneralNames();
   1168         sans2.add(san0);
   1169 
   1170         TestCert cert1 = new TestCert(sans1);
   1171         TestCert cert2 = new TestCert(sans2);
   1172         X509CertSelector selector = new X509CertSelector();
   1173         selector.setMatchAllSubjectAltNames(true);
   1174 
   1175         selector.setPathToNames(null);
   1176         assertTrue("Any certificate should match in the case of null "
   1177                    + "subjectAlternativeNames criteria.",
   1178                    selector.match(cert1) && selector.match(cert2));
   1179 
   1180         Collection<List<?>> sans = getGeneralNamePairList(sans1);
   1181 
   1182         selector.setPathToNames(sans);
   1183         selector.getPathToNames();
   1184     }
   1185 
   1186     /**
   1187      * java.security.cert.X509CertSelector#setPolicy(Set<String>)
   1188      */
   1189     public void test_setPolicyLjava_util_Set() throws IOException {
   1190         String[] policies1 = new String[] {
   1191             "1.3.6.1.5.5.7.3.1",
   1192             "1.3.6.1.5.5.7.3.2",
   1193             "1.3.6.1.5.5.7.3.3",
   1194             "1.3.6.1.5.5.7.3.4",
   1195             "1.3.6.1.5.5.7.3.8",
   1196             "1.3.6.1.5.5.7.3.9",
   1197             "1.3.6.1.5.5.7.3.5",
   1198             "1.3.6.1.5.5.7.3.6",
   1199             "1.3.6.1.5.5.7.3.7"
   1200         };
   1201 
   1202         String[] policies2 = new String[] { "1.3.6.7.3.1" };
   1203 
   1204         HashSet<String> p1 = new HashSet<String>(Arrays.asList(policies1));
   1205         HashSet<String> p2 = new HashSet<String>(Arrays.asList(policies2));
   1206 
   1207         X509CertSelector selector = new X509CertSelector();
   1208 
   1209         TestCert cert1 = new TestCert(policies1);
   1210         TestCert cert2 = new TestCert(policies2);
   1211 
   1212         selector.setPolicy(null);
   1213         assertTrue("Any certificate should match in the case of null "
   1214                 + "privateKeyValid criteria.",
   1215                    selector.match(cert1) && selector.match(cert2));
   1216 
   1217         selector.setPolicy(p1);
   1218         assertTrue("The certificate should match the selection criteria.",
   1219                    selector.match(cert1));
   1220         assertFalse("The certificate should not match the selection criteria.",
   1221                     selector.match(cert2));
   1222 
   1223         selector.setPolicy(p2);
   1224         assertFalse("The certificate should not match the selection criteria.",
   1225                     selector.match(cert1));
   1226         assertTrue("The certificate should match the selection criteria.",
   1227                    selector.match(cert2));
   1228     }
   1229 
   1230     /**
   1231      * java.security.cert.X509CertSelector#setPrivateKeyValid(java.util.Date)
   1232      */
   1233     public void test_setPrivateKeyValidLjava_util_Date()
   1234             throws Exception {
   1235         Date date1 = new Date(100000000);
   1236         Date date2 = new Date(200000000);
   1237         Date date3 = new Date(300000000);
   1238         Date date4 = new Date(150000000);
   1239         Date date5 = new Date(250000000);
   1240         TestCert cert1 = new TestCert(date1, date2);
   1241         TestCert cert2 = new TestCert(date2, date3);
   1242 
   1243         X509CertSelector selector = new X509CertSelector();
   1244 
   1245         selector.setPrivateKeyValid(null);
   1246         assertTrue("Any certificate should match in the case of null "
   1247                 + "privateKeyValid criteria.",
   1248                    selector.match(cert1) && selector.match(cert2));
   1249         selector.setPrivateKeyValid(date4);
   1250         assertTrue("The certificate should match the selection criteria.",
   1251                    selector.match(cert1));
   1252         assertFalse("The certificate should not match the selection criteria.",
   1253                     selector.match(cert2));
   1254         selector.setPrivateKeyValid(date5);
   1255         date5.setTime(date4.getTime());
   1256         assertTrue("The certificate should match the selection criteria.",
   1257                    selector.match(cert2));
   1258     }
   1259 
   1260     /**
   1261      * java.security.cert.X509CertSelector#setSerialNumber(java.math.BigInteger)
   1262      */
   1263     public void test_setSerialNumberLjava_math_BigInteger()
   1264             throws Exception {
   1265         BigInteger ser1 = new BigInteger("10000");
   1266         BigInteger ser2 = new BigInteger("10001");
   1267         TestCert cert1 = new TestCert(ser1);
   1268         TestCert cert2 = new TestCert(ser2);
   1269         X509CertSelector selector = new X509CertSelector();
   1270 
   1271         selector.setSerialNumber(null);
   1272         assertTrue("Any certificate should match in the case of null "
   1273                    + "serialNumber criteria.",
   1274                    selector.match(cert1) && selector.match(cert2));
   1275         selector.setSerialNumber(ser1);
   1276         assertTrue("The certificate should match the selection criteria.",
   1277                    selector.match(cert1));
   1278         assertFalse("The certificate should not match the selection criteria.",
   1279                     selector.match(cert2));
   1280         selector.setSerialNumber(ser2);
   1281         assertTrue("The certificate should match the selection criteria.",
   1282                    selector.match(cert2));
   1283     }
   1284 
   1285     /**
   1286      * java.security.cert.X509CertSelector#setSubject(byte[])
   1287      */
   1288     public void test_setSubjectLB$() throws Exception {
   1289         byte[] name1 = new byte[]
   1290         // manually obtained DER encoding of "O=First Org." issuer name;
   1291         { 48, 21, 49, 19, 48, 17, 6, 3, 85, 4, 10, 19, 10, 70, 105, 114, 115,
   1292                 116, 32, 79, 114, 103, 46 };
   1293         byte[] name2 = new byte[]
   1294         // manually obtained DER encoding of "O=Second Org." issuer name;
   1295         { 48, 22, 49, 20, 48, 18, 6, 3, 85, 4, 10, 19, 11, 83, 101, 99, 111,
   1296                 110, 100, 32, 79, 114, 103, 46 };
   1297         X500Principal sub1 = new X500Principal(name1);
   1298         X500Principal sub2 = new X500Principal(name2);
   1299         TestCert cert1 = new TestCert(sub1);
   1300         TestCert cert2 = new TestCert(sub2);
   1301 
   1302         X509CertSelector selector = new X509CertSelector();
   1303 
   1304         selector.setSubject((byte[]) null);
   1305         assertTrue("Any certificates should match "
   1306                    + "in the case of null issuer criteria.",
   1307                    selector.match(cert1) && selector.match(cert2));
   1308         selector.setSubject(name1);
   1309         assertTrue("The certificate should match the selection criteria.",
   1310                    selector.match(cert1));
   1311         assertFalse("The certificate should not match the selection criteria.",
   1312                     selector.match(cert2));
   1313         selector.setSubject(name2);
   1314         assertTrue("The certificate should match the selection criteria.",
   1315                    selector.match(cert2));
   1316     }
   1317 
   1318     /**
   1319      * java.security.cert.X509CertSelector#setSubject(java.lang.String)
   1320      */
   1321     public void test_setSubjectLjava_lang_String() throws Exception {
   1322         String name1 = "O=First Org.";
   1323         String name2 = "O=Second Org.";
   1324         X500Principal sub1 = new X500Principal(name1);
   1325         X500Principal sub2 = new X500Principal(name2);
   1326         TestCert cert1 = new TestCert(sub1);
   1327         TestCert cert2 = new TestCert(sub2);
   1328         X509CertSelector selector = new X509CertSelector();
   1329 
   1330         selector.setSubject((String) null);
   1331         assertTrue("Any certificates should match "
   1332                    + "in the case of null subject criteria.",
   1333                    selector.match(cert1) && selector.match(cert2));
   1334         selector.setSubject(name1);
   1335         assertTrue("The certificate should match the selection criteria.",
   1336                    selector.match(cert1));
   1337         assertFalse("The certificate should not match the selection criteria.",
   1338                     selector.match(cert2));
   1339         selector.setSubject(name2);
   1340         assertTrue("The certificate should match the selection criteria.",
   1341                    selector.match(cert2));
   1342     }
   1343 
   1344     /**
   1345      * java.security.cert.X509CertSelector#setSubject(javax.security.auth.x500.X500Principal)
   1346      */
   1347     public void test_setSubjectLjavax_security_auth_x500_X500Principal()
   1348             throws Exception {
   1349         X500Principal sub1 = new X500Principal("O=First Org.");
   1350         X500Principal sub2 = new X500Principal("O=Second Org.");
   1351         TestCert cert1 = new TestCert(sub1);
   1352         TestCert cert2 = new TestCert(sub2);
   1353         X509CertSelector selector = new X509CertSelector();
   1354 
   1355         selector.setSubject((X500Principal) null);
   1356         assertTrue("Any certificates should match "
   1357                    + "in the case of null subjcet criteria.",
   1358                    selector.match(cert1) && selector.match(cert2));
   1359         selector.setSubject(sub1);
   1360         assertTrue("The certificate should match the selection criteria.",
   1361                    selector.match(cert1));
   1362         assertFalse("The certificate should not match the selection criteria.",
   1363                     selector.match(cert2));
   1364         selector.setSubject(sub2);
   1365         assertTrue("The certificate should match the selection criteria.",
   1366                    selector.match(cert2));
   1367     }
   1368 
   1369     /**
   1370      * java.security.cert.X509CertSelector#setSubjectAlternativeNames(Collection<List<?>>)
   1371      */
   1372     public void test_setSubjectAlternativeNamesLjava_util_Collection() throws Exception {
   1373 
   1374         GeneralName san0 = new GeneralName(new OtherName(new ObjectIdentifier("1.2.3.4.5"),
   1375                                                          new byte[] { 1, 2, 0, 1 }));
   1376         GeneralName san1 = new GeneralName(new RFC822Name("rfc (at) 822.Name"));
   1377         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
   1378 
   1379         // http://b/27197633 (Missing replacement for ORAddress)
   1380         // GeneralName san3 = new GeneralName(new X400Address((byte[])null));
   1381         GeneralName san4 = new GeneralName(new X500Name("O=Organization"));
   1382         GeneralName san6 = new GeneralName(new URIName("http://uniform.Resource.Id"));
   1383         GeneralName san7 = new GeneralName(new IPAddressName("1.1.1.1"));
   1384         GeneralName san8 = new GeneralName(new OIDName("1.2.3.4444.55555"));
   1385 
   1386         GeneralNames sans1 = new GeneralNames();
   1387         sans1.add(san0);
   1388         sans1.add(san1);
   1389         sans1.add(san2);
   1390 
   1391         // http://b/27197633 (Missing replacement for ORAddress)
   1392         // sans1.add(san3);
   1393         sans1.add(san4);
   1394         sans1.add(san6);
   1395         sans1.add(san7);
   1396         sans1.add(san8);
   1397         GeneralNames sans2 = new GeneralNames();
   1398         sans2.add(san0);
   1399 
   1400         TestCert cert1 = new TestCert(sans1);
   1401         TestCert cert2 = new TestCert(sans2);
   1402         X509CertSelector selector = new X509CertSelector();
   1403         selector.setMatchAllSubjectAltNames(true);
   1404 
   1405         selector.setSubjectAlternativeNames(null);
   1406         assertTrue("Any certificate should match in the case of null "
   1407                    + "subjectAlternativeNames criteria.",
   1408                    selector.match(cert1) && selector.match(cert2));
   1409 
   1410         Collection<List<?>> sans;
   1411         sans = getGeneralNamePairList(sans1);
   1412 
   1413         selector.setSubjectAlternativeNames(sans);
   1414 
   1415         selector.getSubjectAlternativeNames();
   1416     }
   1417 
   1418     /**
   1419      * java.security.cert.X509CertSelector#setSubjectKeyIdentifier(byte[])
   1420      */
   1421     public void test_setSubjectKeyIdentifierLB$() throws Exception {
   1422         byte[] skid1 = new byte[] { 1, 2, 3, 4, 5 }; // random value
   1423         byte[] skid2 = new byte[] { 5, 4, 3, 2, 1 }; // random value
   1424         TestCert cert1 = new TestCert(skid1);
   1425         TestCert cert2 = new TestCert(skid2);
   1426         X509CertSelector selector = new X509CertSelector();
   1427 
   1428         selector.setSubjectKeyIdentifier(null);
   1429         assertTrue("Any certificate should match in the case of null "
   1430                 + "serialNumber criteria.",
   1431                    selector.match(cert1) && selector.match(cert2));
   1432         selector.setSubjectKeyIdentifier(skid1);
   1433         assertTrue("The certificate should match the selection criteria.",
   1434                    selector.match(cert1));
   1435         assertFalse("The certificate should not match the selection criteria.",
   1436                     selector.match(cert2));
   1437         selector.setSubjectKeyIdentifier(skid2);
   1438         skid2[0]++;
   1439         assertTrue("The certificate should match the selection criteria.",
   1440                    selector.match(cert2));
   1441     }
   1442 
   1443     /**
   1444      * java.security.cert.X509CertSelector#setSubjectPublicKey(byte[])
   1445      */
   1446     public void test_setSubjectPublicKeyLB$() throws Exception {
   1447 
   1448         //SubjectPublicKeyInfo  ::=  SEQUENCE  {
   1449         //    algorithm            AlgorithmIdentifier,
   1450         //    subjectPublicKey     BIT STRING  }
   1451         byte[] enc = { 0x30, 0x0E, // SEQUENCE
   1452                 0x30, 0x07, // SEQUENCE
   1453                 0x06, 0x02, 0x03, 0x05,//OID
   1454                 0x01, 0x01, 0x07, //ANY
   1455                 0x03, 0x03, 0x01, 0x01, 0x06, // subjectPublicKey
   1456         };
   1457 
   1458         X509CertSelector selector = new X509CertSelector();
   1459 
   1460         selector.setSubjectPublicKey(enc);
   1461         PublicKey key = selector.getSubjectPublicKey();
   1462         assertEquals("0.3.5", key.getAlgorithm());
   1463         assertEquals("X.509", key.getFormat());
   1464         assertTrue(Arrays.equals(enc, key.getEncoded()));
   1465         assertNotNull(key.toString());
   1466     }
   1467 
   1468     /**
   1469      * java.security.cert.X509CertSelector#setSubjectPublicKey(java.security.PublicKey key)
   1470      */
   1471     public void test_setSubjectPublicKeyLjava_security_PublicKey()
   1472             throws Exception {
   1473         PublicKey pkey1 = new TestKeyPair("RSA").getPublic();
   1474         PublicKey pkey2 = new TestKeyPair("DSA").getPublic();
   1475 
   1476         TestCert cert1 = new TestCert(pkey1);
   1477         TestCert cert2 = new TestCert(pkey2);
   1478         X509CertSelector selector = new X509CertSelector();
   1479 
   1480         selector.setSubjectPublicKey((PublicKey) null);
   1481         assertTrue("Any certificate should match in the case of null "
   1482                    + "subjectPublicKey criteria.",
   1483                    selector.match(cert1) && selector.match(cert2));
   1484         selector.setSubjectPublicKey(pkey1);
   1485         assertTrue("The certificate should match the selection criteria.",
   1486                    selector.match(cert1));
   1487         assertFalse("The certificate should not match the selection criteria.",
   1488                     selector.match(cert2));
   1489         selector.setSubjectPublicKey(pkey2);
   1490         assertTrue("The certificate should match the selection criteria.",
   1491                    selector.match(cert2));
   1492     }
   1493 
   1494     /**
   1495      * java.security.cert.X509CertSelector#setSubjectPublicKeyAlgID(java.lang.String)
   1496      */
   1497     public void test_setSubjectPublicKeyAlgIDLjava_lang_String() throws Exception {
   1498 
   1499         X509CertSelector selector = new X509CertSelector();
   1500         String pkaid1 = "1.2.840.113549.1.1.1"; // RSA (source:
   1501         // http://asn1.elibel.tm.fr)
   1502         String pkaid2 = "1.2.840.10040.4.1"; // DSA (source:
   1503         // http://asn1.elibel.tm.fr)
   1504         PublicKey pkey1 = new TestKeyPair("RSA").getPublic();;
   1505         PublicKey pkey2 = new TestKeyPair("DSA").getPublic();;
   1506 
   1507         TestCert cert1 = new TestCert(pkey1);
   1508         TestCert cert2 = new TestCert(pkey2);
   1509 
   1510         selector.setSubjectPublicKeyAlgID(null);
   1511         assertTrue("Any certificate should match in the case of null "
   1512                    + "subjectPublicKeyAlgID criteria.",
   1513                    selector.match(cert1) && selector.match(cert2));
   1514 
   1515         String[] validOIDs = {
   1516             "0.0.20",
   1517             "1.25.0",
   1518             "2.0.39",
   1519             "0.2.10",
   1520             "1.35.15",
   1521             "2.17.89",
   1522             "2.5.29.16",
   1523             "2.5.29.17",
   1524             "2.5.29.30",
   1525             "2.5.29.32",
   1526             "2.5.29.37"
   1527         };
   1528 
   1529         for (int i = 0; i < validOIDs.length; i++) {
   1530             selector.setSubjectPublicKeyAlgID(validOIDs[i]);
   1531             assertEquals(validOIDs[i], selector.getSubjectPublicKeyAlgID());
   1532         }
   1533 
   1534         String[] invalidOIDs = { "3.20", "1.40", "3.10" };
   1535         for (int i = 0; i < invalidOIDs.length; i++) {
   1536             try {
   1537                 selector.setSubjectPublicKeyAlgID(invalidOIDs[i]);
   1538                 fail("IOException wasn't thrown for " + invalidOIDs[i]);
   1539             } catch (IOException expected) {
   1540             }
   1541         }
   1542 
   1543         selector.setSubjectPublicKeyAlgID(pkaid1);
   1544         assertTrue("The certificate should match the selection criteria.",
   1545                    selector.match(cert1));
   1546         assertFalse("The certificate should not match the selection criteria.",
   1547                     selector.match(cert2));
   1548         selector.setSubjectPublicKeyAlgID(pkaid2);
   1549         assertTrue("The certificate should match the selection criteria.",
   1550                    selector.match(cert2));
   1551     }
   1552 
   1553     /**
   1554      * java.security.cert.X509CertSelector#toString()
   1555      */
   1556     public void test_toString() {
   1557         X509CertSelector selector = new X509CertSelector();
   1558         assertNotNull(selector.toString());
   1559     }
   1560 
   1561     public class MyPublicKey implements PublicKey {
   1562         private static final long serialVersionUID = 2899528375354645752L;
   1563 
   1564         public MyPublicKey() {
   1565             super();
   1566         }
   1567 
   1568         public String getAlgorithm() {
   1569             return "PublicKey";
   1570         }
   1571 
   1572         public String getFormat() {
   1573             return "Format";
   1574         }
   1575 
   1576         public byte[] getEncoded() {
   1577             return new byte[0];
   1578         }
   1579 
   1580         public long getSerVerUID() {
   1581             return serialVersionUID;
   1582         }
   1583     }
   1584 
   1585     private class TestCert extends X509Certificate {
   1586 
   1587         private static final long serialVersionUID = 176676115254260405L;
   1588 
   1589         /* Stuff fields */
   1590         protected String equalCriteria = null; // to simplify method equals()
   1591 
   1592         protected BigInteger serialNumber = null;
   1593 
   1594         protected X500Principal issuer = null;
   1595 
   1596         protected X500Principal subject = null;
   1597 
   1598         protected byte[] keyIdentifier = null;
   1599 
   1600         protected Date date = null;
   1601 
   1602         protected Date notBefore = null;
   1603 
   1604         protected Date notAfter = null;
   1605 
   1606         protected PublicKey key = null;
   1607 
   1608         protected boolean[] keyUsage = null;
   1609 
   1610         protected List<String> extKeyUsage = null;
   1611 
   1612         protected int pathLen = 1;
   1613 
   1614         protected GeneralNames sans = null;
   1615 
   1616         protected byte[] encoding = null;
   1617 
   1618         protected String[] policies = null;
   1619 
   1620         protected Collection<List<?>> collection = null;
   1621 
   1622         /* Stuff methods */
   1623         public TestCert() {
   1624         }
   1625 
   1626         public TestCert(GeneralNames sans) {
   1627             setSubjectAlternativeNames(sans);
   1628         }
   1629 
   1630         public TestCert(Collection<List<?>> collection) {
   1631             setCollection(collection);
   1632         }
   1633 
   1634         public TestCert(String equalCriteria) {
   1635             setEqualCriteria(equalCriteria);
   1636         }
   1637 
   1638         public TestCert(String[] policies) {
   1639             setPolicies(policies);
   1640         }
   1641 
   1642         public TestCert(BigInteger serial) {
   1643             setSerialNumber(serial);
   1644         }
   1645 
   1646         public TestCert(X500Principal principal) {
   1647             setIssuer(principal);
   1648             setSubject(principal);
   1649         }
   1650 
   1651         public TestCert(byte[] array) {
   1652             setKeyIdentifier(array);
   1653         }
   1654 
   1655         public TestCert(Date date) {
   1656             setDate(date);
   1657         }
   1658 
   1659         public TestCert(Date notBefore, Date notAfter) {
   1660             setPeriod(notBefore, notAfter);
   1661         }
   1662 
   1663         public TestCert(PublicKey key) {
   1664             setPublicKey(key);
   1665         }
   1666 
   1667         public TestCert(boolean[] keyUsage) {
   1668             setKeyUsage(keyUsage);
   1669         }
   1670 
   1671         public TestCert(Set<String> extKeyUsage) {
   1672             setExtendedKeyUsage(extKeyUsage);
   1673         }
   1674 
   1675         public TestCert(int pathLen) {
   1676             this.pathLen = pathLen;
   1677         }
   1678 
   1679         public void setSubjectAlternativeNames(GeneralNames sans) {
   1680             this.sans = sans;
   1681         }
   1682 
   1683         public void setCollection(Collection<List<?>> collection) {
   1684             this.collection = collection;
   1685         }
   1686 
   1687         public void setPolicies(String[] policies) {
   1688             this.policies = policies;
   1689         }
   1690 
   1691         public void setExtendedKeyUsage(Set<String> extKeyUsage) {
   1692             this.extKeyUsage = (extKeyUsage == null) ? null : new ArrayList<String>(extKeyUsage);
   1693         }
   1694 
   1695         public void setKeyUsage(boolean[] keyUsage) {
   1696             this.keyUsage = (keyUsage == null) ? null : (boolean[]) keyUsage.clone();
   1697         }
   1698 
   1699         public void setPublicKey(PublicKey key) {
   1700             this.key = key;
   1701         }
   1702 
   1703         public void setPeriod(Date notBefore, Date notAfter) {
   1704             this.notBefore = notBefore;
   1705             this.notAfter = notAfter;
   1706         }
   1707 
   1708         public void setSerialNumber(BigInteger serial) {
   1709             this.serialNumber = serial;
   1710         }
   1711 
   1712         public void setEqualCriteria(String equalCriteria) {
   1713             this.equalCriteria = equalCriteria;
   1714         }
   1715 
   1716         public void setIssuer(X500Principal issuer) {
   1717             this.issuer = issuer;
   1718         }
   1719 
   1720         public void setSubject(X500Principal subject) {
   1721             this.subject = subject;
   1722         }
   1723 
   1724         public void setKeyIdentifier(byte[] subjectKeyID) {
   1725             this.keyIdentifier = (byte[]) subjectKeyID.clone();
   1726         }
   1727 
   1728         public void setDate(Date date) {
   1729             this.date = new Date(date.getTime());
   1730         }
   1731 
   1732         public void setEncoding(byte[] encoding) {
   1733             this.encoding = encoding;
   1734         }
   1735 
   1736         /* Method implementations */
   1737         public boolean equals(Object cert) {
   1738             if (cert == null) {
   1739                 return false;
   1740             }
   1741             if ((equalCriteria == null)
   1742                     || (((TestCert) cert).equalCriteria == null)) {
   1743                 return false;
   1744             } else {
   1745                 return equalCriteria.equals(((TestCert) cert).equalCriteria);
   1746             }
   1747         }
   1748 
   1749         public String toString() {
   1750             if (equalCriteria != null) {
   1751                 return equalCriteria;
   1752             }
   1753             return "";
   1754         }
   1755 
   1756         public void checkValidity() throws CertificateExpiredException,
   1757                 CertificateNotYetValidException {
   1758         }
   1759 
   1760         public void checkValidity(Date date)
   1761                 throws CertificateExpiredException,
   1762                 CertificateNotYetValidException {
   1763             if (this.date == null) {
   1764                 throw new CertificateExpiredException();
   1765             }
   1766             int result = this.date.compareTo(date);
   1767             if (result > 0) {
   1768                 throw new CertificateExpiredException();
   1769             }
   1770             if (result < 0) {
   1771                 throw new CertificateNotYetValidException();
   1772             }
   1773         }
   1774 
   1775         public int getVersion() {
   1776             return 3;
   1777         }
   1778 
   1779         public BigInteger getSerialNumber() {
   1780             return (serialNumber == null) ? new BigInteger("1111")
   1781                     : serialNumber;
   1782         }
   1783 
   1784         public Principal getIssuerDN() {
   1785             return issuer;
   1786         }
   1787 
   1788         public X500Principal getIssuerX500Principal() {
   1789             return issuer;
   1790         }
   1791 
   1792         public Principal getSubjectDN() {
   1793             return subject;
   1794         }
   1795 
   1796         public X500Principal getSubjectX500Principal() {
   1797             return subject;
   1798         }
   1799 
   1800         public Date getNotBefore() {
   1801             return null;
   1802         }
   1803 
   1804         public Date getNotAfter() {
   1805             return null;
   1806         }
   1807 
   1808         public byte[] getTBSCertificate() throws CertificateEncodingException {
   1809             return null;
   1810         }
   1811 
   1812         public byte[] getSignature() {
   1813             return null;
   1814         }
   1815 
   1816         public String getSigAlgName() {
   1817             return null;
   1818         }
   1819 
   1820         public String getSigAlgOID() {
   1821             return null;
   1822         }
   1823 
   1824         public byte[] getSigAlgParams() {
   1825             return null;
   1826         }
   1827 
   1828         public boolean[] getIssuerUniqueID() {
   1829             return null;
   1830         }
   1831 
   1832         public boolean[] getSubjectUniqueID() {
   1833             return null;
   1834         }
   1835 
   1836         public boolean[] getKeyUsage() {
   1837             return keyUsage;
   1838         }
   1839 
   1840         public List<String> getExtendedKeyUsage()
   1841                 throws CertificateParsingException {
   1842             return extKeyUsage;
   1843         }
   1844 
   1845         public int getBasicConstraints() {
   1846             return pathLen;
   1847         }
   1848 
   1849         public void verify(PublicKey key) throws CertificateException,
   1850                 NoSuchAlgorithmException, InvalidKeyException,
   1851                 NoSuchProviderException, SignatureException {
   1852         }
   1853 
   1854         public void verify(PublicKey key, String sigProvider)
   1855                 throws CertificateException, NoSuchAlgorithmException,
   1856                 InvalidKeyException, NoSuchProviderException,
   1857                 SignatureException {
   1858         }
   1859 
   1860         public PublicKey getPublicKey() {
   1861             return key;
   1862         }
   1863 
   1864         public byte[] getEncoded() throws CertificateEncodingException {
   1865             return encoding;
   1866         }
   1867 
   1868         public Set<String> getNonCriticalExtensionOIDs() {
   1869             return null;
   1870         }
   1871 
   1872         public Set<String> getCriticalExtensionOIDs() {
   1873             return null;
   1874         }
   1875 
   1876         public byte[] getExtensionValue (String oid) {
   1877            if (("2.5.29.14".equals(oid)) || ("2.5.29.35".equals(oid))) {
   1878                 try {
   1879                     DerOutputStream out = new DerOutputStream();
   1880                     out.putOctetString(keyIdentifier);
   1881                     return out.toByteArray();
   1882                 } catch (IOException e) {
   1883                     throw new IllegalStateException("Unexpected IOException" , e);
   1884                 }
   1885             }
   1886             if ("2.5.29.16".equals(oid)) {
   1887                 try {
   1888                     DerOutputStream outputStream = new DerOutputStream();
   1889                     outputStream.putOctetString(new PrivateKeyUsageExtension(notBefore, notAfter).getExtensionValue());
   1890                     return outputStream.toByteArray();
   1891                 } catch (IOException e) {
   1892                     throw new IllegalStateException("Unexpected IOException", e);
   1893                 }
   1894             }
   1895             if ("2.5.29.17".equals(oid) && (sans != null)) {
   1896                 if (sans.names() == null) {
   1897                     return null;
   1898                 }
   1899                 try {
   1900                     DerOutputStream outputStream = new DerOutputStream();
   1901                     outputStream.putOctetString(new SubjectAlternativeNameExtension(sans).getExtensionValue());
   1902                     return outputStream.toByteArray();
   1903                 } catch (IOException e) {
   1904                     throw new IllegalStateException("Unexpected IOException", e);
   1905                 }
   1906             }
   1907             if ("2.5.29.32".equals(oid) && (policies != null)
   1908                     && (policies.length > 0)) {
   1909                 try {
   1910                     List<PolicyInformation> policyInformations = new ArrayList();
   1911 
   1912                     for (String p : policies) {
   1913                         policyInformations.add(new PolicyInformation(new CertificatePolicyId(new ObjectIdentifier(p)), Collections.EMPTY_SET));
   1914                     }
   1915                     DerOutputStream outputStream = new DerOutputStream();
   1916                     outputStream.putOctetString(new CertificatePoliciesExtension(policyInformations).getExtensionValue());
   1917                     return outputStream.toByteArray();
   1918                 } catch (IOException e) {
   1919                     throw new IllegalStateException("Unexpected IOException", e);
   1920                 }
   1921             }
   1922 
   1923             if ("2.5.29.30".equals(oid)) {
   1924                 throw new IllegalStateException("2.5.29.30");
   1925             }
   1926 
   1927             if ("2.5.29.19".equals(oid)) {
   1928                 throw new IllegalStateException("2.5.29.30");
   1929             }
   1930 
   1931             if (("2.5.29.37".equals(oid)) && (extKeyUsage != null)) {
   1932                 throw new IllegalStateException("2.5.29.37");
   1933             }
   1934             return null;
   1935         }
   1936 
   1937         public boolean hasUnsupportedCriticalExtension() {
   1938             return false;
   1939         }
   1940 
   1941     }
   1942 
   1943     public X509Certificate rootCertificate;
   1944 
   1945     public X509Certificate endCertificate;
   1946 
   1947     public MyCRL crl;
   1948 
   1949     private X509CertSelector theCertSelector;
   1950 
   1951     private CertPathBuilder builder;
   1952 
   1953     private void setupEnvironment() throws Exception {
   1954         // create certificates and CRLs
   1955         CertificateFactory cf = CertificateFactory.getInstance("X.509");
   1956         ByteArrayInputStream bi = new ByteArrayInputStream(TestUtils.rootCert.getBytes());
   1957         rootCertificate = (X509Certificate) cf.generateCertificate(bi);
   1958         bi = new ByteArrayInputStream(TestUtils.endCert.getBytes());
   1959         endCertificate = (X509Certificate) cf.generateCertificate(bi);
   1960 
   1961         BigInteger revokedSerialNumber = BigInteger.valueOf(1);
   1962         crl = new MyCRL("X.509");
   1963 //        X509CRL rootCRL = X509CRL;
   1964 //        X509CRL interCRL = X509CRLExample.createCRL(interCert,
   1965 //                                                    interPair.getPrivate(),
   1966 //                                                    revokedSerialNumber);
   1967 
   1968         // create CertStore to support path building
   1969         List<Object> list = new ArrayList<Object>();
   1970 
   1971         list.add(rootCertificate);
   1972         list.add(endCertificate);
   1973 
   1974 //        CollectionCertStoreParameters params = new CollectionCertStoreParameters(list);
   1975 //        CertStore store = CertStore.getInstance("Collection", params);
   1976 //
   1977         theCertSelector = new X509CertSelector();
   1978         theCertSelector.setCertificate(endCertificate);
   1979         theCertSelector.setIssuer(endCertificate.getIssuerX500Principal().getEncoded());
   1980 
   1981         // build the path
   1982         builder = CertPathBuilder.getInstance("PKIX");
   1983 
   1984     }
   1985 
   1986     private CertPath buildCertPath() throws InvalidAlgorithmParameterException {
   1987         PKIXCertPathBuilderResult result = null;
   1988         PKIXBuilderParameters buildParams = new PKIXBuilderParameters(
   1989                 Collections.singleton(new TrustAnchor(rootCertificate, null)),
   1990                 theCertSelector);
   1991         try {
   1992         result = (PKIXCertPathBuilderResult) builder.build(buildParams);
   1993         } catch(CertPathBuilderException e) {
   1994             return null;
   1995         }
   1996         return result.getCertPath();
   1997     }
   1998 
   1999     /**
   2000      * java.security.cert.X509CertSelector#addPathToName(int, byte[])
   2001      */
   2002     public void test_addPathToNameLintLbyte_array2() throws Exception {
   2003         TestUtils.initCertPathSSCertChain();
   2004         setupEnvironment();
   2005         byte[] bytes, bytesName;
   2006         // GeneralName name = new GeneralName(1, "822.Name");
   2007         // bytes = name.getEncoded();
   2008         // bytesName = name.getEncodedName();
   2009         bytes = new byte[] {-127, 8, 56, 50, 50, 46, 78, 97, 109, 101};
   2010         bytesName = new byte[] {22, 8, 56, 50, 50, 46, 78, 97, 109, 101};
   2011         bytes[bytes.length-3] = (byte) 200;
   2012 
   2013         try {
   2014             theCertSelector.addPathToName(1, bytes);
   2015         } catch (IOException e) {
   2016             // ok
   2017         }
   2018 
   2019         theCertSelector.setPathToNames(null);
   2020 
   2021         theCertSelector.addPathToName(1, bytesName);
   2022         assertNotNull(theCertSelector.getPathToNames());
   2023         CertPath p = buildCertPath();
   2024         assertNull(p);
   2025 
   2026         theCertSelector.setPathToNames(null);
   2027 
   2028 //        name = new GeneralName(new Name("O=Android"));
   2029 //        theCertSelector.addPathToName(4, endCertificate.getSubjectDN().getName());
   2030         theCertSelector.addPathToName(4, TestUtils.rootCertificateSS.getIssuerX500Principal().getEncoded());
   2031         assertNotNull(theCertSelector.getPathToNames());
   2032         p = TestUtils.buildCertPathSSCertChain();
   2033         assertNotNull(p);
   2034     }
   2035 
   2036     /**
   2037      * java.security.cert.X509CertSelector#addPathToName(int, String)
   2038      */
   2039     public void test_addPathToNameLintLjava_lang_String2() throws Exception {
   2040         setupEnvironment();
   2041         byte[] bytes, bytesName;
   2042         // GeneralName name = new GeneralName(1, "822.Name");
   2043         // bytes = name.getEncoded();
   2044         // bytesName = name.getEncodedName();
   2045         bytes = new byte[] {-127, 8, 56, 50, 50, 46, 78, 97, 109, 101};
   2046         bytesName = new byte[] {22, 8, 56, 50, 50, 46, 78, 97, 109, 101};
   2047         assertNotNull(bytes);
   2048         byte[] b = new byte[bytes.length];
   2049         b = bytes;
   2050         b[bytes.length-3] = (byte) 200;
   2051 
   2052         try {
   2053         theCertSelector.addPathToName(1, new String(b));
   2054         } catch (IOException e) {
   2055             // ok
   2056         }
   2057 
   2058         theCertSelector.setPathToNames(null);
   2059 
   2060         theCertSelector.addPathToName(1, new String(bytesName));
   2061         assertNotNull(theCertSelector.getPathToNames());
   2062 
   2063         CertPath p = buildCertPath();
   2064         assertNull(p);
   2065 
   2066         theCertSelector.setPathToNames(null);
   2067         theCertSelector.addPathToName(1, rootCertificate.getIssuerX500Principal().getName());
   2068         assertNotNull(theCertSelector.getPathToNames());
   2069         //p = buildCertPath();
   2070         //assertNotNull(p);
   2071     }
   2072 
   2073     /**
   2074      * java.security.cert.X509CertSelector#addSubjectAlternativeName(int, byte[])
   2075      */
   2076     public void test_addSubjectAlternativeNameLintLbyte_array2()
   2077             throws Exception {
   2078 
   2079 
   2080         GeneralName san0 = new GeneralName(new OtherName(new ObjectIdentifier("1.2.3.4.5"),
   2081                 new byte[] {1, 2, 0, 1}));
   2082         GeneralName san1 = new GeneralName(new RFC822Name("rfc (at) 822.Name"));
   2083         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
   2084 
   2085         GeneralNames sans1 = new GeneralNames();
   2086         sans1.add(san0);
   2087         sans1.add(san1);
   2088         sans1.add(san2);
   2089 
   2090         X509CertSelector selector = new X509CertSelector();
   2091 
   2092         DerOutputStream out0 = new DerOutputStream();
   2093         san0.getName().encode(out0);
   2094         selector.addSubjectAlternativeName(0, out0.toByteArray());
   2095 
   2096         DerOutputStream out1 = new DerOutputStream();
   2097         san1.getName().encode(out1);
   2098         selector.addSubjectAlternativeName(1, out1.toByteArray());
   2099 
   2100         DerOutputStream out2 = new DerOutputStream();
   2101         san2.getName().encode(out2);
   2102         selector.addSubjectAlternativeName(2, out2.toByteArray());
   2103 
   2104         GeneralNames sans2 = new GeneralNames();
   2105         sans2.add(san0);
   2106 
   2107         TestCert cert1 = new TestCert(sans1);
   2108         TestCert cert2 = new TestCert(sans2);
   2109 
   2110         assertTrue(selector.match(cert1));
   2111         assertFalse(selector.match(cert2));
   2112 
   2113         selector.setSubjectAlternativeNames(null);
   2114 
   2115         GeneralName name = new GeneralName(new X500Name("O=Android"));
   2116         try (DerOutputStream outputStream = new DerOutputStream()){
   2117             name.encode(outputStream);
   2118             selector.addSubjectAlternativeName(0, outputStream.toByteArray());
   2119         } catch (IOException e) {
   2120             // ok
   2121         }
   2122     }
   2123 
   2124     /**
   2125      * java.security.cert.X509CertSelector#addSubjectAlternativeName(int, String)
   2126      */
   2127     public void test_addSubjectAlternativeNameLintLjava_lang_String2() throws Exception{
   2128         GeneralName san6 = new GeneralName(new URIName("http://uniform.Resource.Id"));
   2129         GeneralName san2 = new GeneralName(new DNSName("dNSName"));
   2130 
   2131         GeneralNames sans1 = new GeneralNames();
   2132         sans1.add(san6);
   2133         sans1.add(san2);
   2134 
   2135         X509CertSelector selector = new X509CertSelector();
   2136 
   2137         selector.addSubjectAlternativeName(6, "http://uniform.Resource.Id");
   2138         selector.addSubjectAlternativeName(2, "dNSName");
   2139 
   2140         GeneralNames sans2 = new GeneralNames();
   2141         sans2.add(san2);
   2142 
   2143         TestCert cert1 = new TestCert(sans1);
   2144         TestCert cert2 = new TestCert(sans2);
   2145 
   2146         assertTrue(selector.match(cert1));
   2147         assertFalse(selector.match(cert2));
   2148 
   2149         selector.setSubjectAlternativeNames(null);
   2150 
   2151         GeneralName name = new GeneralName(new X500Name("O=Android"));
   2152         try {
   2153             selector.addSubjectAlternativeName(0, (name.toString()));
   2154         } catch (IOException e) {
   2155             // ok
   2156         }
   2157     }
   2158 
   2159     Collection<List<?>> getGeneralNamePairList(GeneralNames generalNames)
   2160             throws IOException {
   2161         Collection<List<?>> sans = new ArrayList<>();
   2162         for (GeneralName gn : generalNames.names()) {
   2163             ArrayList<Object> gnList = new ArrayList<>();
   2164             gnList.add(gn.getType());
   2165             switch (gn.getType()) {
   2166                 case GeneralNameInterface.NAME_ANY:
   2167                     try (DerOutputStream outputStream = new DerOutputStream()) {
   2168                         gn.getName().encode(outputStream);
   2169                         gnList.add(outputStream.toByteArray());
   2170                     }
   2171                     break;
   2172 
   2173                 case GeneralNameInterface.NAME_RFC822:
   2174                     gnList.add(((RFC822Name) gn.getName()).getName());
   2175                     break;
   2176 
   2177                 case GeneralNameInterface.NAME_DNS:
   2178                     gnList.add(((DNSName) gn.getName()).getName());
   2179                     break;
   2180 
   2181                 case GeneralNameInterface.NAME_X400:
   2182                     try (DerOutputStream outputStream = new DerOutputStream()) {
   2183                         gn.getName().encode(outputStream);
   2184                         gnList.add(outputStream.toByteArray());
   2185                     }
   2186                     break;
   2187 
   2188                 case GeneralNameInterface.NAME_URI:
   2189                     gnList.add(((URIName) gn.getName()).getName());
   2190                     break;
   2191 
   2192                 case GeneralNameInterface.NAME_IP:
   2193                     gnList.add(((IPAddressName) gn.getName()).getName());
   2194                     break;
   2195 
   2196                 case GeneralNameInterface.NAME_OID:
   2197                     gnList.add(((OIDName) gn.getName()).getOID().toString());
   2198                     break;
   2199 
   2200                 case GeneralNameInterface.NAME_DIRECTORY:
   2201                     gnList.add(((X500Name) gn.getName()).getName());
   2202                     break;
   2203 
   2204                 case GeneralNameInterface.NAME_EDI:
   2205                     gnList.add(((EDIPartyName) gn.getName()).getPartyName());
   2206                     break;
   2207 
   2208                 default:
   2209                     throw new IOException("Unrecognized GeneralName tag, ("
   2210                             + gn.getType() + ")");
   2211             }
   2212             sans.add(gnList);
   2213         }
   2214         return sans;
   2215     }
   2216 }
   2217