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 Alexander V. Astapchuk
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;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.StreamCorruptedException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Principal;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PublicKey;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SignatureException;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.*;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.*;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.x500.X500Principal;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The class contains various utility methods used during the java.security
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * classes testing.
50f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class TestCertUtils {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private TestCertUtils() {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new Error("statics only");
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns new instance of test certificate each time the method is called.
61f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return test certificate
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Certificate getCert() {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new TestCertificate();
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an array of 3 test certificates. IMP: The array returned is not
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * real chain of certificates, it's just an array of 3 certs. The method
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns new array each time it's called. The number of 3 was chosen
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * arbitrarily and is subject to change.
73f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an array of 3 certificates
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Certificate[] getCertChain() {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate[] chain = { new TestCertificate(), new TestCertificate(),
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new TestCertificate() };
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return chain;
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a test CertPath, which uses getCertChain() to obtain a list of
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * certificates to store.
85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return test cert path
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static CertPath getCertPath() {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new TestCertPath();
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generates and returns an instance of TestCertPath.<br>
94f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * TestCertificate-s included in the CertPath will be uniq (will have
95f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * different numbers passed to their ctor-s).<br>
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The second arguments shows which number will have the first Certificate
97f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * in the CertPath. The second certificate will have (startID+1) number
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and so on.
99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param howMany - shows how many TestCerts must contain the CertPath generated
101f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @param startID - specifies the starting ID which the first certificate will have
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return TestCertPath
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static CertPath genCertPath(int howMany, int startID) {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate[] certs = new Certificate[howMany];
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < howMany; i++) {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certs[i] = new TestCertificate(Integer.toString(startID + i));
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new TestCertPath(certs);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static Provider provider = null;
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final String providerName = "TstPrvdr";
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A Principal used to form rootCA's certificate
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final X500Principal rootPrincipal = new X500Principal(
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            UniGen.rootName);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Some fake rootCA's certificate.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final X509Certificate rootCA = new TestX509Certificate(
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            rootPrincipal, rootPrincipal);
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void install_test_x509_factory() {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider == null) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            provider = new TestProvider(providerName, 0.01,
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    "Test provider for serialization testing");
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Security.insertProviderAt(provider, 1);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void uninstall_test_x509_factory() {
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider != null) {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Security.removeProvider(providerName);
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            provider = null;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The class represents test certificate path.
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final class TestCertPath extends CertPath implements
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Serializable {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final String serializedData = "Just a dummy string to be serialized instead of real data";
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Certificate[] certs;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * Default ctor for TestCertPath. Uses {@link TestCertUtils#getCertChain()}
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * to obtain list of certificates.<br>
161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * All TestCertPath-s constructed via this ctor will be equals() to each
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * other.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestCertPath() {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super("testCertPath");
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certs = getCertChain();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * Constructs TestCertPath and keeps the given array of certificates.<br>
171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * The TestCertPaths constructed via this ctor may be different (if they
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * have different set of certificates)<br>
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @see TestCertUtils#genCertPath(int, int)
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param certs
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestCertPath(Certificate[] certs) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super("testCertPath");
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.certs = certs;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        /**
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @see java.security.cert.CertPath#getCertificates()
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public List<Certificate> getCertificates() {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return Arrays.asList(certs);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        /**
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @see java.security.cert.CertPath#getEncoded()
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() throws CertificateEncodingException {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return encoded.clone();
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @see java.security.cert.CertPath#getEncoded(java.lang.String)
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded(String encoding)
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateEncodingException {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return encoded.clone();
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @see java.security.cert.CertPath#getEncodings()
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Iterator<String> getEncodings() {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Vector<String> v = new Vector<String>();
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            v.add("myTestEncoding");
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return v.iterator();
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
211f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            StringBuffer buf = new StringBuffer(200);
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            buf.append("TestCertPath. certs count=");
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if( certs == null ) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buf.append("0\n");
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buf.append(certs.length).append("\n");
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for( int i=0; i<certs.length; i++) {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    buf.append("\t").append(i).append(" ");
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    buf.append(certs[i]).append("\n");
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return buf.toString();
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Writes<br>
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * (String) serializedData<br>
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * (int) number of certificates in this CertPath<br>
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * <array of certificates>
233f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param out
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IOException
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void writeObject(ObjectOutputStream out) throws IOException {
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            out.writeUTF(serializedData);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (certs == null) {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.writeInt(0);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.writeInt(certs.length);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (int i = 0; i < certs.length; i++) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    out.writeObject(certs[i]);
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void readObject(ObjectInputStream in) throws IOException,
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ClassNotFoundException {
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String s = in.readUTF();
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!serializedData.equals(s)) {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new StreamCorruptedException("expect [" + serializedData
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        + "] got [" + s + "]");
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int count = in.readInt();
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certs = new Certificate[count];
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < count; i++) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                certs[i] = (Certificate) in.readObject();
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object writeReplace() {
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this;
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object readResolve() {
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this;
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The class represents empty PublicKey.
274f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final class TestPublicKey implements PublicKey {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final String algo = "testPublicKeyAlgorithm";
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final String format = "testPublicKeyFormat";
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getAlgorithm() {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return algo;
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return encoded.clone();
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getFormat() {
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return format;
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The class represents test certificate.
300f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestCertificate extends Certificate implements
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Serializable {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final String TYPE = "Test";
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
311f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        //
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // A String that makes different TestCertificates to be different.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private String diff = null;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Default ctor. All the TestCertificate-s created with this ctor are equals() to each other.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Use TestCertificate(String) if you need non equal TestCertificate-s.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestCertificate() {
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(TYPE);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * A special purpose ctor. Pass different String-s to have different TestCertificates.
326f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * TestCertificate-s with the same String passed to this ctor are considered equal.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestCertificate(String diff) {
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(TYPE);
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.diff = diff;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
334f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * A ctor that allows to specify both the TYPE of certificate and the
335f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * diff. Leave the <code>diff</code> null when no difference needed.
336f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param diff
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param type
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestCertificate(String diff, String type) {
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(type);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.diff = diff;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() throws CertificateEncodingException {
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return encoded.clone();
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void verify(PublicKey key) throws CertificateException,
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                NoSuchAlgorithmException, InvalidKeyException,
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                NoSuchProviderException, SignatureException {
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // do nothing
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void verify(PublicKey key, String sigProvider)
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateException, NoSuchAlgorithmException,
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                InvalidKeyException, NoSuchProviderException,
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                SignatureException {
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // do nothing
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return "Test certificate - for unit testing only";
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean equals(Object obj) {
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (obj == null || !(obj instanceof TestCertificate)) {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            TestCertificate that = (TestCertificate) obj;
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this == that) {
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (this.diff == null) {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return that.diff == null;
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this.diff.equals(that.diff);
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public PublicKey getPublicKey() {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new TestPublicKey();
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Writes:<br>
387f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * boolean - true if this certificate has a diff string,
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * false otherwise, followed by <br>
389f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * writeUTF() of string (if presented)
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param out
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IOException
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void writeObject(ObjectOutputStream out) throws IOException {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (diff == null) {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.writeBoolean(false);
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.writeBoolean(false);
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                out.writeUTF(diff);
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private void readObject(ObjectInputStream in) throws IOException,
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ClassNotFoundException {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            boolean hasDiffString = in.readBoolean();
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (hasDiffString) {
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                diff = in.readUTF();
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object writeReplace() {
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this;
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Object readResolve() {
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return this;
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestInvalidX509Certificate extends TestX509Certificate {
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestInvalidX509Certificate(X500Principal subj,
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                X500Principal issuer) {
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(subj, issuer);
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
428f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * TestX509CErtificate.<br>
430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Does nothing interesting, but<br>
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a) is not abstract, so it can be instantiated<br>
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * b) returns Encoded form<br>
433f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestX509Certificate extends X509Certificate {
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private X500Principal subject;
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private X500Principal issuer;
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestX509Certificate(X500Principal subj, X500Principal issuer) {
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.subject = subj;
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.issuer = issuer;
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public X500Principal getIssuerX500Principal() {
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return issuer;
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public X500Principal getSubjectX500Principal() {
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return subject;
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The encoded for of this X509Certificate is a byte array where
455f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * first are bytes of encoded form of Subject (as X500Principal),
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * followed by one zero byte
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * and followed by the encoded form of Issuer (as X500Principal)
458f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() throws CertificateEncodingException {
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] asubj = subject.getEncoded();
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] aissuer = issuer.getEncoded();
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] data = new byte[asubj.length + aissuer.length + 1];
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(asubj, 0, data, 0, asubj.length);
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //data[asubj.length] = 0;
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .arraycopy(aissuer, 0, data, asubj.length + 1,
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            aissuer.length);
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return data;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void checkValidity() throws CertificateExpiredException,
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                CertificateNotYetValidException {
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void checkValidity(Date date)
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateExpiredException,
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                CertificateNotYetValidException {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int getBasicConstraints() {
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Principal getIssuerDN() {
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean[] getIssuerUniqueID() {
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean[] getKeyUsage() {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Date getNotAfter() {
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Date getNotBefore() {
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public BigInteger getSerialNumber() {
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getSigAlgName() {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getSigAlgOID() {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getSigAlgParams() {
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getSignature() {
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Principal getSubjectDN() {
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean[] getSubjectUniqueID() {
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getTBSCertificate() throws CertificateEncodingException {
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int getVersion() {
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return 0;
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Set getCriticalExtensionOIDs() {
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getExtensionValue(String oid) {
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Set getNonCriticalExtensionOIDs() {
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean hasUnsupportedCriticalExtension() {
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public PublicKey getPublicKey() {
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void verify(PublicKey key, String sigProvider)
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateException, NoSuchAlgorithmException,
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                InvalidKeyException, NoSuchProviderException,
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                SignatureException {
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void verify(PublicKey key) throws CertificateException,
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                NoSuchAlgorithmException, InvalidKeyException,
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                NoSuchProviderException, SignatureException {
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
581f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * TestProvider. Does nothing, but pretends to
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implement X.509 CertificateFactory.
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestProvider extends Provider {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Provider.Service serv;
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TestProvider(String name, double version, String info) {
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(name, version, info);
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            serv = new Provider.Service(this, "CertificateFactory", "X.509",
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    TestFactorySpi.class.getName(), new ArrayList<String>(), null);
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public synchronized Set<Provider.Service> getServices() {
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            HashSet<Provider.Service> s = new HashSet<Service>();
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            s.add(serv);
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return s;
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Some kind of Certificate Factory, used during unit testing.
603f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
604f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class TestFactorySpi extends CertificateFactorySpi {
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
609f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * Tries to create an instance of TestX509Certificate, basing
610f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * on the presumption that its {@link TestX509Certificate#getEncoded()
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * encoded} form is stored.<br>
612f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * @throws CertificateException is the presumption is not met or if
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * any IO problem occurs.
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Certificate engineGenerateCertificate(InputStream is)
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateException {
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] data = new byte[0];
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] chunk = new byte[1024];
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int len;
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                while ((len = is.read(chunk)) > 0) {
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    byte[] tmp = new byte[data.length + len];
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    System.arraycopy(data, 0, tmp, 0, data.length);
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    System.arraycopy(chunk, 0, tmp, data.length, len);
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    data = tmp;
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException ex) {
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new CertificateException("IO problem", ex);
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int pos = Arrays.binarySearch(data, (byte) 0);
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (pos < 0) {
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new CertificateException("invalid format");
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] subjNameData = new byte[pos];
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(data, 0, subjNameData, 0, subjNameData.length);
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] issNameData = new byte[data.length - pos - 1];
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(data, pos + 1, issNameData, 0, issNameData.length);
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X500Principal subjName = new X500Principal(subjNameData);
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X500Principal issName = new X500Principal(issNameData);
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new TestX509Certificate(subjName, issName);
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Not supported yet.
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws UnsupportedOperationException
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Collection engineGenerateCertificates(InputStream inStream)
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateException {
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new UnsupportedOperationException("not yet.");
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Not supported yet.
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws UnsupportedOperationException
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public CRL engineGenerateCRL(InputStream inStream) throws CRLException {
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new UnsupportedOperationException("not yet.");
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Not supported yet.
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws UnsupportedOperationException
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Collection engineGenerateCRLs(InputStream inStream)
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CRLException {
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new UnsupportedOperationException("not yet.");
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns an instance of TestCertPath.<br>
671f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * @throws CertificateException if
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * a) any of Certificates passed is not an instance of X509Certificate
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * b) any of Certificates passed is an instance of TestInvalidX509Certificate
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public CertPath engineGenerateCertPath(List certs)
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws CertificateException {
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ArrayList<Certificate> validCerts = new ArrayList<Certificate>();
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (Iterator i = certs.iterator(); i.hasNext();) {
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Certificate c = (Certificate) i.next();
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!(c instanceof X509Certificate)) {
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new CertificateException("Not X509: " + c);
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (c instanceof TestInvalidX509Certificate) {
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new CertificateException("Invalid (test) X509: " + c);
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                validCerts.add(c);
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Certificate[] acerts = new Certificate[validCerts.size()];
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            validCerts.toArray(acerts);
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new TestCertPath(acerts);
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Utility class used to generate some amount of uniq names.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class UniGen {
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final String rootName = "CN=Alex Astapchuk, OU=SSG, O=Intel ZAO, C=RU";
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final String datasNames[] = { "CN", "OU", "O", "C" };
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static final String datas[][] = {
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Names database
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { "Alex Astapchuk", null, null, null },
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { "John Doe", null, null, null },
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // 'organisation unit'-s
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, "SSG", null, null }, { null, "SSG/DRL", null, null },
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // organizations
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, null, "Intel ZAO", null },
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, null, "Intel Inc", null },
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // countries
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, null, null, "RU" }, { null, null, null, "US" },
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, null, null, "GB" }, { null, null, null, "JA" },
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                { null, null, null, "KO" }, { null, null, null, "TW" }, };
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
717f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // Returns a string from <code>data</code> from a given column and
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // position. The positions are looked for first non-null entry. If there
719f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // are no non empty items left, then it scans column starting from the
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // beginning.
721f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        //
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // @param col
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // @param startRow
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // @return
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static String getData(int col, int startRow) {
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            startRow = startRow % datas.length;
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = startRow; i < datas.length; i++) {
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (datas[i][col] != null) {
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return datas[i][col];
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
733f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            // no non-null entries left, check from the beginning
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < datas.length; i++) {
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (datas[i][col] != null) {
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return datas[i][col];
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // can't be
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new Error();
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Increments a num.<br>
745f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // <code>num</code> is interpreted as a number with a base of
746f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // <code>base</code> and each digit of this number is stored as a
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // separate num's element.
748f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        //
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // @param num
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // @param base
751f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // @return <b>true</b> if overflow happened
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static boolean inc(int[] num, int base) {
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < num.length; i++) {
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if ((++num[i]) >= base) {
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    num[i] = 0;
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return false;
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
765f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * Generates some amount of uniq names, none of which is equals to
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@link #rootName}.
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param howMany
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static String[] genNames(int howMany) {
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int counts[] = new int[datasNames.length];
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ArrayList<String> al = new ArrayList<String>();
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
774f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            // not really the thrifty algorithm...
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < howMany;) {
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                System.out.print("#"+i+": ");
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                for( int j=0; j<counts.length; j++) {
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                    System.out.print(""+counts[j]+"|");
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                }
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //                System.out.println();
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                StringBuffer buf = new StringBuffer();
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int j = 0;
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                for (; j < datasNames.length - 1; j++) {
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String name = datasNames[j];
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String val = getData(j, counts[j]);
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    buf.append(name).append('=').append(val).append(",");
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String name = datasNames[j];
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                String val = getData(j, counts[j]);
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                buf.append(name).append('=').append(val);
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                name = buf.toString();
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!(rootName.equals(name) || al.contains(name))) {
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ++i;
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    al.add(name);
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    //                    System.out.println("generated: "+name);
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } else {
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    //                    System.out.println("rejected: "+name);
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (inc(counts, datas.length)) {
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // if this happened, then just add some data into 'datas'
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new Error(
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            "cant generate so many uniq names. sorry. add some more data.");
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (String[]) al.toArray(new String[al.size()]);
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
814f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * Generates some amount of uniq X500Principals, none of which is equals
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * has a string equals to {@link #rootName}.
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param howMany
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static X500Principal[] genX500s(int howMany) {
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String names[] = genNames(howMany);
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            X500Principal[] ps = new X500Principal[howMany];
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < howMany; i++) {
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ps[i] = new X500Principal(names[i]);
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return ps;
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
832