1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vladimir N. Molotkov
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.tests.support.cert;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.resource.Support_Resources;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.BufferedInputStream;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.KeyStore;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPath;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPathBuilder;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPathBuilderException;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPathBuilderResult;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPathParameters;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertPathValidatorException;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertStore;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateException;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateFactory;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CollectionCertStoreParameters;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.PKIXBuilderParameters;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.PKIXCertPathBuilderResult;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.PKIXCertPathChecker;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.PolicyNode;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.PolicyQualifierInfo;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.TrustAnchor;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.X509CertSelector;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.X509Certificate;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collections;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashSet;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Iterator;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.security.cert test utilities
63f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class TestUtils {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Certificate type used during testing
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String certType = "X.509";
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Key store type used during testing
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String keyStoreType = "BKS";
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // The file name prefix to load keystore from
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String keyStoreFileName = "test." + keyStoreType
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + ".ks";
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // The file name suffixes to load keystore from
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  *.ks1 - keystore containing untrusted certificates only
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  *.ks2 - keystore containing trusted certificates only
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  *.ks3 - keystore containing both trusted and untrusted certificates
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int UNTRUSTED = 1;
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TRUSTED = 2;
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TRUSTED_AND_UNTRUSTED = 3;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Common passwords for all test keystores
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final static char[] storepass =
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        new char[] {'s','t','o','r','e','p','w','d'};
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates <code>TrustAnchor</code> instance
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * constructed using self signed test certificate
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>TrustAnchor</code> instance
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static TrustAnchor getTrustAnchor() {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificateFactory cf = null;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cf = CertificateFactory.getInstance(certType);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CertificateException e) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // requested cert type is not available in the
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // default provider package or any of the other provider packages
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // that were searched
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(e);
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        BufferedInputStream bis = null;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            bis = new BufferedInputStream(new ByteArrayInputStream(
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    getEncodedX509Certificate()));
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X509Certificate c1 = (X509Certificate)cf.generateCertificate(bis);
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new TrustAnchor(c1, null);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // all failures are fatal
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(e);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (bis != null) {
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    bis.close() ;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IOException ign) {}
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates <code>Set</code> of <code>TrustAnchor</code>s
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * containing single element (self signed test certificate).
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Returns <code>Set</code> of <code>TrustAnchor</code>s
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Set<TrustAnchor> getTrustAnchorSet() {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        TrustAnchor ta = getTrustAnchor();
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (ta == null) {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HashSet<TrustAnchor> set = new HashSet<TrustAnchor>();
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!set.add(ta)) {
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException("Could not create trust anchor set");
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return set;
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates test <code>KeyStore</code> instance
142f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param initialize
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  Do not initialize returned <code>KeyStore</code> if false
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param testKeyStoreType
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  this parameter ignored if <code>initialize</code> is false;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  The following types supported:<br>
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  1 - <code>KeyStore</code> with untrusted certificates only<br>
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  2 - <code>KeyStore</code> with trusted certificates only<br>
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *  3 - <code>KeyStore</code> with both trusted and untrusted certificates
152f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Returns test <code>KeyStore</code> instance
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyStore getKeyStore(boolean initialize,
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int testKeyStoreType) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        BufferedInputStream bis = null;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            KeyStore ks = KeyStore.getInstance(keyStoreType);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (initialize) {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String fileName = keyStoreFileName + testKeyStoreType;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ks.load(Support_Resources.getResourceStream(fileName),
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        storepass);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return ks;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(e);
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } finally {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (initialize && bis != null) {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    bis.close();
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IOException ign) {}
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates <code>List</code> of <code>CollectionCertStores</code>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return The list created
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidAlgorithmParameterException
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static List<CertStore> getCollectionCertStoresList()
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throws InvalidAlgorithmParameterException,
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project               NoSuchAlgorithmException {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertStore cs = CertStore.getInstance("Collection",
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new CollectionCertStoreParameters());
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ArrayList<CertStore> l = new ArrayList<CertStore>();
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!l.add(cs)) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException("Could not create cert stores list");
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return l;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates stub implementation of the <code>PKIXCertPathChecker</code>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Stub implementation of the <code>PKIXCertPathChecker</code>
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static PKIXCertPathChecker getTestCertPathChecker() {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // stub implementation for testing purposes only
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new PKIXCertPathChecker() {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private boolean forward = false;
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            @SuppressWarnings({"unused", "unchecked"})
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void check(Certificate arg0, Collection arg1)
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throws CertPathValidatorException {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set<String> getSupportedExtensions() {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            @SuppressWarnings("unused")
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public void init(boolean arg0) throws CertPathValidatorException {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                forward = arg0;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean isForwardCheckingSupported() {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // just to check this checker state
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return forward;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates policy tree stub containing two <code>PolicyNode</code>s
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for testing purposes
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return root <code>PolicyNode</code> of the policy tree
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static PolicyNode getPolicyTree() {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new PolicyNode() {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final PolicyNode parent = this;
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public int getDepth() {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // parent
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return 0;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public boolean isCritical() {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public String getValidPolicy() {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public PolicyNode getParent() {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Iterator<PolicyNode> getChildren() {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                PolicyNode child = new PolicyNode() {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public int getDepth() {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        // child
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return 1;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public boolean isCritical() {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return false;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public String getValidPolicy() {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return null;
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public PolicyNode getParent() {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return parent;
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public Iterator<PolicyNode> getChildren() {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return null;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public Set<String> getExpectedPolicies() {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return null;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public Set<? extends PolicyQualifierInfo> getPolicyQualifiers() {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return null;
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                };
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                HashSet<PolicyNode> s = new HashSet<PolicyNode>();
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                s.add(child);
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return s.iterator();
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set<String> getExpectedPolicies() {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public Set<? extends PolicyQualifierInfo> getPolicyQualifiers() {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return null;
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        };
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // X.509 encoded certificate
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String ENCODED_X509_CERTIFICATE = "-----BEGIN CERTIFICATE-----\n"
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "MIIDHTCCAtsCBEFT72swCwYHKoZIzjgEAwUAMHQxCzAJBgNVBAYTAlJVMQwwCgYDVQQIEwNOU08x\n"
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "FDASBgNVBAcTC05vdm9zaWJpcnNrMQ4wDAYDVQQKEwVJbnRlbDEVMBMGA1UECxMMRFJMIFNlY3Vy\n"
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "aXR5MRowGAYDVQQDExFWbGFkaW1pciBNb2xvdGtvdjAeFw0wNDA5MjQwOTU2NTlaFw0wNjA1MTcw\n"
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "OTU2NTlaMHQxCzAJBgNVBAYTAlJVMQwwCgYDVQQIEwNOU08xFDASBgNVBAcTC05vdm9zaWJpcnNr\n"
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "MQ4wDAYDVQQKEwVJbnRlbDEVMBMGA1UECxMMRFJMIFNlY3VyaXR5MRowGAYDVQQDExFWbGFkaW1p\n"
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "ciBNb2xvdGtvdjCCAbgwggEsBgcqhkjOOAQBMIIBHwKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3Ujzv\n"
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "RADDHj+AtlEmaUVdQCJR+1k9jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7\n"
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "qdf+t8Yb+DtX58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V\n"
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "IwvMspK5gqLrhAvwWBz1AoGBAPfhoIXWmz3ey7yrXDa4V7l5lK+7+jrqgvlXTAs9B4JnUVlXjrrU\n"
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "WU/mcQcQgYC0SRZxI+hMKBYTt88JMozIpuE8FnqLVHyNKOCjrh4rs6Z1kW6jfwv6ITVi8ftiegEk\n"
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "O8yk8b6oUZCJqIPf4VrlnwaSi2ZegHtVJWQBTDv+z0kqA4GFAAKBgQDiNmj9jgWu1ILYqYWcUhNN\n"
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "8CjjRitf80yWP/s/565wZz3anb2w72jum63mdShDko9eOOOd1hiVuiBnNhSL7D6JfIYBJvNXr1av\n"
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "Gw583BBv12OBgg0eAW/GRWBn2Ak2JjsoBc5x2c1HAEufakep7T6RoC+n3lqbKPKyHWVdfqQ9KTAL\n"
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "BgcqhkjOOAQDBQADLwAwLAIUaRS3C9dXcMbrOAhmidFBr7oMvH0CFEC3LUwfLJX5gY8P6uxpkPx3\n"
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            + "JDSM\n" + "-----END CERTIFICATE-----\n";
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static byte[] getEncodedX509Certificate() {
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ENCODED_X509_CERTIFICATE.getBytes();
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
321f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns X.509 certificate encoding corresponding to version v1.
324f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Certificate encoding was created by hands according to X.509 Certificate
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ASN.1 notation. The certificate encoding has the following encoded
327f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * field values:<br>
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - version: 1<br>
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - serialNumber: 5<br>
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - issuer: CN=Z<br>
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - notBefore: 13 Dec 1999 14:15:16<br>
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - notAfter: 01 Jan 2000 00:00:00<br>
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - subject: CN=Y<br>
334f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return X.509 certificate encoding corresponding to version v1.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static byte[] getX509Certificate_v1() {
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new byte[] {
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Certificate: SEQUENCE
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x6B,
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TBSCertificate: SEQUENCE {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x5C,
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // version: [0] EXPLICIT Version DEFAULT v1
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            (byte) 0xA0, 0x03, 0x02, 0x01, 0x00,
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // serialNumber: CertificateSerialNumber
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x02, 0x01, 0x05,
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // signature: AlgorithmIdentifier
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //issuer: Name
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x13, 0x01, 0x5A, // CN=Z
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //validity: Validity
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x1E, // SEQUENCE
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // notBefore: UTCTime
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17, 0x0D, 0x39, 0x39, 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31,
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x35, 0x31, 0x36, 0x5A, // 13 Dec 1999 14:15:16
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // notAfter:  UTCTime
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17, 0x0D, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x30, 0x30, 0x5A, // 01 Jan 2000 00:00:00
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //subject: Name
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x13, 0x01, 0x59, // CN=Y
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //SubjectPublicKeyInfo  ::=  SEQUENCE  {
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //    algorithm            AlgorithmIdentifier,
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //    subjectPublicKey     BIT STRING  }
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0D, // SEQUENCE
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x03, 0x02, 0x00, 0x01, // subjectPublicKey
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // issuerUniqueID - missed
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // subjectUniqueID - missed
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // extensions - missed
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // } end TBSCertificate
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // signatureAlgorithm: AlgorithmIdentifier
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
397f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            // signature: BIT STRING
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x03, 0x02, 0x00, 0x01 };
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns X.509 certificate encoding corresponding to version v3.
404f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Certificate encoding was created by hands according to X.509 Certificate
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ASN.1 notation. The certificate encoding has the following encoded
407f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * field values:<br>
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - version: 3<br>
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - serialNumber: 5<br>
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - issuer: CN=Z<br>
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - notBefore: 13 Dec 1999 14:15:16<br>
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - notAfter: 01 Jan 2000 00:00:00<br>
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - subject: CN=Y<br>
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - extensions:
415f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *       1) AuthorityKeyIdentifier(OID=2.5.29.35): no values in it(empty sequence)
416f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return X.509 certificate encoding corresponding to version v3.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static byte[] getX509Certificate_v3() {
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new byte[] {
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Certificate: SEQUENCE
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x7D,
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TBSCertificate: SEQUENCE {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x6E,
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // version: [0] EXPLICIT Version DEFAULT v1
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            (byte) 0xA0, 0x03, 0x02, 0x01, 0x02,
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // serialNumber: CertificateSerialNumber
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x02, 0x01, 0x05,
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // signature: AlgorithmIdentifier
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //issuer: Name
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x13, 0x01, 0x5A, // CN=Z
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //validity: Validity
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x1E, // SEQUENCE
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // notBefore: UTCTime
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17, 0x0D, 0x39, 0x39, 0x31, 0x32, 0x31, 0x33, 0x31, 0x34, 0x31,
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x35, 0x31, 0x36, 0x5A, // 13 Dec 1999 14:15:16
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // notAfter:  UTCTime
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17, 0x0D, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30,
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x30, 0x30, 0x5A, // 01 Jan 2000 00:00:00
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //subject: Name
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04, 0x03,
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x13, 0x01, 0x59, // CN=Y
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //SubjectPublicKeyInfo  ::=  SEQUENCE  {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //    algorithm            AlgorithmIdentifier,
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //    subjectPublicKey     BIT STRING  }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0D, // SEQUENCE
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x03, 0x02, 0x00, 0x01, // subjectPublicKey
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // issuerUniqueID - missed
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // subjectUniqueID - missed
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // extensions : [3]  EXPLICIT Extensions OPTIONAL
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            (byte) 0xA3, 0x10,
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0E,
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Extension  ::=  SEQUENCE  {
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // extnID      OBJECT IDENTIFIER,
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // critical    BOOLEAN DEFAULT FALSE,
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // extnValue   OCTET STRING  }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // 1) AuthorityKeyIdentifier extension (see HARMONY-3384)
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x0C,
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x03, 0x55, 0x1D, 0x23, // OID = 2.5.29.35
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x00, // critical = FALSE
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x04, 0x02, 0x30, 0x00, // extnValue: MUST be empty sequence
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // missed: keyIdentifier
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // missed: authorityCertIssuer
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // missed" authorityCertSerialNumber
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // } end TBSCertificate
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // signatureAlgorithm: AlgorithmIdentifier
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x30, 0x07, // SEQUENCE
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x06, 0x02, 0x03, 0x05,//OID
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x01, 0x01, 0x07, //ANY
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
495f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            // signature: BIT STRING
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x03, 0x02, 0x00, 0x01 };
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns X.509 CRL encoding corresponding to version v1.
502f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * CRL encoding was created by hands according to X.509 CRL ASN.1
504f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * notation. The CRL encoding has the following encoded field values:<br>
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - version: 1<br>
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - issuer: CN=Z<br>
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * - thisUpdate: 01 Jan 2001 01:02:03<br>
508f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return X.509 CRL encoding corresponding to version v1.
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static byte[] getX509CRL_v1() {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new byte[] {
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //CertificateList: SEQUENCE
514f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                0x30, 0x35,
515f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
516f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                // TBSCertList: SEQUENCE
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x30, 0x27,
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // Version: INTEGER OPTIONAL
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // 0x02, 0x01, 0x01, - missed here cause it is v1
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // signature: AlgorithmIdentifier
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x30, 0x06, // SEQUENCE
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x06, 0x01, 0x01, // OID
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x01, 0x01, 0x11, // ANY
524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                // issuer: Name
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x30, 0x0C, 0x31, 0x0A, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
526f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                0x03, 0x13, 0x01, 0x5A, // CN=Z
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // thisUpdate: ChoiceOfTime
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // GeneralizedTime: 01 Jan 2001 01:02:03
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x18, 0x0F, 0x32, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31,
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x5A,
531f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // nextUpdate - missed
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // revokedCertificates - missed
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // crlExtensions - missed
535f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // signatureAlgorithm: AlgorithmIdentifier
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x30, 0x06, // SEQUENCE
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x06, 0x01, 0x01, //OID
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x01, 0x01, 0x11, //ANY
540f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                // signature: BIT STRING
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                0x03, 0x02, 0x00, 0x01 };
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //--------------------------------------------------------------------------
544f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Second example
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Certificate:
548ab28398a565e5ce8a56cdfd50ac6226e5317cf66The Android Open Source Project     * <pre>
54952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ 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
55052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Generating a 1024 bit RSA private key
55152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ..........................................++++++
55252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * .................++++++
55352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * writing new private key to 'root.pem'
55452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----BEGIN RSA PRIVATE KEY-----
55552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * MIICXwIBAAKBgQDKS+qP2kgqYBtwY4QoJ5p0yyEl35sBr2ZKtAWn6SL4vXgvaIrj
55652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * K7vG93CvG239bXfacniGMEBitedBlcqjdPREEY0DQn3jLXyAOd3tnlKcutNH3RjA
55752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * fPlnDWNGKLnDdSd9QZEc0G1MsMg/HrERPm1hMfZQG85zdtbYmi2CJ/jS5wIDAQAB
55852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * AoGBAIZhvdSHjS7RHwkeonjGLh1tnnx5OI/7AzmWsrci8L9JpZ/gk3pq39dBIhLA
55952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ZuVVpatwJU4GmY65BYEUz0Kb+3JY0PXagypwQKuWs9wb9C0aRnDVy9DNXkbJ+D+L
56052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * DNvyZAG5BNknZapxsFSenR5UO4BY08wIsdBtWD/B7YcMTuvxAkEA9zKP18pJCmku
56152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * TUDTJkonF/fGvI4PvsBm6YFyINb130yGzKJKCcEn5j2Fm+wF+lGY7nmtUIgQekRm
56252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * WkwbjG/v3wJBANGACjKFVIFvuXH6EoyWx90uYw9C8+m2jOtrRaAMfRyUanCvF2Li
56352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ZYOLThPcxv/QvvQAa7RKJjxsK69Ajm+b3fkCQQCR7xWgTVmlfcbJ8LU265v8uFhp
56452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * RGzjLe8Td0oLPRxWQXVrJXwUGiYV9MgF7ubwim+AifDZlBo2NF9Ae6Hf3M19AkEA
56552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * nJEGDe+a0gj/HHD5f9wHjgLmwTcWNmnZMu8+X3g14DACxCf2YE4183MebLWoevI0
56652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * YwIVe+2WWb21gAnM6RghcQJBALq0RZcYkZoQA8qr9TPuuMzi+fF3Y+4m/pDDcCd5
56752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * zXbsroEZPdWPfAXKT95juW9yKdVzeOZHO1uwRWmQ9ZlPMhY=
56852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----END RSA PRIVATE KEY-----
56952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----
57052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Certificate:
57152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *     Data:
57252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Version: 3 (0x2)
57352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Serial Number:
57452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             8a:12:37:ed:2d:ad:02:6e
57552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Signature Algorithm: sha1WithRSAEncryption
57652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Issuer: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
57752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Validity
57852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Not Before: Oct  4 02:20:28 2010 GMT
57952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Not After : Sep 10 02:20:28 2110 GMT
58052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Subject: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
58152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Subject Public Key Info:
58252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Public Key Algorithm: rsaEncryption
58352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             RSA Public Key: (1024 bit)
58452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 Modulus (1024 bit):
58552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     00:ca:4b:ea:8f:da:48:2a:60:1b:70:63:84:28:27:
58652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     9a:74:cb:21:25:df:9b:01:af:66:4a:b4:05:a7:e9:
58752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     22:f8:bd:78:2f:68:8a:e3:2b:bb:c6:f7:70:af:1b:
58852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     6d:fd:6d:77:da:72:78:86:30:40:62:b5:e7:41:95:
58952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     ca:a3:74:f4:44:11:8d:03:42:7d:e3:2d:7c:80:39:
59052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     dd:ed:9e:52:9c:ba:d3:47:dd:18:c0:7c:f9:67:0d:
59152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     63:46:28:b9:c3:75:27:7d:41:91:1c:d0:6d:4c:b0:
59252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     c8:3f:1e:b1:11:3e:6d:61:31:f6:50:1b:ce:73:76:
59352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     d6:d8:9a:2d:82:27:f8:d2:e7
59452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 Exponent: 65537 (0x10001)
59552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         X509v3 extensions:
59652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             X509v3 Subject Key Identifier:
59752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 14:7D:36:ED:63:44:BF:4F:DB:7D:28:96:78:6A:E7:EC:CE:2C:40:BF
59852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             X509v3 Authority Key Identifier:
59952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 keyid:14:7D:36:ED:63:44:BF:4F:DB:7D:28:96:78:6A:E7:EC:CE:2C:40:BF
60052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 DirName:/C=AN/ST=Android/O=Android/OU=Android/CN=Android/emailAddress=android
60152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 serial:8A:12:37:ED:2D:AD:02:6E
60252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *
60352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             X509v3 Basic Constraints:
60452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 CA:TRUE
60552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *     Signature Algorithm: sha1WithRSAEncryption
60652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         7c:f2:84:c0:ee:40:a5:b9:94:85:19:ab:36:02:1d:17:4b:98:
60752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         f9:b9:c8:c5:1a:b0:c1:4f:0f:1d:1c:e8:c4:cf:c7:87:52:19:
60852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         9e:64:55:35:bb:34:e1:38:2f:27:08:c5:ca:e7:97:02:90:fd:
60952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         27:cd:8e:5a:08:40:f5:34:ff:70:65:c4:d6:1f:70:4f:d6:2c:
61052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         cb:28:d8:ed:91:b7:eb:35:06:cd:0e:02:a8:51:cd:b7:3e:f9:
61152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         85:16:97:31:7b:42:4c:cb:6f:de:4b:dd:ae:5e:9d:ef:84:83:
61252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         89:f9:0f:a6:5f:e4:93:cc:30:b5:e9:1d:f4:08:f4:e6:e9:58:
61352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         4b:ba
61452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----BEGIN CERTIFICATE-----
61552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * MIIDLTCCApagAwIBAgIJAIoSN+0trQJuMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV
61652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * BAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQKEwdBbmRyb2lkMRAwDgYD
61752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * VQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYwFAYJKoZIhvcNAQkBFgdh
61852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * bmRyb2lkMCAXDTEwMTAwNDAyMjAyOFoYDzIxMTAwOTEwMDIyMDI4WjBtMQswCQYD
61952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * VQQGEwJBTjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4G
62052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * A1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYH
62152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * YW5kcm9pZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAykvqj9pIKmAbcGOE
62252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * KCeadMshJd+bAa9mSrQFp+ki+L14L2iK4yu7xvdwrxtt/W132nJ4hjBAYrXnQZXK
62352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * o3T0RBGNA0J94y18gDnd7Z5SnLrTR90YwHz5Zw1jRii5w3UnfUGRHNBtTLDIPx6x
62452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ET5tYTH2UBvOc3bW2Jotgif40ucCAwEAAaOB0jCBzzAdBgNVHQ4EFgQUFH027WNE
62552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * v0/bfSiWeGrn7M4sQL8wgZ8GA1UdIwSBlzCBlIAUFH027WNEv0/bfSiWeGrn7M4s
62652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * QL+hcaRvMG0xCzAJBgNVBAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQK
62752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYw
62852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * FAYJKoZIhvcNAQkBFgdhbmRyb2lkggkAihI37S2tAm4wDAYDVR0TBAUwAwEB/zAN
62952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * BgkqhkiG9w0BAQUFAAOBgQB88oTA7kCluZSFGas2Ah0XS5j5ucjFGrDBTw8dHOjE
63052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * z8eHUhmeZFU1uzThOC8nCMXK55cCkP0nzY5aCED1NP9wZcTWH3BP1izLKNjtkbfr
63152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * NQbNDgKoUc23PvmFFpcxe0JMy2/eS92uXp3vhIOJ+Q+mX+STzDC16R30CPTm6VhL
63252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ug==
63352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----END CERTIFICATE-----
63452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $
635ab28398a565e5ce8a56cdfd50ac6226e5317cf66The Android Open Source Project     * </pre>
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
63752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom    public static final String rootCert = ""
63852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "-----BEGIN CERTIFICATE-----\n"
63952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "MIIDLTCCApagAwIBAgIJAIoSN+0trQJuMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV\n"
64052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "BAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQKEwdBbmRyb2lkMRAwDgYD\n"
64152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "VQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYwFAYJKoZIhvcNAQkBFgdh\n"
64252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "bmRyb2lkMCAXDTEwMTAwNDAyMjAyOFoYDzIxMTAwOTEwMDIyMDI4WjBtMQswCQYD\n"
64352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "VQQGEwJBTjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4G\n"
64452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "A1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYH\n"
64552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "YW5kcm9pZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAykvqj9pIKmAbcGOE\n"
64652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "KCeadMshJd+bAa9mSrQFp+ki+L14L2iK4yu7xvdwrxtt/W132nJ4hjBAYrXnQZXK\n"
64752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "o3T0RBGNA0J94y18gDnd7Z5SnLrTR90YwHz5Zw1jRii5w3UnfUGRHNBtTLDIPx6x\n"
64852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "ET5tYTH2UBvOc3bW2Jotgif40ucCAwEAAaOB0jCBzzAdBgNVHQ4EFgQUFH027WNE\n"
64952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "v0/bfSiWeGrn7M4sQL8wgZ8GA1UdIwSBlzCBlIAUFH027WNEv0/bfSiWeGrn7M4s\n"
65052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "QL+hcaRvMG0xCzAJBgNVBAYTAkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQK\n"
65152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMRYw\n"
65252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "FAYJKoZIhvcNAQkBFgdhbmRyb2lkggkAihI37S2tAm4wDAYDVR0TBAUwAwEB/zAN\n"
65352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "BgkqhkiG9w0BAQUFAAOBgQB88oTA7kCluZSFGas2Ah0XS5j5ucjFGrDBTw8dHOjE\n"
65452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "z8eHUhmeZFU1uzThOC8nCMXK55cCkP0nzY5aCED1NP9wZcTWH3BP1izLKNjtkbfr\n"
65552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "NQbNDgKoUc23PvmFFpcxe0JMy2/eS92uXp3vhIOJ+Q+mX+STzDC16R30CPTm6VhL\n"
65652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "ug==\n"
65752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "-----END CERTIFICATE-----\n";
658f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Certificate:
661ab28398a565e5ce8a56cdfd50ac6226e5317cf66The Android Open Source Project     * <pre>
66252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ 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
66352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Generating a 1024 bit RSA private key
66452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * .......++++++
66552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ......................++++++
66652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * writing new private key to 'certreq.pem'
66752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----
66852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ openssl x509 -req -in certreq.pem -CA root.pem -CAcreateserial -out cert.pem -days 36500
66952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Signature ok
67052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * subject=/C=AN/ST=Android/L=Android/O=Android/OU=Android/CN=Android Certificate/emailAddress=android
67152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Getting Private key
67252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ rm root.srl
67352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ openssl rsa -in certreq.pem
67452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * writing RSA key
67552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----BEGIN RSA PRIVATE KEY-----
67652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * MIICXQIBAAKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvKGC2X
67752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * lYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMKKzUv
67852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * j0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQIDAQAB
67952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * AoGAS4CQn8Qw6ewc5wLipDpqDYfB5grnGExys7MBgcPUyPPYX2TkHUye7LnD8gxs
68052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * YrtiDcVW8BuGTZkC0EuUesskgiwGLimNiU3vU3LwH7OvtfUTMdvhv9nd2GFlfiQo
68152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * PfwhITZ85GwhDkhiBBXjToDcNc0ntXVgACNAKU1ZlJyoyukCQQDwsGmD0GwKFtJH
68252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * cGXI+IK0aB+pXjujZJU/Ikg+eTPMSWDsKD6ReZu9uJJc8W36Xiki/No1/NZvj0gB
68352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * MwgIkwh7AkEA02FzaGcWLFSHaRfV1wpx1F3Iuu3X2wWqTzBlhGG9ZDQyy7gWZqHJ
68452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * jElCdajiMnbh0mk62hobYy4FcLuvkkJWAwJBAK7FKpkQaqMY1zAQqZg4+4/MW9E8
68552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * H8oRa14gopzanYYlcj+JKYWw7CnjMERU+yrl3LEPMdQp9/uh6wMT7y1qtqkCQCNG
68652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * mxTsRzYEsUhnkuc9Nfvj3tDbSm+hxWdLw1VRXmLvlx6KTSq5i0IfI7kxAva7Ajq0
68752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Fv845iMqFfxXRhiZe3MCQQCxD0vLzEBegLQPgiavGXfBnRPrRrXgkuAJg7Fq/1Vt
68852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * 3InSGat3Tv8GW+pCWWVgmV8iQ4wWReg+Bd03SCSP5uAY
68952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----END RSA PRIVATE KEY-----
69052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $ openssl x509 -in cert.pem -text
69152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Certificate:
69252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *     Data:
69352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Version: 1 (0x0)
69452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Serial Number:
69552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             89:34:5f:d5:01:2e:a2:2b
69652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Signature Algorithm: sha1WithRSAEncryption
69752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Issuer: C=AN, ST=Android, O=Android, OU=Android, CN=Android/emailAddress=android
69852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Validity
69952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Not Before: Oct  4 04:41:54 2010 GMT
70052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Not After : Sep 10 04:41:54 2110 GMT
70152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Subject: C=AN, ST=Android, L=Android, O=Android, OU=Android, CN=Android Certificate/emailAddress=android
70252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         Subject Public Key Info:
70352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             Public Key Algorithm: rsaEncryption
70452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *             RSA Public Key: (1024 bit)
70552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 Modulus (1024 bit):
70652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     00:c6:bd:06:51:07:b7:ec:b8:bb:e7:67:44:b1:e3:
70752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     7b:13:0a:4b:f0:bf:f4:84:62:bc:d1:ba:6c:95:d7:
70852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     a3:82:fa:5b:ca:18:2d:97:95:85:bd:aa:fe:e8:7f:
70952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     cf:21:a9:25:6a:e7:cd:b7:30:1f:ae:10:fd:71:64:
71052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     b5:9a:88:a9:18:c8:49:fb:d9:1c:20:57:f1:ea:07:
71152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     c2:84:80:66:17:11:b3:0a:2b:35:2f:8f:40:f5:5f:
71252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     c9:19:fc:40:c6:aa:c6:63:14:a9:64:ff:bb:19:61:
71352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     c8:37:52:a0:9c:19:48:84:12:cc:d3:69:d8:72:27:
71452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                     a1:5c:a3:01:cc:d4:48:6b:71
71552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *                 Exponent: 65537 (0x10001)
71652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *     Signature Algorithm: sha1WithRSAEncryption
71752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         80:06:54:ba:4c:a2:0d:2e:6b:d5:b0:b1:89:b2:fa:c2:fd:d6:
71852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         02:ab:74:af:fb:1c:bc:47:43:58:89:57:80:ad:59:79:e9:2e:
71952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         d9:60:a7:a6:0f:9c:10:9f:e1:80:a1:66:19:59:7e:11:28:17:
72052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         17:0a:1d:e9:8d:78:e8:c2:61:36:03:fc:42:b1:54:bd:28:39:
72152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         3c:48:fd:3c:79:e7:ca:1a:16:c3:8a:77:42:07:96:14:8c:d2:
72252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         51:ca:8e:db:b8:82:31:84:5e:3f:68:b1:a5:f0:96:ae:a9:ca:
72352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         86:f3:01:76:63:98:65:dd:41:81:11:d7:71:c8:ae:17:c7:20:
72452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     *         e7:22
72552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----BEGIN CERTIFICATE-----
72652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * MIICcjCCAdsCCQCJNF/VAS6iKzANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJB
72752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * TjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMH
72852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * QW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYHYW5kcm9p
72952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * ZDAgFw0xMDEwMDQwNDQxNTRaGA8yMTEwMDkxMDA0NDE1NFowgYsxCzAJBgNVBAYT
73052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * AkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQHEwdBbmRyb2lkMRAwDgYDVQQK
73152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRwwGgYDVQQDExNBbmRyb2lkIENl
73252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * cnRpZmljYXRlMRYwFAYJKoZIhvcNAQkBFgdhbmRyb2lkMIGfMA0GCSqGSIb3DQEB
73352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * AQUAA4GNADCBiQKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvK
73452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * GC2XlYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMK
73552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * KzUvj0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQID
73652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * AQABMA0GCSqGSIb3DQEBBQUAA4GBAIAGVLpMog0ua9WwsYmy+sL91gKrdK/7HLxH
73752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * Q1iJV4CtWXnpLtlgp6YPnBCf4YChZhlZfhEoFxcKHemNeOjCYTYD/EKxVL0oOTxI
73852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * /Tx558oaFsOKd0IHlhSM0lHKjtu4gjGEXj9osaXwlq6pyobzAXZjmGXdQYER13HI
73952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * rhfHIOci
74052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * -----END CERTIFICATE-----
74152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom     * $
742ab28398a565e5ce8a56cdfd50ac6226e5317cf66The Android Open Source Project     * </pre>
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
74452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom    public static final String  endCert = ""
74552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "-----BEGIN CERTIFICATE-----\n"
74652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "MIICcjCCAdsCCQCJNF/VAS6iKzANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJB\n"
74752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "TjEQMA4GA1UECBMHQW5kcm9pZDEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMH\n"
74852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "QW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEWMBQGCSqGSIb3DQEJARYHYW5kcm9p\n"
74952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "ZDAgFw0xMDEwMDQwNDQxNTRaGA8yMTEwMDkxMDA0NDE1NFowgYsxCzAJBgNVBAYT\n"
75052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "AkFOMRAwDgYDVQQIEwdBbmRyb2lkMRAwDgYDVQQHEwdBbmRyb2lkMRAwDgYDVQQK\n"
75152dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "EwdBbmRyb2lkMRAwDgYDVQQLEwdBbmRyb2lkMRwwGgYDVQQDExNBbmRyb2lkIENl\n"
75252dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "cnRpZmljYXRlMRYwFAYJKoZIhvcNAQkBFgdhbmRyb2lkMIGfMA0GCSqGSIb3DQEB\n"
75352dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "AQUAA4GNADCBiQKBgQDGvQZRB7fsuLvnZ0Sx43sTCkvwv/SEYrzRumyV16OC+lvK\n"
75452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "GC2XlYW9qv7of88hqSVq5823MB+uEP1xZLWaiKkYyEn72RwgV/HqB8KEgGYXEbMK\n"
75552dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "KzUvj0D1X8kZ/EDGqsZjFKlk/7sZYcg3UqCcGUiEEszTadhyJ6FcowHM1EhrcQID\n"
75652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "AQABMA0GCSqGSIb3DQEBBQUAA4GBAIAGVLpMog0ua9WwsYmy+sL91gKrdK/7HLxH\n"
75752dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "Q1iJV4CtWXnpLtlgp6YPnBCf4YChZhlZfhEoFxcKHemNeOjCYTYD/EKxVL0oOTxI\n"
75852dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "/Tx558oaFsOKd0IHlhSM0lHKjtu4gjGEXj9osaXwlq6pyobzAXZjmGXdQYER13HI\n"
75952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "rhfHIOci\n"
76052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            + "-----END CERTIFICATE-----\n";
761f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a self signed certificate
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static X509Certificate rootCertificateSS;
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static X509Certificate endCertificate;
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static MyCRL crl;
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static X509CertSelector theCertSelector;
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static CertPathBuilder builder;
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static CertStore store;
775f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void initCertPathSSCertChain() throws CertificateException,
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InvalidAlgorithmParameterException, NoSuchAlgorithmException,
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IOException {
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // create certificates and CRLs
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayInputStream bi = new ByteArrayInputStream(rootCert.getBytes());
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        rootCertificateSS = (X509Certificate) cf.generateCertificate(bi);
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bi = new ByteArrayInputStream(endCert.getBytes());
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        endCertificate = (X509Certificate) cf.generateCertificate(bi);
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        BigInteger revokedSerialNumber = BigInteger.valueOf(1);
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        crl = new MyCRL("X.509");
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        X509CRL rootCRL = X509CRL;
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        X509CRL interCRL = X509CRLExample.createCRL(interCert, interPair
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//                .getPrivate(), revokedSerialNumber);
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // create CertStore to support path building
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        List<Object> list = new ArrayList<Object>();
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        list.add(rootCertificateSS);
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        list.add(endCertificate);
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CollectionCertStoreParameters params = new CollectionCertStoreParameters(
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                list);
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        store = CertStore.getInstance("Collection", params);
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        theCertSelector = new X509CertSelector();
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        theCertSelector.setCertificate(endCertificate);
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        theCertSelector.setIssuer(endCertificate.getIssuerX500Principal()
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .getEncoded());
805f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
80652dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom        // build the path
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        builder = CertPathBuilder.getInstance("PKIX");
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
810f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static CertPathBuilder getCertPathBuilder() {
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (builder == null) {
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(
81452dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom            "Call initCertPathSSCertChain prior to initCertPathSSCertChain");
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return builder;
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
818f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
81952dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom    public static CertPath buildCertPathSSCertChain() throws Exception {
82052dea0ad773d902ad8402e1354afe0842dd364b5Brian Carlstrom        return builder.build(getCertPathParameters()).getCertPath();
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static CertPathParameters getCertPathParameters()
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidAlgorithmParameterException {
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((rootCertificateSS == null) || (theCertSelector == null)
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || (builder == null)) {
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new RuntimeException(
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "Call initCertPathSSCertChain prior to buildCertPath");
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PKIXBuilderParameters buildParams = new PKIXBuilderParameters(
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Collections.singleton(new TrustAnchor(rootCertificateSS, null)),
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                theCertSelector);
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buildParams.addCertStore(store);
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buildParams.setRevocationEnabled(false);
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buildParams;
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
841