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