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