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