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