Certificate.java revision 2f9e468ed4985edfd5e351faf2089d91e561e41d
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 javax.security.cert;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PublicKey;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SignatureException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.cert.CertificateEncodingException;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.cert.CertificateException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Abstract class to represent identity certificates. It represents a way to
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * verify the binding of a Principal and its public key. Examples are X.509,
322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * PGP, and SDSI.
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Note: This package is provided only for compatibility reasons.
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It contains a simplified version of the java.security.cert package that was
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * previously used by JSSE (Java SSL package). All applications that do not have
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to be compatible with older versions of JSSE (that is before Java SDK 1.5)
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should only use java.security.cert.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Certificate {
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code Certificate}.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Certificate() {}
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the argument to this Certificate. If both have the same bytes
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * they are assumed to be equal.
502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Certificate} to compare with this object
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return <code>true</code> if {@code obj} is the same as this
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Certificate}, <code>false</code> otherwise
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj == this) {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(obj instanceof Certificate)) {
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate object = (Certificate) obj;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return Arrays.equals(getEncoded(), object.getEncoded());
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CertificateEncodingException e) {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an integer hash code for the receiver. Any two objects which
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * return <code>true</code> when passed to <code>equals</code> must answer
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same value for this method.
762f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the receiver's hash
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #equals
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int res = 0;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] array = getEncoded();
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i=0; i<array.length; i++) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                res += array[i];
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CertificateEncodingException e) {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return res;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the encoded representation for this certificate.
942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the encoded representation for this certificate.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateEncodingException
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if encoding fails.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract byte[] getEncoded()
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws CertificateEncodingException;
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that this certificate was signed with the given public key.
1042f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            public key for which verification should be performed.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateException
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if encoding errors are detected
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an unsupported algorithm is detected
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an invalid key is detected
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchProviderException
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if there is no default provider
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SignatureException
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if signature errors are detected
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void verify(PublicKey key)
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws CertificateException, NoSuchAlgorithmException,
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                   InvalidKeyException, NoSuchProviderException,
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                   SignatureException;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Verifies that this certificate was signed with the given public key. Uses
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the signature algorithm given by the provider.
1262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            public key for which verification should be performed.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sigProvider
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the signature provider.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception CertificateException
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if encoding errors are detected
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception NoSuchAlgorithmException
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if an unsupported algorithm is detected
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception InvalidKeyException
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if an invalid key is detected
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception NoSuchProviderException
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if the specified provider does not exists.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception SignatureException
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                if signature errors are detected
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void verify(PublicKey key, String sigProvider)
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws CertificateException, NoSuchAlgorithmException,
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                   InvalidKeyException, NoSuchProviderException,
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                   SignatureException;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * receiver.
1502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for the receiver.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract String toString();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the public key corresponding to this certificate.
1572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the public key corresponding to this certificate.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract PublicKey getPublicKey();
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163