1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Alexander V. Astapchuk
208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.support;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectInputStream;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectOutputStream;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.Serializable;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.StreamCorruptedException;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.math.BigInteger;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidKeyException;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchProviderException;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Principal;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Provider;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.PublicKey;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Security;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.SignatureException;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.*;
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.*;
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.security.auth.x500.X500Principal;
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The class contains various utility methods used during the java.security
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * classes testing.
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic final class TestCertUtils {
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private TestCertUtils() {
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        throw new Error("statics only");
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Returns new instance of test certificate each time the method is called.
598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @return test certificate
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Certificate getCert() {
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestCertificate();
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Returns an array of 3 test certificates. IMP: The array returned is not
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * real chain of certificates, it's just an array of 3 certs. The method
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * returns new array each time it's called. The number of 3 was chosen
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * arbitrarily and is subject to change.
718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @return an array of 3 certificates
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Certificate[] getCertChain() {
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Certificate[] chain = { new TestCertificate(), new TestCertificate(),
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new TestCertificate() };
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return chain;
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Returns a test CertPath, which uses getCertChain() to obtain a list of
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * certificates to store.
838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @return test cert path
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static CertPath getCertPath() {
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestCertPath();
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Generates and returns an instance of TestCertPath.<br>
928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * TestCertificate-s included in the CertPath will be uniq (will have
938d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * different numbers passed to their ctor-s).<br>
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The second arguments shows which number will have the first Certificate
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * in the CertPath. The second certificate will have (startID+1) number
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * and so on.
978d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @param howMany - shows how many TestCerts must contain the CertPath generated
998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @param startID - specifies the starting ID which the first certificate will have
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @return TestCertPath
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static CertPath genCertPath(int howMany, int startID) {
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Certificate[] certs = new Certificate[howMany];
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < howMany; i++) {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certs[i] = new TestCertificate(Integer.toString(startID + i));
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestCertPath(certs);
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static Provider provider = null;
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final String providerName = "TstPrvdr";
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * A Principal used to form rootCA's certificate
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static final X500Principal rootPrincipal = new X500Principal(
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            UniGen.rootName);
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Some fake rootCA's certificate.
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static final X509Certificate rootCA = new TestX509Certificate(
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            rootPrincipal, rootPrincipal);
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static void install_test_x509_factory() {
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (provider == null) {
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            provider = new TestProvider(providerName, 0.01,
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "Test provider for serialization testing");
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.insertProviderAt(provider, 1);
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static void uninstall_test_x509_factory() {
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (provider != null) {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Security.removeProvider(providerName);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            provider = null;
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The class represents test certificate path.
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static final class TestCertPath extends CertPath implements
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Serializable {
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final String serializedData = "Just a dummy string to be serialized instead of real data";
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Certificate[] certs;
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * Default ctor for TestCertPath. Uses {@link TestCertUtils#getCertChain()}
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * to obtain list of certificates.<br>
1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * All TestCertPath-s constructed via this ctor will be equals() to each
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * other.
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestCertPath() {
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super("testCertPath");
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certs = getCertChain();
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * Constructs TestCertPath and keeps the given array of certificates.<br>
1688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * The TestCertPaths constructed via this ctor may be different (if they
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * have different set of certificates)<br>
1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param certs
1728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * @see TestCertUtils#genCertPath(int, int)
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestCertPath(Certificate[] certs) {
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super("testCertPath");
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.certs = certs;
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        /**
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @see java.security.cert.CertPath#getCertificates()
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public List getCertificates() {
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return Arrays.asList(certs);
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1868d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        /**
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @see java.security.cert.CertPath#getEncoded()
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getEncoded() throws CertificateEncodingException {
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return encoded.clone();
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @see java.security.cert.CertPath#getEncoded(java.lang.String)
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getEncoded(String encoding)
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateEncodingException {
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return encoded.clone();
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @see java.security.cert.CertPath#getEncodings()
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Iterator getEncodings() {
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Vector v = new Vector();
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            v.add("myTestEncoding");
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return v.iterator();
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
2098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String toString() {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            StringBuffer buf = new StringBuffer(200);
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            buf.append("TestCertPath. certs count=");
2138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            if (certs == null) {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                buf.append("0\n");
2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            } else {
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                buf.append(certs.length).append("\n");
2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                for (int i = 0; i < certs.length; i++) {
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    buf.append("\t").append(i).append(" ");
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    buf.append(certs[i]).append("\n");
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return buf.toString();
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Writes<br>
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * (String) serializedData<br>
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * (int) number of certificates in this CertPath<br>
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * <array of certificates>
2308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param out
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @throws IOException
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void writeObject(ObjectOutputStream out) throws IOException {
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out.writeUTF(serializedData);
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (certs == null) {
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.writeInt(0);
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.writeInt(certs.length);
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (int i = 0; i < certs.length; i++) {
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    out.writeObject(certs[i]);
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void readObject(ObjectInputStream in) throws IOException,
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ClassNotFoundException {
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String s = in.readUTF();
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (!serializedData.equals(s)) {
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new StreamCorruptedException("expect [" + serializedData
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        + "] got [" + s + "]");
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int count = in.readInt();
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            certs = new Certificate[count];
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < count; i++) {
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                certs[i] = (Certificate) in.readObject();
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object writeReplace() {
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return this;
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object readResolve() {
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return this;
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The class represents empty PublicKey.
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static final class TestPublicKey implements PublicKey {
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final String algo = "testPublicKeyAlgorithm";
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final String format = "testPublicKeyFormat";
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getAlgorithm() {
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return algo;
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getEncoded() {
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return encoded.clone();
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getFormat() {
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return format;
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * The class represents test certificate.
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestCertificate extends Certificate implements
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Serializable {
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final byte[] encoded = new byte[] { 1, 2, 3, 4, 5, 6, 7,
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static final String TYPE = "Test";
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // A String that makes different TestCertificates to be different.
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private String diff = null;
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Default ctor. All the TestCertificate-s created with this ctor are equals() to each other.
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Use TestCertificate(String) if you need non equal TestCertificate-s.
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestCertificate() {
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(TYPE);
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * A special purpose ctor. Pass different String-s to have different TestCertificates.
3218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * TestCertificate-s with the same String passed to this ctor are considered equal.
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestCertificate(String diff) {
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(TYPE);
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.diff = diff;
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
3298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * A ctor that allows to specify both the TYPE of certificate and the
3308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * diff. Leave the <code>diff</code> null when no difference needed.
3318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param diff
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param type
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestCertificate(String diff, String type) {
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(type);
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.diff = diff;
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getEncoded() throws CertificateEncodingException {
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return encoded.clone();
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void verify(PublicKey key) throws CertificateException,
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NoSuchAlgorithmException, InvalidKeyException,
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NoSuchProviderException, SignatureException {
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // do nothing
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void verify(PublicKey key, String sigProvider)
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateException, NoSuchAlgorithmException,
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                InvalidKeyException, NoSuchProviderException,
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                SignatureException {
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // do nothing
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String toString() {
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return "Test certificate - for unit testing only";
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean equals(Object obj) {
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (obj == null || !(obj instanceof TestCertificate)) {
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return false;
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            TestCertificate that = (TestCertificate) obj;
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (this == that) {
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return true;
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (this.diff == null) {
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return that.diff == null;
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return this.diff.equals(that.diff);
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public PublicKey getPublicKey() {
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return new TestPublicKey();
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Writes:<br>
3828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * boolean - true if this certificate has a diff string,
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * false otherwise, followed by <br>
3848d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * writeUTF() of string (if presented)
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         *
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param out
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @throws IOException
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void writeObject(ObjectOutputStream out) throws IOException {
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (diff == null) {
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.writeBoolean(false);
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.writeBoolean(false);
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.writeUTF(diff);
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void readObject(ObjectInputStream in) throws IOException,
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ClassNotFoundException {
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean hasDiffString = in.readBoolean();
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (hasDiffString) {
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                diff = in.readUTF();
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object writeReplace() {
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return this;
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object readResolve() {
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return this;
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestInvalidX509Certificate extends TestX509Certificate {
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestInvalidX509Certificate(X500Principal subj,
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                X500Principal issuer) {
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(subj, issuer);
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * TestX509CErtificate.<br>
4248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Does nothing interesting, but<br>
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * a) is not abstract, so it can be instantiated<br>
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * b) returns Encoded form<br>
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestX509Certificate extends X509Certificate {
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private X500Principal subject;
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private X500Principal issuer;
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestX509Certificate(X500Principal subj, X500Principal issuer) {
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.subject = subj;
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.issuer = issuer;
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public X500Principal getIssuerX500Principal() {
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return issuer;
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public X500Principal getSubjectX500Principal() {
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return subject;
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * The encoded for of this X509Certificate is a byte array where
4488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * first are bytes of encoded form of Subject (as X500Principal),
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * followed by one zero byte
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * and followed by the encoded form of Issuer (as X500Principal)
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getEncoded() throws CertificateEncodingException {
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] asubj = subject.getEncoded();
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] aissuer = issuer.getEncoded();
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] data = new byte[asubj.length + aissuer.length + 1];
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(asubj, 0, data, 0, asubj.length);
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //data[asubj.length] = 0;
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .arraycopy(aissuer, 0, data, asubj.length + 1,
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            aissuer.length);
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return data;
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void checkValidity() throws CertificateExpiredException,
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                CertificateNotYetValidException {
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void checkValidity(Date date)
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateExpiredException,
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                CertificateNotYetValidException {
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public int getBasicConstraints() {
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return 0;
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Principal getIssuerDN() {
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean[] getIssuerUniqueID() {
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean[] getKeyUsage() {
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Date getNotAfter() {
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Date getNotBefore() {
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public BigInteger getSerialNumber() {
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getSigAlgName() {
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getSigAlgOID() {
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getSigAlgParams() {
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getSignature() {
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Principal getSubjectDN() {
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean[] getSubjectUniqueID() {
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getTBSCertificate() throws CertificateEncodingException {
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public int getVersion() {
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return 0;
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Set getCriticalExtensionOIDs() {
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public byte[] getExtensionValue(String oid) {
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Set getNonCriticalExtensionOIDs() {
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean hasUnsupportedCriticalExtension() {
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public PublicKey getPublicKey() {
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String toString() {
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void verify(PublicKey key, String sigProvider)
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateException, NoSuchAlgorithmException,
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                InvalidKeyException, NoSuchProviderException,
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                SignatureException {
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void verify(PublicKey key) throws CertificateException,
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NoSuchAlgorithmException, InvalidKeyException,
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                NoSuchProviderException, SignatureException {
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
5738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * TestProvider. Does nothing, but pretends to
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * implement X.509 CertificateFactory.
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestProvider extends Provider {
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Provider.Service serv;
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestProvider(String name, double version, String info) {
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(name, version, info);
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            serv = new Provider.Service(this, "CertificateFactory", "X.509",
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    TestFactorySpi.class.getName(), new ArrayList(), null);
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public synchronized Set getServices() {
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            HashSet s = new HashSet();
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s.add(serv);
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return s;
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Some kind of Certificate Factory, used during unit testing.
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestFactorySpi extends CertificateFactorySpi {
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
5998d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * Tries to create an instance of TestX509Certificate, basing
6008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * on the presumption that its {@link TestX509Certificate#getEncoded()
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * encoded} form is stored.<br>
6028d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
6038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * @throws CertificateException is the presumption is not met or if
6048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *                              any IO problem occurs.
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Certificate engineGenerateCertificate(InputStream is)
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateException {
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] data = new byte[0];
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] chunk = new byte[1024];
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int len;
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                while ((len = is.read(chunk)) > 0) {
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    byte[] tmp = new byte[data.length + len];
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.arraycopy(data, 0, tmp, 0, data.length);
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    System.arraycopy(chunk, 0, tmp, data.length, len);
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    data = tmp;
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (IOException ex) {
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new CertificateException("IO problem", ex);
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int pos = Arrays.binarySearch(data, (byte) 0);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (pos < 0) {
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new CertificateException("invalid format");
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] subjNameData = new byte[pos];
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(data, 0, subjNameData, 0, subjNameData.length);
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] issNameData = new byte[data.length - pos - 1];
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            System.arraycopy(data, pos + 1, issNameData, 0, issNameData.length);
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            X500Principal subjName = new X500Principal(subjNameData);
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            X500Principal issName = new X500Principal(issNameData);
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return new TestX509Certificate(subjName, issName);
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Not supported yet.
6368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @throws UnsupportedOperationException
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Collection engineGenerateCertificates(InputStream inStream)
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateException {
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new UnsupportedOperationException("not yet.");
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Not supported yet.
6468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @throws UnsupportedOperationException
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public CRL engineGenerateCRL(InputStream inStream) throws CRLException {
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new UnsupportedOperationException("not yet.");
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Not supported yet.
6558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @throws UnsupportedOperationException
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Collection engineGenerateCRLs(InputStream inStream)
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CRLException {
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new UnsupportedOperationException("not yet.");
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * Returns an instance of TestCertPath.<br>
6658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
6668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * @throws CertificateException if
6678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *                              a) any of Certificates passed is not an instance of X509Certificate
6688d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *                              b) any of Certificates passed is an instance of TestInvalidX509Certificate
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public CertPath engineGenerateCertPath(List certs)
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws CertificateException {
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ArrayList validCerts = new ArrayList();
6738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (Iterator i = certs.iterator(); i.hasNext(); ) {
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Certificate c = (Certificate) i.next();
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (!(c instanceof X509Certificate)) {
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    throw new CertificateException("Not X509: " + c);
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (c instanceof TestInvalidX509Certificate) {
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    throw new CertificateException("Invalid (test) X509: " + c);
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                validCerts.add(c);
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Certificate[] acerts = new Certificate[validCerts.size()];
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            validCerts.toArray(acerts);
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return new TestCertPath(acerts);
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Utility class used to generate some amount of uniq names.
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class UniGen {
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static final String rootName = "CN=Alex Astapchuk, OU=SSG, O=Intel ZAO, C=RU";
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final String datasNames[] = { "CN", "OU", "O", "C" };
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final String datas[][] = {
6988d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                // Names database
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { "Alex Astapchuk", null, null, null },
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { "John Doe", null, null, null },
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // 'organisation unit'-s
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, "SSG", null, null }, { null, "SSG/DRL", null, null },
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // organizations
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, null, "Intel ZAO", null },
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, null, "Intel Inc", null },
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // countries
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, null, null, "RU" }, { null, null, null, "US" },
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, null, null, "GB" }, { null, null, null, "JA" },
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { null, null, null, "KO" }, { null, null, null, "TW" }, };
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Returns a string from <code>data</code> from a given column and
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // position. The positions are looked for first non-null entry. If there
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // are no non empty items left, then it scans column starting from the
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // beginning.
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @param col
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @param startRow
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @return
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static String getData(int col, int startRow) {
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            startRow = startRow % datas.length;
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = startRow; i < datas.length; i++) {
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (datas[i][col] != null) {
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return datas[i][col];
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // no non-null entries left, check from the beginning
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < datas.length; i++) {
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (datas[i][col] != null) {
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return datas[i][col];
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // can't be
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new Error();
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Increments a num.<br>
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // <code>num</code> is interpreted as a number with a base of
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // <code>base</code> and each digit of this number is stored as a
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // separate num's element.
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @param num
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @param base
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // @return <b>true</b> if overflow happened
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static boolean inc(int[] num, int base) {
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < num.length; i++) {
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if ((++num[i]) >= base) {
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    num[i] = 0;
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } else {
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return false;
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return true;
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
7608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * Generates some amount of uniq names, none of which is equals to
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * {@link #rootName}.
7628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param howMany
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @return
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static String[] genNames(int howMany) {
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int counts[] = new int[datasNames.length];
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ArrayList al = new ArrayList();
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // not really the thrifty algorithm...
7718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            for (int i = 0; i < howMany; ) {
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //                System.out.print("#"+i+": ");
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //                for( int j=0; j<counts.length; j++) {
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //                    System.out.print(""+counts[j]+"|");
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //                }
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //                System.out.println();
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                StringBuffer buf = new StringBuffer();
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                int j = 0;
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (; j < datasNames.length - 1; j++) {
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    String name = datasNames[j];
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    String val = getData(j, counts[j]);
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    buf.append(name).append('=').append(val).append(",");
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String name = datasNames[j];
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                String val = getData(j, counts[j]);
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                buf.append(name).append('=').append(val);
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                name = buf.toString();
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (!(rootName.equals(name) || al.contains(name))) {
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ++i;
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    al.add(name);
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    //                    System.out.println("generated: "+name);
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } else {
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    //                    System.out.println("rejected: "+name);
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                if (inc(counts, datas.length)) {
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    // if this happened, then just add some data into 'datas'
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    throw new Error(
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            "cant generate so many uniq names. sorry. add some more data.");
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return (String[]) al.toArray(new String[al.size()]);
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /**
8108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         * Generates some amount of uniq X500Principals, none of which is equals
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * has a string equals to {@link #rootName}.
8128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath         *
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @param howMany
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * @return
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static X500Principal[] genX500s(int howMany) {
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String names[] = genNames(howMany);
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            X500Principal[] ps = new X500Principal[howMany];
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < howMany; i++) {
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ps[i] = new X500Principal(names[i]);
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return ps;
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
829