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 Projectpackage java.security.cert; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.NotSerializableException; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamException; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamField; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PublicKey; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SignatureException; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Abstract class to represent identity certificates. It represents a way to 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * verify the binding of a Principal and its public key. Examples are X.509, 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PGP, and SDSI. 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Certificate implements Serializable { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -3585440601605666277L; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The standard name of the certificate type 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String type; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code Certificate} with the specified type. 462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate type. 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Certificate(String type) { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.type = type; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificate type. 562f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate type. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getType() { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return type; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the argument to the certificate, and returns {@code true} if they 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * represent the <em>same</em> object using a class specific comparison. The 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation in Object returns {@code true} only if the argument is the 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exact same object as the callee (==). 682f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param other 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the object to compare with this object. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the object is the same as this object, {@code 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * false} if it is different from this object. 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #hashCode 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean equals(Object other) { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // obj equal to itself 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this == other) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (other instanceof Certificate) { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check that encoded forms match 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Arrays.equals(this.getEncoded(), 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ((Certificate)other).getEncoded()); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CertificateEncodingException e) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an integer hash code for the certificate. Any two objects which 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * return {@code true} when passed to {@code equals} must return the same 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value for this method. 962f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate's hash 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #equals 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] encoded = getEncoded(); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = 0; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i=0; i<encoded.length; i++) { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hash += i*encoded[i]; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hash; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (CertificateEncodingException e) { 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the encoded representation for this certificate. 1152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the encoded representation for this certificate. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateEncodingException 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the encoding fails. 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract byte[] getEncoded() throws CertificateEncodingException; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Verifies that this certificate was signed with the given public key. 1242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PublicKey public key for which verification should be 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * performed. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateException 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if encoding errors are detected. 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an unsupported algorithm is detected. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an invalid key is detected. 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchProviderException 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if there is no default provider. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SignatureException 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if signature errors are detected. 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void verify(PublicKey key) 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws CertificateException, 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchAlgorithmException, 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvalidKeyException, 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchProviderException, 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SignatureException; 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Verifies that this certificate was signed with the given public key. It 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Uses the signature algorithm given by the provider. 1492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PublicKey public key for which verification should be 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * performed. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param sigProvider 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String the name of the signature provider. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception CertificateException 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if encoding errors are detected. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception NoSuchAlgorithmException 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an unsupported algorithm is detected. 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InvalidKeyException 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an invalid key is detected. 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception NoSuchProviderException 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider does not exists. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception SignatureException 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if signature errors are detected. 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void verify(PublicKey key, String sigProvider) 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws CertificateException, 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchAlgorithmException, 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InvalidKeyException, 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchProviderException, 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SignatureException; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificate. 1762f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for the certificate. 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String toString(); 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the public key corresponding to this certificate. 1832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the public key corresponding to this certificate. 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract PublicKey getPublicKey(); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an alternate object to be serialized. 1902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object to serialize. 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ObjectStreamException 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the creation of the alternate object fails. 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Object writeReplace() throws ObjectStreamException { 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new CertificateRep(getType(), getEncoded()); 198f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes } catch (CertificateEncodingException e) { 199897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NotSerializableException("Could not create serialization object: " + e); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The alternate {@code Serializable} class to be used for serialization and 2052f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * deserialization of {@code Certificate} objects. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected static class CertificateRep implements Serializable { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -8563758940495660020L; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The standard name of the certificate type 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String type; 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The certificate data 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final byte[] data; 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Force default serialization to use writeUnshared/readUnshared 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // for the certificate data 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final ObjectStreamField[] serialPersistentFields = { 218f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes new ObjectStreamField("type", String.class), 219f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes new ObjectStreamField("data", byte[].class, true) 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code CertificateRep} instance with the specified 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificate type and encoded data. 2252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate type. 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param data 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the encoded data. 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected CertificateRep(String type, byte[] data) { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.type = type; 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.data = data; 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Deserializes a {@code Certificate} from a serialized {@code 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CertificateRep} object. 2392f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the deserialized {@code Certificate}. 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ObjectStreamException 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if deserialization fails. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Object readResolve() throws ObjectStreamException { 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CertificateFactory cf = CertificateFactory.getInstance(type); 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return cf.generateCertificate(new ByteArrayInputStream(data)); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Throwable t) { 249897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NotSerializableException("Could not resolve certificate: " + t); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 254