1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.security.cert;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayInputStream;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.NotSerializableException;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectStreamException;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectStreamField;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Serializable;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchProviderException;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.PublicKey;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SignatureException;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Abstract class to represent identity certificates. It represents a way to
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * verify the binding of a Principal and its public key. Examples are X.509,
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PGP, and SDSI.
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class Certificate implements Serializable {
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = -3585440601605666277L;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // The standard name of the certificate type
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final String type;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new {@code Certificate} with the specified type.
48e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        the certificate type.
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Certificate(String type) {
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.type = type;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the certificate type.
58e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the certificate type.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final String getType() {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares the argument to the certificate, and returns {@code true} if they
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * represent the <em>same</em> object using a class specific comparison. The
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * implementation in Object returns {@code true} only if the argument is the
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * exact same object as the callee (==).
70e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param other
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare with this object.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if the object is the same as this object, {@code
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         false} if it is different from this object.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #hashCode
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // obj equal to itself
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this == other) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (other instanceof Certificate) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // check that encoded forms match
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return Arrays.equals(this.getEncoded(),
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((Certificate)other).getEncoded());
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (CertificateEncodingException e) {
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new RuntimeException(e);
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an integer hash code for the certificate. Any two objects which
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return {@code true} when passed to {@code equals} must return the same
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value for this method.
98e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the certificate's hash
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #equals
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] encoded = getEncoded();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int hash = 0;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int i=0; i<encoded.length; i++) {
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                hash += i*encoded[i];
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return hash;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (CertificateEncodingException e) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException(e);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the encoded representation for this certificate.
117e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the encoded representation for this certificate.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws CertificateEncodingException
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the encoding fails.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract byte[] getEncoded() throws CertificateEncodingException;
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Verifies that this certificate was signed with the given public key.
126e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            PublicKey public key for which verification should be
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            performed.
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws CertificateException
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if encoding errors are detected.
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NoSuchAlgorithmException
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if an unsupported algorithm is detected.
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws InvalidKeyException
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if an invalid key is detected.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NoSuchProviderException
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if there is no default provider.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws SignatureException
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if signature errors are detected.
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void verify(PublicKey key)
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws CertificateException,
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               NoSuchAlgorithmException,
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               InvalidKeyException,
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               NoSuchProviderException,
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               SignatureException;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Verifies that this certificate was signed with the given public key. It
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Uses the signature algorithm given by the provider.
151e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param key
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            PublicKey public key for which verification should be
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            performed.
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sigProvider
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            String the name of the signature provider.
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception CertificateException
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if encoding errors are detected.
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception NoSuchAlgorithmException
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if an unsupported algorithm is detected.
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception InvalidKeyException
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if an invalid key is detected.
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception NoSuchProviderException
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the specified provider does not exists.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception SignatureException
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if signature errors are detected.
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract void verify(PublicKey key, String sigProvider)
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws CertificateException,
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               NoSuchAlgorithmException,
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               InvalidKeyException,
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               NoSuchProviderException,
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               SignatureException;
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a string containing a concise, human-readable description of the
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * certificate.
178e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a printable representation for the certificate.
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract String toString();
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the public key corresponding to this certificate.
185e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the public key corresponding to this certificate.
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract PublicKey getPublicKey();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an alternate object to be serialized.
192e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     *
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the object to serialize.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ObjectStreamException
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if the creation of the alternate object fails.
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected Object writeReplace() throws ObjectStreamException {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CertificateRep(getType(), getEncoded());
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (CertificateEncodingException e) {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NotSerializableException (
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Messages.getString("security.66", e)); //$NON-NLS-1$
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The alternate {@code Serializable} class to be used for serialization and
208e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes     * deserialization of {@code Certificate} objects.
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected static class CertificateRep implements Serializable {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final long serialVersionUID = -8563758940495660020L;
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // The standard name of the certificate type
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final String type;
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // The certificate data
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private final byte[] data;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Force default serialization to use writeUnshared/readUnshared
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // for the certificate data
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private static final ObjectStreamField[] serialPersistentFields = {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             new ObjectStreamField("type", String.class), //$NON-NLS-1$
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             new ObjectStreamField("data", byte[].class, true) //$NON-NLS-1$
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        };
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Creates a new {@code CertificateRep} instance with the specified
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * certificate type and encoded data.
228e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes         *
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param type
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the certificate type.
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @param data
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *            the encoded data.
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected CertificateRep(String type, byte[] data) {
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.type = type;
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.data = data;
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Deserializes a {@code Certificate} from a serialized {@code
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * CertificateRep} object.
242e7637fe9734c4e3bece51db6773505c04e49fabaElliott Hughes         *
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @return the deserialized {@code Certificate}.
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * @throws ObjectStreamException
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *             if deserialization fails.
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected Object readResolve() throws ObjectStreamException {
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                CertificateFactory cf = CertificateFactory.getInstance(type);
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return cf.generateCertificate(new ByteArrayInputStream(data));
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Throwable t) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new NotSerializableException(
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        Messages.getString("security.68", t)); //$NON-NLS-1$
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
258