• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 /**
19 * @author Vladimir N. Molotkov
20 * @version $Revision$
21 */
22 
23 package org.apache.harmony.security.tests.support.cert;
24 
25 import tests.support.resource.Support_Resources;
26 
27 import java.io.BufferedInputStream;
28 import java.io.ByteArrayInputStream;
29 import java.io.IOException;
30 import java.math.BigInteger;
31 import java.security.InvalidAlgorithmParameterException;
32 import java.security.KeyStore;
33 import java.security.NoSuchAlgorithmException;
34 import java.security.cert.CertPath;
35 import java.security.cert.CertPathBuilder;
36 import java.security.cert.CertPathParameters;
37 import java.security.cert.CertPathValidatorException;
38 import java.security.cert.CertStore;
39 import java.security.cert.Certificate;
40 import java.security.cert.CertificateException;
41 import java.security.cert.CertificateFactory;
42 import java.security.cert.CollectionCertStoreParameters;
43 import java.security.cert.PKIXBuilderParameters;
44 import java.security.cert.PKIXCertPathChecker;
45 import java.security.cert.PolicyNode;
46 import java.security.cert.PolicyQualifierInfo;
47 import java.security.cert.TrustAnchor;
48 import java.security.cert.X509CertSelector;
49 import java.security.cert.X509Certificate;
50 import java.util.ArrayList;
51 import java.util.Collection;
52 import java.util.Collections;
53 import java.util.HashSet;
54 import java.util.Iterator;
55 import java.util.List;
56 import java.util.Set;
57 
58 /**
59  * java.security.cert test utilities
60  *
61  */
62 public class TestUtils {
63     // Certificate type used during testing
64     private static final String certType = "X.509";
65     // Key store type used during testing
66     private static final String keyStoreType = "BKS";
67     // The file name prefix to load keystore from
68     private static final String keyStoreFileName = "test." + keyStoreType
69             + ".ks";
70     //
71     // The file name suffixes to load keystore from
72     //  *.ks1 - keystore containing untrusted certificates only
73     //  *.ks2 - keystore containing trusted certificates only
74     //  *.ks3 - keystore containing both trusted and untrusted certificates
75     //
76     public static final int UNTRUSTED = 1;
77     public static final int TRUSTED = 2;
78     public static final int TRUSTED_AND_UNTRUSTED = 3;
79     //
80     // Common passwords for all test keystores
81     //
82     private final static char[] storepass =
83         new char[] {'s','t','o','r','e','p','w','d'};
84 
85     /**
86      * Creates <code>TrustAnchor</code> instance
87      * constructed using self signed test certificate
88      *
89      * @return <code>TrustAnchor</code> instance
90      */
getTrustAnchor()91     public static TrustAnchor getTrustAnchor() {
92         CertificateFactory cf = null;
93         try {
94             cf = CertificateFactory.getInstance(certType);
95         } catch (CertificateException e) {
96             // requested cert type is not available in the
97             // default provider package or any of the other provider packages
98             // that were searched
99             throw new RuntimeException(e);
100         }
101         BufferedInputStream bis = null;
102         try {
103             bis = new BufferedInputStream(new ByteArrayInputStream(
104                     getEncodedX509Certificate()));
105             X509Certificate c1 = (X509Certificate)cf.generateCertificate(bis);
106 
107             return new TrustAnchor(c1, null);
108         } catch (Exception e) {
109             // all failures are fatal
110             throw new RuntimeException(e);
111         } finally {
112             if (bis != null) {
113                 try {
114                     bis.close() ;
115                 } catch (IOException ign) {}
116             }
117         }
118     }
119 
120     /**
121      * Creates <code>Set</code> of <code>TrustAnchor</code>s
122      * containing single element (self signed test certificate).
123      * @return Returns <code>Set</code> of <code>TrustAnchor</code>s
124      */
getTrustAnchorSet()125     public static Set<TrustAnchor> getTrustAnchorSet() {
126         TrustAnchor ta = getTrustAnchor();
127         if (ta == null) {
128             return null;
129         }
130         HashSet<TrustAnchor> set = new HashSet<TrustAnchor>();
131         if (!set.add(ta)) {
132             throw new RuntimeException("Could not create trust anchor set");
133         }
134         return set;
135     }
136 
137     /**
138      * Creates test <code>KeyStore</code> instance
139      *
140      * @param initialize
141      *  Do not initialize returned <code>KeyStore</code> if false
142      *
143      * @param testKeyStoreType
144      *  this parameter ignored if <code>initialize</code> is false;
145      *  The following types supported:<br>
146      *  1 - <code>KeyStore</code> with untrusted certificates only<br>
147      *  2 - <code>KeyStore</code> with trusted certificates only<br>
148      *  3 - <code>KeyStore</code> with both trusted and untrusted certificates
149      *
150      * @return Returns test <code>KeyStore</code> instance
151      */
getKeyStore(boolean initialize, int testKeyStoreType)152     public static KeyStore getKeyStore(boolean initialize,
153             int testKeyStoreType) {
154         BufferedInputStream bis = null;
155         try {
156             KeyStore ks = KeyStore.getInstance(keyStoreType);
157             if (initialize) {
158                 String fileName = keyStoreFileName + testKeyStoreType;
159                 ks.load(Support_Resources.getResourceStream(fileName),
160                         storepass);
161             }
162             return ks;
163         } catch (Exception e) {
164             throw new RuntimeException(e);
165         } finally {
166             if (initialize && bis != null) {
167                 try {
168                     bis.close();
169                 } catch (IOException ign) {}
170             }
171         }
172     }
173 
174     /**
175      * Creates <code>List</code> of <code>CollectionCertStores</code>
176      *
177      * @return The list created
178      *
179      * @throws InvalidAlgorithmParameterException
180      * @throws NoSuchAlgorithmException
181      */
getCollectionCertStoresList()182     public static List<CertStore> getCollectionCertStoresList()
183         throws InvalidAlgorithmParameterException,
184                NoSuchAlgorithmException {
185         CertStore cs = CertStore.getInstance("Collection",
186                 new CollectionCertStoreParameters());
187         ArrayList<CertStore> l = new ArrayList<CertStore>();
188         if (!l.add(cs)) {
189             throw new RuntimeException("Could not create cert stores list");
190         }
191         return l;
192     }
193 
194     /**
195      * Creates stub implementation of the <code>PKIXCertPathChecker</code>
196      *
197      * @return Stub implementation of the <code>PKIXCertPathChecker</code>
198      */
getTestCertPathChecker()199     public static PKIXCertPathChecker getTestCertPathChecker() {
200         // stub implementation for testing purposes only
201         return new PKIXCertPathChecker() {
202             private boolean forward = false;
203 
204 
205             @SuppressWarnings({"unused", "unchecked"})
206             public void check(Certificate arg0, Collection arg1)
207                     throws CertPathValidatorException {
208             }
209 
210             public Set<String> getSupportedExtensions() {
211                 return null;
212             }
213 
214             @SuppressWarnings("unused")
215             public void init(boolean arg0) throws CertPathValidatorException {
216                 forward = arg0;
217             }
218 
219             public boolean isForwardCheckingSupported() {
220                 // just to check this checker state
221                 return forward;
222             }
223         };
224     }
225 
226     /**
227      * Creates policy tree stub containing two <code>PolicyNode</code>s
228      * for testing purposes
229      *
230      * @return root <code>PolicyNode</code> of the policy tree
231      */
getPolicyTree()232     public static PolicyNode getPolicyTree() {
233         return new PolicyNode() {
234             final PolicyNode parent = this;
235             public int getDepth() {
236                 // parent
237                 return 0;
238             }
239 
240             public boolean isCritical() {
241                 return false;
242             }
243 
244             public String getValidPolicy() {
245                 return null;
246             }
247 
248             public PolicyNode getParent() {
249                 return null;
250             }
251 
252             public Iterator<PolicyNode> getChildren() {
253                 PolicyNode child = new PolicyNode() {
254                     public int getDepth() {
255                         // child
256                         return 1;
257                     }
258 
259                     public boolean isCritical() {
260                         return false;
261                     }
262 
263                     public String getValidPolicy() {
264                         return null;
265                     }
266 
267                     public PolicyNode getParent() {
268                         return parent;
269                     }
270 
271                     public Iterator<PolicyNode> getChildren() {
272                         return null;
273                     }
274 
275                     public Set<String> getExpectedPolicies() {
276                         return null;
277                     }
278 
279                     public Set<? extends PolicyQualifierInfo> getPolicyQualifiers() {
280                         return null;
281                     }
282                 };
283                 HashSet<PolicyNode> s = new HashSet<PolicyNode>();
284                 s.add(child);
285                 return s.iterator();
286             }
287 
288             public Set<String> getExpectedPolicies() {
289                 return null;
290             }
291 
292             public Set<? extends PolicyQualifierInfo> getPolicyQualifiers() {
293                 return null;
294             }
295         };
296     }
297     // X.509 encoded certificate
298     private static final String ENCODED_X509_CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
299             + "MIIDHTCCAtsCBEFT72swCwYHKoZIzjgEAwUAMHQxCzAJBgNVBAYTAlJVMQwwCgYDVQQIEwNOU08x\n"
300             + "FDASBgNVBAcTC05vdm9zaWJpcnNrMQ4wDAYDVQQKEwVJbnRlbDEVMBMGA1UECxMMRFJMIFNlY3Vy\n"
301             + "aXR5MRowGAYDVQQDExFWbGFkaW1pciBNb2xvdGtvdjAeFw0wNDA5MjQwOTU2NTlaFw0wNjA1MTcw\n"
302             + "OTU2NTlaMHQxCzAJBgNVBAYTAlJVMQwwCgYDVQQIEwNOU08xFDASBgNVBAcTC05vdm9zaWJpcnNr\n"
303             + "MQ4wDAYDVQQKEwVJbnRlbDEVMBMGA1UECxMMRFJMIFNlY3VyaXR5MRowGAYDVQQDExFWbGFkaW1p\n"
304             + "ciBNb2xvdGtvdjCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3Ujzv\n"
305             + "RADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7\n"
306             + "qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V\n"
307             + "IwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrU\n"
308             + "WU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEk\n"
309             + "O8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKBgQDiNmj9jgWu1ILYqYWcUhNN\n"
310             + "8CjjRitf80yWP/s/565wZz3anb2w72jum63mdShDko9eOOOd1hiVuiBnNhSL7D6JfIYBJvNXr1av\n"
311             + "Gw583BBv12OBgg0eAW/GRWBn2Ak2JjsoBc5x2c1HAEufakep7T6RoC+n3lqbKPKyHWVdfqQ9KTAL\n"
312             + "BgcqhkjOOAQDBQADLwAwLAIUaRS3C9dXcMbrOAhmidFBr7oMvH0CFEC3LUwfLJX5gY8P6uxpkPx3\n"
313             + "JDSM\n" + "-----END CERTIFICATE-----\n";
314 
315     public static byte[] getEncodedX509Certificate() {
316         return ENCODED_X509_CERTIFICATE.getBytes();
317     }
318 
319     /**
320      * Returns X.509 certificate encoding corresponding to version v1.
321      *
322      * Certificate encoding was created by hands according to X.509 Certificate
323      * ASN.1 notation. The certificate encoding has the following encoded
324      * field values:<br>
325      * - version: 1<br>
326      * - serialNumber: 5<br>
327      * - issuer: CN=Z<br>
328      * - notBefore: 13 Dec 1999 14:15:16<br>
329      * - notAfter: 01 Jan 2000 00:00:00<br>
330      * - subject: CN=Y<br>
331      *
332      * @return X.509 certificate encoding corresponding to version v1.
333      */
334     public static byte[] getX509Certificate_v1() {
335         return new byte[] {
336         // Certificate: SEQUENCE
337             0x30, 0x6B,
338 
339             //
340             // TBSCertificate: SEQUENCE {
341             //
342             0x30, 0x5C,
343 
344             // version: [0] EXPLICIT Version DEFAULT v1
345             (byte) 0xA0, 0x03, 0x02, 0x01, 0x00,
346 
347             // serialNumber: CertificateSerialNumber
348             0x02, 0x01, 0x05,
349 
350             // signature: AlgorithmIdentifier
351             0x30, 0x07, // SEQUENCE
352             0x06, 0x02, 0x03, 0x05,//OID
353             0x01, 0x01, 0x07, //ANY
354 
355             //issuer: Name
356             0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
357             0x13, 0x01, 0x5A, // CN=Z
358 
359             //validity: Validity
360             0x30, 0x1E, // SEQUENCE
361             // notBefore: UTCTime
362             0x17, 0x0D, 0x39, 0x39, 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31,
363             0x35, 0x31, 0x36, 0x5A, // 13 Dec 1999 14:15:16
364             // notAfter:  UTCTime
365             0x17, 0x0D, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,
366             0x30, 0x30, 0x30, 0x5A, // 01 Jan 2000 00:00:00
367 
368             //subject: Name
369             0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
370             0x13, 0x01, 0x59, // CN=Y
371             //SubjectPublicKeyInfo  ::=  SEQUENCE  {
372             //    algorithm            AlgorithmIdentifier,
373             //    subjectPublicKey     BIT STRING  }
374             0x30, 0x0D, // SEQUENCE
375             0x30, 0x07, // SEQUENCE
376             0x06, 0x02, 0x03, 0x05,//OID
377             0x01, 0x01, 0x07, //ANY
378             0x03, 0x02, 0x00, 0x01, // subjectPublicKey
379 
380             // issuerUniqueID - missed
381             // subjectUniqueID - missed
382             // extensions - missed
383 
384             // } end TBSCertificate
385 
386             //
387             // signatureAlgorithm: AlgorithmIdentifier
388             //
389             0x30, 0x07, // SEQUENCE
390             0x06, 0x02, 0x03, 0x05,//OID
391             0x01, 0x01, 0x07, //ANY
392 
393             //
394             // signature: BIT STRING
395             //
396             0x03, 0x02, 0x00, 0x01 };
397     }
398 
399     /**
400      * Returns X.509 certificate encoding corresponding to version v3.
401      *
402      * Certificate encoding was created by hands according to X.509 Certificate
403      * ASN.1 notation. The certificate encoding has the following encoded
404      * field values:<br>
405      * - version: 3<br>
406      * - serialNumber: 5<br>
407      * - issuer: CN=Z<br>
408      * - notBefore: 13 Dec 1999 14:15:16<br>
409      * - notAfter: 01 Jan 2000 00:00:00<br>
410      * - subject: CN=Y<br>
411      * - extensions:
412      *       1) AuthorityKeyIdentifier(OID=2.5.29.35): no values in it(empty sequence)
413      *
414      * @return X.509 certificate encoding corresponding to version v3.
415      */
416     public static byte[] getX509Certificate_v3() {
417         return new byte[] {
418         // Certificate: SEQUENCE
419             0x30, 0x7D,
420 
421             //
422             // TBSCertificate: SEQUENCE {
423             //
424             0x30, 0x6E,
425 
426             // version: [0] EXPLICIT Version DEFAULT v1
427             (byte) 0xA0, 0x03, 0x02, 0x01, 0x02,
428 
429             // serialNumber: CertificateSerialNumber
430             0x02, 0x01, 0x05,
431 
432             // signature: AlgorithmIdentifier
433             0x30, 0x07, // SEQUENCE
434             0x06, 0x02, 0x03, 0x05,//OID
435             0x01, 0x01, 0x07, //ANY
436 
437             //issuer: Name
438             0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
439             0x13, 0x01, 0x5A, // CN=Z
440 
441             //validity: Validity
442             0x30, 0x1E, // SEQUENCE
443             // notBefore: UTCTime
444             0x17, 0x0D, 0x39, 0x39, 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31,
445             0x35, 0x31, 0x36, 0x5A, // 13 Dec 1999 14:15:16
446             // notAfter:  UTCTime
447             0x17, 0x0D, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,
448             0x30, 0x30, 0x30, 0x5A, // 01 Jan 2000 00:00:00
449 
450             //subject: Name
451             0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
452             0x13, 0x01, 0x59, // CN=Y
453             //SubjectPublicKeyInfo  ::=  SEQUENCE  {
454             //    algorithm            AlgorithmIdentifier,
455             //    subjectPublicKey     BIT STRING  }
456             0x30, 0x0D, // SEQUENCE
457             0x30, 0x07, // SEQUENCE
458             0x06, 0x02, 0x03, 0x05,//OID
459             0x01, 0x01, 0x07, //ANY
460             0x03, 0x02, 0x00, 0x01, // subjectPublicKey
461 
462             // issuerUniqueID - missed
463             // subjectUniqueID - missed
464             // extensions : [3]  EXPLICIT Extensions OPTIONAL
465             (byte) 0xA3, 0x10,
466             // Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension
467             0x30, 0x0E,
468             // Extension  ::=  SEQUENCE  {
469             // extnID      OBJECT IDENTIFIER,
470             // critical    BOOLEAN DEFAULT FALSE,
471             // extnValue   OCTET STRING  }
472 
473             // 1) AuthorityKeyIdentifier extension (see HARMONY-3384)
474             0x30, 0x0C,
475             0x06, 0x03, 0x55, 0x1D, 0x23, // OID = 2.5.29.35
476             0x01, 0x01, 0x00, // critical = FALSE
477             0x04, 0x02, 0x30, 0x00, // extnValue: MUST be empty sequence
478             // missed: keyIdentifier
479             // missed: authorityCertIssuer
480             // missed" authorityCertSerialNumber
481 
482             // } end TBSCertificate
483 
484             //
485             // signatureAlgorithm: AlgorithmIdentifier
486             //
487             0x30, 0x07, // SEQUENCE
488             0x06, 0x02, 0x03, 0x05,//OID
489             0x01, 0x01, 0x07, //ANY
490 
491             //
492             // signature: BIT STRING
493             //
494             0x03, 0x02, 0x00, 0x01 };
495     }
496 
497     /**
498      * Returns X.509 CRL encoding corresponding to version v1.
499      *
500      * CRL encoding was created by hands according to X.509 CRL ASN.1
501      * notation. The CRL encoding has the following encoded field values:<br>
502      * - version: 1<br>
503      * - issuer: CN=Z<br>
504      * - thisUpdate: 01 Jan 2001 01:02:03<br>
505      *
506      * @return X.509 CRL encoding corresponding to version v1.
507      */
508     public static byte[] getX509CRL_v1() {
509         return new byte[] {
510                 //CertificateList: SEQUENCE
511                 0x30, 0x35,
512 
513                 // TBSCertList: SEQUENCE
514                 0x30, 0x27,
515                 // Version: INTEGER OPTIONAL
516                 // 0x02, 0x01, 0x01, - missed here cause it is v1
517                 // signature: AlgorithmIdentifier
518                 0x30, 0x06, // SEQUENCE
519                 0x06, 0x01, 0x01, // OID
520                 0x01, 0x01, 0x11, // ANY
521                 // issuer: Name
522                 0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
523                 0x03, 0x13, 0x01, 0x5A, // CN=Z
524                 // thisUpdate: ChoiceOfTime
525                 // GeneralizedTime: 01 Jan 2001 01:02:03
526                 0x18, 0x0F, 0x32, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31,
527                 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x5A,
528 
529                 // nextUpdate - missed
530                 // revokedCertificates - missed
531                 // crlExtensions - missed
532 
533                 // signatureAlgorithm: AlgorithmIdentifier
534                 0x30, 0x06, // SEQUENCE
535                 0x06, 0x01, 0x01, //OID
536                 0x01, 0x01, 0x11, //ANY
537                 // signature: BIT STRING
538                 0x03, 0x02, 0x00, 0x01 };
539     }
540     //--------------------------------------------------------------------------
541 
542     // Second example
543     /**
544      * Certificate:
545      * <pre>
546      * $ openssl req -x509 -nodes -days 365 -subj '/C=AN/ST=Android/O=Android/OU=Android/CN=Android/emailAddress=android' -newkey rsa:1024 -keyout root.pem -out root.pem -text -days 36500
547      * Generating a 1024 bit RSA private key
548      * ..........................................++++++
549      * .................++++++
550      * writing new private key to 'root.pem'
551      * -----BEGIN RSA PRIVATE KEY-----
552      * MIICXwIBAAKBgQDKS+qP2kgqYBtwY4QoJ5p0yyEl35sBr2ZKtAWn6SL4vXgvaIrj
553      * K7vG93CvG239bXfacniGMEBitedBlcqjdPREEY0DQn3jLXyAOd3tnlKcutNH3RjA
554      * fPlnDWNGKLnDdSd9QZEc0G1MsMg/HrERPm1hMfZQG85zdtbYmi2CJ/jS5wIDAQAB
555      * AoGBAIZhvdSHjS7RHwkeonjGLh1tnnx5OI/7AzmWsrci8L9JpZ/gk3pq39dBIhLA
556      * ZuVVpatwJU4GmY65BYEUz0Kb+3JY0PXagypwQKuWs9wb9C0aRnDVy9DNXkbJ+D+L
557      * DNvyZAG5BNknZapxsFSenR5UO4BY08wIsdBtWD/B7YcMTuvxAkEA9zKP18pJCmku
558      * TUDTJkonF/fGvI4PvsBm6YFyINb130yGzKJKCcEn5j2Fm+wF+lGY7nmtUIgQekRm
559      * WkwbjG/v3wJBANGACjKFVIFvuXH6EoyWx90uYw9C8+m2jOtrRaAMfRyUanCvF2Li
560      * ZYOLThPcxv/QvvQAa7RKJjxsK69Ajm+b3fkCQQCR7xWgTVmlfcbJ8LU265v8uFhp
561      * RGzjLe8Td0oLPRxWQXVrJXwUGiYV9MgF7ubwim+AifDZlBo2NF9Ae6Hf3M19AkEA
562      * nJEGDe+a0gj/HHD5f9wHjgLmwTcWNmnZMu8+X3g14DACxCf2YE4183MebLWoevI0
563      * YwIVe+2WWb21gAnM6RghcQJBALq0RZcYkZoQA8qr9TPuuMzi+fF3Y+4m/pDDcCd5
564      * zXbsroEZPdWPfAXKT95juW9yKdVzeOZHO1uwRWmQ9ZlPMhY=
565      * -----END RSA PRIVATE KEY-----
566      * -----
567      * Certificate:
568      *     Data:
569      *         Version: 3 (0x2)
570      *         Serial Number:
571      *             8a:12:37:ed:2d:ad:02:6e
572      *         Signature Algorithm: sha1WithRSAEncryption
573      *         Issuer: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
574      *         Validity
575      *             Not Before: Oct  4 02:20:28 2010 GMT
576      *             Not After : Sep 10 02:20:28 2110 GMT
577      *         Subject: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
578      *         Subject Public Key Info:
579      *             Public Key Algorithm: rsaEncryption
580      *             RSA Public Key: (1024 bit)
581      *                 Modulus (1024 bit):
582      *                     00:ca:4b:ea:8f:da:48:2a:60:1b:70:63:84:28:27:
583      *                     9a:74:cb:21:25:df:9b:01:af:66:4a:b4:05:a7:e9:
584      *                     22:f8:bd:78:2f:68:8a:e3:2b:bb:c6:f7:70:af:1b:
585      *                     6d:fd:6d:77:da:72:78:86:30:40:62:b5:e7:41:95:
586      *                     ca:a3:74:f4:44:11:8d:03:42:7d:e3:2d:7c:80:39:
587      *                     dd:ed:9e:52:9c:ba:d3:47:dd:18:c0:7c:f9:67:0d:
588      *                     63:46:28:b9:c3:75:27:7d:41:91:1c:d0:6d:4c:b0:
589      *                     c8:3f:1e:b1:11:3e:6d:61:31:f6:50:1b:ce:73:76:
590      *                     d6:d8:9a:2d:82:27:f8:d2:e7
591      *                 Exponent: 65537 (0x10001)
592      *         X509v3 extensions:
593      *             X509v3 Subject Key Identifier:
594      *                 14:7D:36:ED:63:44:BF:4F:DB:7D:28:96:78:6A:E7:EC:CE:2C:40:BF
595      *             X509v3 Authority Key Identifier:
596      *                 keyid:14:7D:36:ED:63:44:BF:4F:DB:7D:28:96:78:6A:E7:EC:CE:2C:40:BF
597      *                 DirName:/C=AN/ST=Android/O=Android/OU=Android/CN=Android/emailAddress=android
598      *                 serial:8A:12:37:ED:2D:AD:02:6E
599      *
600      *             X509v3 Basic Constraints:
601      *                 CA:TRUE
602      *     Signature Algorithm: sha1WithRSAEncryption
603      *         7c:f2:84:c0:ee:40:a5:b9:94:85:19:ab:36:02:1d:17:4b:98:
604      *         f9:b9:c8:c5:1a:b0:c1:4f:0f:1d:1c:e8:c4:cf:c7:87:52:19:
605      *         9e:64:55:35:bb:34:e1:38:2f:27:08:c5:ca:e7:97:02:90:fd:
606      *         27:cd:8e:5a:08:40:f5:34:ff:70:65:c4:d6:1f:70:4f:d6:2c:
607      *         cb:28:d8:ed:91:b7:eb:35:06:cd:0e:02:a8:51:cd:b7:3e:f9:
608      *         85:16:97:31:7b:42:4c:cb:6f:de:4b:dd:ae:5e:9d:ef:84:83:
609      *         89:f9:0f:a6:5f:e4:93:cc:30:b5:e9:1d:f4:08:f4:e6:e9:58:
610      *         4b:ba
611      * -----BEGIN CERTIFICATE-----
612      * MIIDLTCCApagAwIBAgIJAIoSN+0trQJuMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV
613      * BAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQKEwdBbmRyb2lkMRAwDgYD
614      * VQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYwFAYJKoZIhvcNAQkBFgdh
615      * bmRyb2lkMCAXDTEwMTAwNDAyMjAyOFoYDzIxMTAwOTEwMDIyMDI4WjBtMQswCQYD
616      * VQQGEwJBTjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4G
617      * A1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYH
618      * YW5kcm9pZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAykvqj9pIKmAbcGOE
619      * KCeadMshJd+bAa9mSrQFp+ki+L14L2iK4yu7xvdwrxtt/W132nJ4hjBAYrXnQZXK
620      * o3T0RBGNA0J94y18gDnd7Z5SnLrTR90YwHz5Zw1jRii5w3UnfUGRHNBtTLDIPx6x
621      * ET5tYTH2UBvOc3bW2Jotgif40ucCAwEAAaOB0jCBzzAdBgNVHQ4EFgQUFH027WNE
622      * v0/bfSiWeGrn7M4sQL8wgZ8GA1UdIwSBlzCBlIAUFH027WNEv0/bfSiWeGrn7M4s
623      * QL+hcaRvMG0xCzAJBgNVBAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQK
624      * EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYw
625      * FAYJKoZIhvcNAQkBFgdhbmRyb2lkggkAihI37S2tAm4wDAYDVR0TBAUwAwEB/zAN
626      * BgkqhkiG9w0BAQUFAAOBgQB88oTA7kCluZSFGas2Ah0XS5j5ucjFGrDBTw8dHOjE
627      * z8eHUhmeZFU1uzThOC8nCMXK55cCkP0nzY5aCED1NP9wZcTWH3BP1izLKNjtkbfr
628      * NQbNDgKoUc23PvmFFpcxe0JMy2/eS92uXp3vhIOJ+Q+mX+STzDC16R30CPTm6VhL
629      * ug==
630      * -----END CERTIFICATE-----
631      * $
632      * </pre>
633      */
634     public static final String rootCert = ""
635             + "-----BEGIN CERTIFICATE-----\n"
636             + "MIIDLTCCApagAwIBAgIJAIoSN+0trQJuMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV\n"
637             + "BAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQKEwdBbmRyb2lkMRAwDgYD\n"
638             + "VQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYwFAYJKoZIhvcNAQkBFgdh\n"
639             + "bmRyb2lkMCAXDTEwMTAwNDAyMjAyOFoYDzIxMTAwOTEwMDIyMDI4WjBtMQswCQYD\n"
640             + "VQQGEwJBTjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4G\n"
641             + "A1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYH\n"
642             + "YW5kcm9pZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAykvqj9pIKmAbcGOE\n"
643             + "KCeadMshJd+bAa9mSrQFp+ki+L14L2iK4yu7xvdwrxtt/W132nJ4hjBAYrXnQZXK\n"
644             + "o3T0RBGNA0J94y18gDnd7Z5SnLrTR90YwHz5Zw1jRii5w3UnfUGRHNBtTLDIPx6x\n"
645             + "ET5tYTH2UBvOc3bW2Jotgif40ucCAwEAAaOB0jCBzzAdBgNVHQ4EFgQUFH027WNE\n"
646             + "v0/bfSiWeGrn7M4sQL8wgZ8GA1UdIwSBlzCBlIAUFH027WNEv0/bfSiWeGrn7M4s\n"
647             + "QL+hcaRvMG0xCzAJBgNVBAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQK\n"
648             + "EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYw\n"
649             + "FAYJKoZIhvcNAQkBFgdhbmRyb2lkggkAihI37S2tAm4wDAYDVR0TBAUwAwEB/zAN\n"
650             + "BgkqhkiG9w0BAQUFAAOBgQB88oTA7kCluZSFGas2Ah0XS5j5ucjFGrDBTw8dHOjE\n"
651             + "z8eHUhmeZFU1uzThOC8nCMXK55cCkP0nzY5aCED1NP9wZcTWH3BP1izLKNjtkbfr\n"
652             + "NQbNDgKoUc23PvmFFpcxe0JMy2/eS92uXp3vhIOJ+Q+mX+STzDC16R30CPTm6VhL\n"
653             + "ug==\n"
654             + "-----END CERTIFICATE-----\n";
655 
656     /**
657      * Certificate:
658      * <pre>
659      * $ openssl req -nodes -days 365 -subj '/C=AN/ST=Android/L=Android/O=Android/OU=Android/CN=Android Certificate/emailAddress=android' -newkey rsa:1024 -keyout certreq.pem -out certreq.pem -text -days 36500
660      * Generating a 1024 bit RSA private key
661      * .......++++++
662      * ......................++++++
663      * writing new private key to 'certreq.pem'
664      * -----
665      * $ openssl x509 -req -in certreq.pem -CA root.pem -CAcreateserial -out cert.pem -days 36500
666      * Signature ok
667      * subject=/C=AN/ST=Android/L=Android/O=Android/OU=Android/CN=Android Certificate/emailAddress=android
668      * Getting Private key
669      * $ rm root.srl
670      * $ openssl rsa -in certreq.pem
671      * writing RSA key
672      * -----BEGIN RSA PRIVATE KEY-----
673      * MIICXQIBAAKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvKGC2X
674      * lYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMKKzUv
675      * j0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQIDAQAB
676      * AoGAS4CQn8Qw6ewc5wLipDpqDYfB5grnGExys7MBgcPUyPPYX2TkHUye7LnD8gxs
677      * YrtiDcVW8BuGTZkC0EuUesskgiwGLimNiU3vU3LwH7OvtfUTMdvhv9nd2GFlfiQo
678      * PfwhITZ85GwhDkhiBBXjToDcNc0ntXVgACNAKU1ZlJyoyukCQQDwsGmD0GwKFtJH
679      * cGXI+IK0aB+pXjujZJU/Ikg+eTPMSWDsKD6ReZu9uJJc8W36Xiki/No1/NZvj0gB
680      * MwgIkwh7AkEA02FzaGcWLFSHaRfV1wpx1F3Iuu3X2wWqTzBlhGG9ZDQyy7gWZqHJ
681      * jElCdajiMnbh0mk62hobYy4FcLuvkkJWAwJBAK7FKpkQaqMY1zAQqZg4+4/MW9E8
682      * H8oRa14gopzanYYlcj+JKYWw7CnjMERU+yrl3LEPMdQp9/uh6wMT7y1qtqkCQCNG
683      * mxTsRzYEsUhnkuc9Nfvj3tDbSm+hxWdLw1VRXmLvlx6KTSq5i0IfI7kxAva7Ajq0
684      * Fv845iMqFfxXRhiZe3MCQQCxD0vLzEBegLQPgiavGXfBnRPrRrXgkuAJg7Fq/1Vt
685      * 3InSGat3Tv8GW+pCWWVgmV8iQ4wWReg+Bd03SCSP5uAY
686      * -----END RSA PRIVATE KEY-----
687      * $ openssl x509 -in cert.pem -text
688      * Certificate:
689      *     Data:
690      *         Version: 1 (0x0)
691      *         Serial Number:
692      *             89:34:5f:d5:01:2e:a2:2b
693      *         Signature Algorithm: sha1WithRSAEncryption
694      *         Issuer: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
695      *         Validity
696      *             Not Before: Oct  4 04:41:54 2010 GMT
697      *             Not After : Sep 10 04:41:54 2110 GMT
698      *         Subject: C=AN, ST=Android, L=Android, O=Android, OU=Android, CN=Android Certificate/emailAddress=android
699      *         Subject Public Key Info:
700      *             Public Key Algorithm: rsaEncryption
701      *             RSA Public Key: (1024 bit)
702      *                 Modulus (1024 bit):
703      *                     00:c6:bd:06:51:07:b7:ec:b8:bb:e7:67:44:b1:e3:
704      *                     7b:13:0a:4b:f0:bf:f4:84:62:bc:d1:ba:6c:95:d7:
705      *                     a3:82:fa:5b:ca:18:2d:97:95:85:bd:aa:fe:e8:7f:
706      *                     cf:21:a9:25:6a:e7:cd:b7:30:1f:ae:10:fd:71:64:
707      *                     b5:9a:88:a9:18:c8:49:fb:d9:1c:20:57:f1:ea:07:
708      *                     c2:84:80:66:17:11:b3:0a:2b:35:2f:8f:40:f5:5f:
709      *                     c9:19:fc:40:c6:aa:c6:63:14:a9:64:ff:bb:19:61:
710      *                     c8:37:52:a0:9c:19:48:84:12:cc:d3:69:d8:72:27:
711      *                     a1:5c:a3:01:cc:d4:48:6b:71
712      *                 Exponent: 65537 (0x10001)
713      *     Signature Algorithm: sha1WithRSAEncryption
714      *         80:06:54:ba:4c:a2:0d:2e:6b:d5:b0:b1:89:b2:fa:c2:fd:d6:
715      *         02:ab:74:af:fb:1c:bc:47:43:58:89:57:80:ad:59:79:e9:2e:
716      *         d9:60:a7:a6:0f:9c:10:9f:e1:80:a1:66:19:59:7e:11:28:17:
717      *         17:0a:1d:e9:8d:78:e8:c2:61:36:03:fc:42:b1:54:bd:28:39:
718      *         3c:48:fd:3c:79:e7:ca:1a:16:c3:8a:77:42:07:96:14:8c:d2:
719      *         51:ca:8e:db:b8:82:31:84:5e:3f:68:b1:a5:f0:96:ae:a9:ca:
720      *         86:f3:01:76:63:98:65:dd:41:81:11:d7:71:c8:ae:17:c7:20:
721      *         e7:22
722      * -----BEGIN CERTIFICATE-----
723      * MIICcjCCAdsCCQCJNF/VAS6iKzANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJB
724      * TjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMH
725      * QW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYHYW5kcm9p
726      * ZDAgFw0xMDEwMDQwNDQxNTRaGA8yMTEwMDkxMDA0NDE1NFowgYsxCzAJBgNVBAYT
727      * AkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQHEwdBbmRyb2lkMRAwDgYDVQQK
728      * EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRwwGgYDVQQDExNBbmRyb2lkIENl
729      * cnRpZmljYXRlMRYwFAYJKoZIhvcNAQkBFgdhbmRyb2lkMIGfMA0GCSqGSIb3DQEB
730      * AQUAA4GNADCBiQKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvK
731      * GC2XlYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMK
732      * KzUvj0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQID
733      * AQABMA0GCSqGSIb3DQEBBQUAA4GBAIAGVLpMog0ua9WwsYmy+sL91gKrdK/7HLxH
734      * Q1iJV4CtWXnpLtlgp6YPnBCf4YChZhlZfhEoFxcKHemNeOjCYTYD/EKxVL0oOTxI
735      * /Tx558oaFsOKd0IHlhSM0lHKjtu4gjGEXj9osaXwlq6pyobzAXZjmGXdQYER13HI
736      * rhfHIOci
737      * -----END CERTIFICATE-----
738      * $
739      * </pre>
740      */
741     public static final String  endCert = ""
742             + "-----BEGIN CERTIFICATE-----\n"
743             + "MIICcjCCAdsCCQCJNF/VAS6iKzANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJB\n"
744             + "TjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMH\n"
745             + "QW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYHYW5kcm9p\n"
746             + "ZDAgFw0xMDEwMDQwNDQxNTRaGA8yMTEwMDkxMDA0NDE1NFowgYsxCzAJBgNVBAYT\n"
747             + "AkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQHEwdBbmRyb2lkMRAwDgYDVQQK\n"
748             + "EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRwwGgYDVQQDExNBbmRyb2lkIENl\n"
749             + "cnRpZmljYXRlMRYwFAYJKoZIhvcNAQkBFgdhbmRyb2lkMIGfMA0GCSqGSIb3DQEB\n"
750             + "AQUAA4GNADCBiQKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvK\n"
751             + "GC2XlYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMK\n"
752             + "KzUvj0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQID\n"
753             + "AQABMA0GCSqGSIb3DQEBBQUAA4GBAIAGVLpMog0ua9WwsYmy+sL91gKrdK/7HLxH\n"
754             + "Q1iJV4CtWXnpLtlgp6YPnBCf4YChZhlZfhEoFxcKHemNeOjCYTYD/EKxVL0oOTxI\n"
755             + "/Tx558oaFsOKd0IHlhSM0lHKjtu4gjGEXj9osaXwlq6pyobzAXZjmGXdQYER13HI\n"
756             + "rhfHIOci\n"
757             + "-----END CERTIFICATE-----\n";
758 
759     /**
760      * a self signed certificate
761      */
762     public static X509Certificate rootCertificateSS;
763 
764     public static X509Certificate endCertificate;
765 
766     public static MyCRL crl;
767 
768     public static X509CertSelector theCertSelector;
769 
770     public static CertPathBuilder builder;
771     private static CertStore store;
772 
773     public static void initCertPathSSCertChain() throws CertificateException,
774             InvalidAlgorithmParameterException, NoSuchAlgorithmException,
775             IOException {
776         // create certificates and CRLs
777         CertificateFactory cf = CertificateFactory.getInstance("X.509");
778         ByteArrayInputStream bi = new ByteArrayInputStream(rootCert.getBytes());
779         rootCertificateSS = (X509Certificate) cf.generateCertificate(bi);
780         bi = new ByteArrayInputStream(endCert.getBytes());
781         endCertificate = (X509Certificate) cf.generateCertificate(bi);
782         BigInteger revokedSerialNumber = BigInteger.valueOf(1);
783         crl = new MyCRL("X.509");
784 //        X509CRL rootCRL = X509CRL;
785 //        X509CRL interCRL = X509CRLExample.createCRL(interCert, interPair
786 //                .getPrivate(), revokedSerialNumber);
787 
788         // create CertStore to support path building
789         List<Object> list = new ArrayList<Object>();
790 
791         list.add(rootCertificateSS);
792         list.add(endCertificate);
793 
794         CollectionCertStoreParameters params = new CollectionCertStoreParameters(
795                 list);
796         store = CertStore.getInstance("Collection", params);
797 
798         theCertSelector = new X509CertSelector();
799         theCertSelector.setCertificate(endCertificate);
800         theCertSelector.setIssuer(endCertificate.getIssuerX500Principal()
801                 .getEncoded());
802 
803         // build the path
804         builder = CertPathBuilder.getInstance("PKIX");
805 
806     }
807 
808     public static CertPathBuilder getCertPathBuilder() {
809         if (builder == null) {
810             throw new RuntimeException(
811             "Call initCertPathSSCertChain prior to initCertPathSSCertChain");
812         }
813         return builder;
814     }
815 
816     public static CertPath buildCertPathSSCertChain() throws Exception {
817         return builder.build(getCertPathParameters()).getCertPath();
818     }
819 
820     public static CertPathParameters getCertPathParameters()
821             throws InvalidAlgorithmParameterException {
822         if ((rootCertificateSS == null) || (theCertSelector == null)
823                 || (builder == null)) {
824             throw new RuntimeException(
825                     "Call initCertPathSSCertChain prior to buildCertPath");
826         }
827         PKIXBuilderParameters buildParams = new PKIXBuilderParameters(
828                 Collections.singleton(new TrustAnchor(rootCertificateSS, null)),
829                 theCertSelector);
830 
831         buildParams.addCertStore(store);
832         buildParams.setRevocationEnabled(false);
833 
834         return buildParams;
835 
836     }
837 }
838