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