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