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