mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			307 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* Certificate.java --- Certificate class
 | |
|    Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package java.security.cert;
 | |
| 
 | |
| import java.io.ByteArrayInputStream;
 | |
| import java.io.InvalidObjectException;
 | |
| import java.io.ObjectStreamException;
 | |
| import java.io.Serializable;
 | |
| import java.security.InvalidKeyException;
 | |
| import java.security.NoSuchAlgorithmException;
 | |
| import java.security.NoSuchProviderException;
 | |
| import java.security.PublicKey;
 | |
| import java.security.SignatureException;
 | |
| 
 | |
| /**
 | |
|  * The Certificate class is an abstract class used to manage
 | |
|  * identity certificates. An identity certificate is a
 | |
|  * combination of a principal and a public key which is
 | |
|  * certified by another principal. This is the puprose of
 | |
|  * Certificate Authorities (CA).
 | |
|  *
 | |
|  * <p>This class is used to manage different types of certificates
 | |
|  * but have important common puposes. Different types of
 | |
|  * certificates like X.509 and OpenPGP share general certificate
 | |
|  * functions (like encoding and verifying) and information like
 | |
|  * public keys.
 | |
|  *
 | |
|  * <p>X.509, OpenPGP, and SDSI can be implemented by subclassing this
 | |
|  * class even though they differ in storage methods and information
 | |
|  * stored.
 | |
|  *
 | |
|  * @see CertificateFactory
 | |
|  * @see X509Certificate
 | |
|  * @since JDK 1.2
 | |
|  * @author Mark Benvenuto
 | |
|  * @author Casey Marshall
 | |
|  */
 | |
| public abstract class Certificate implements Serializable
 | |
| {
 | |
|   private static final long serialVersionUID = -3585440601605666277L;
 | |
| 
 | |
|   private String type;
 | |
| 
 | |
|   /**
 | |
|      Constructs a new certificate of the specified type. An example
 | |
|      is "X.509".
 | |
| 
 | |
|      @param type a valid standard name for a certificate.
 | |
|   */
 | |
|   protected Certificate(String type)
 | |
|   {
 | |
|     this.type = type;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|      Returns the Certificate type.
 | |
| 
 | |
|      @return a string representing the Certificate type
 | |
|   */
 | |
|   public final String getType()
 | |
|   {
 | |
|     return type;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|      Compares this Certificate to other. It checks if the
 | |
|      object if instanceOf Certificate and then checks if
 | |
|      the encoded form matches.
 | |
| 
 | |
|      @param other An Object to test for equality
 | |
| 
 | |
|      @return true if equal, false otherwise
 | |
|   */
 | |
|   public boolean equals(Object other)
 | |
|   {
 | |
|     if( other instanceof Certificate ) {
 | |
|       try {
 | |
|         Certificate x = (Certificate) other;
 | |
|         if( getEncoded().length != x.getEncoded().length )
 | |
|           return false;
 | |
| 
 | |
|         byte[] b1 = getEncoded();
 | |
|         byte[] b2 = x.getEncoded();
 | |
| 
 | |
|         for( int i = 0; i < b1.length; i++ )
 | |
|           if( b1[i] != b2[i] )
 | |
|             return false;
 | |
| 
 | |
|       } catch( CertificateEncodingException cee ) {
 | |
|         return false;
 | |
|       }
 | |
|       return true;
 | |
|     }
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|      Returns a hash code for this Certificate in its encoded
 | |
|      form.
 | |
| 
 | |
|      @return A hash code of this class
 | |
|   */
 | |
|   public int hashCode()
 | |
|   {
 | |
|     return super.hashCode();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|      Gets the DER ASN.1 encoded format for this Certificate.
 | |
|      It assumes each certificate has only one encoding format.
 | |
|      Ex: X.509 is encoded as ASN.1 DER
 | |
| 
 | |
|      @return byte array containg encoded form
 | |
| 
 | |
|      @throws CertificateEncodingException if an error occurs
 | |
|   */
 | |
|   public abstract byte[] getEncoded() throws CertificateEncodingException;
 | |
| 
 | |
|   /**
 | |
|      Verifies that this Certificate was properly signed with the
 | |
|      PublicKey that corresponds to its private key.
 | |
| 
 | |
|      @param key PublicKey to verify with
 | |
| 
 | |
|      @throws CertificateException encoding error
 | |
|      @throws NoSuchAlgorithmException unsupported algorithm
 | |
|      @throws InvalidKeyException incorrect key
 | |
|      @throws NoSuchProviderException no provider
 | |
|      @throws SignatureException signature error
 | |
|   */
 | |
|   public abstract void verify(PublicKey key)
 | |
|     throws CertificateException,
 | |
|     NoSuchAlgorithmException,
 | |
|     InvalidKeyException,
 | |
|     NoSuchProviderException,
 | |
|     SignatureException;
 | |
| 
 | |
|   /**
 | |
|      Verifies that this Certificate was properly signed with the
 | |
|      PublicKey that corresponds to its private key and uses
 | |
|      the signature engine provided by the provider.
 | |
| 
 | |
|      @param key PublicKey to verify with
 | |
|      @param sigProvider Provider to use for signature algorithm
 | |
| 
 | |
|      @throws CertificateException encoding error
 | |
|      @throws NoSuchAlgorithmException unsupported algorithm
 | |
|      @throws InvalidKeyException incorrect key
 | |
|      @throws NoSuchProviderException incorrect provider
 | |
|      @throws SignatureException signature error
 | |
|   */
 | |
|   public abstract void verify(PublicKey key,
 | |
|                               String sigProvider)
 | |
|     throws CertificateException,
 | |
|     NoSuchAlgorithmException,
 | |
|     InvalidKeyException,
 | |
|     NoSuchProviderException,
 | |
|     SignatureException;
 | |
| 
 | |
|   /**
 | |
|      Returns a string representing the Certificate.
 | |
| 
 | |
|      @return a string representing the Certificate.
 | |
|   */
 | |
|   public abstract String toString();
 | |
| 
 | |
| 
 | |
|   /**
 | |
|      Returns the public key stored in the Certificate.
 | |
| 
 | |
|      @return The public key
 | |
|   */
 | |
|   public abstract PublicKey getPublicKey();
 | |
| 
 | |
|   // Protected methods.
 | |
|   // ------------------------------------------------------------------------
 | |
| 
 | |
|   /**
 | |
|    * Returns a replacement for this certificate to be serialized. This
 | |
|    * method returns the equivalent to the following for this class:
 | |
|    *
 | |
|    * <blockquote>
 | |
|    * <pre>new CertificateRep(getType(), getEncoded());</pre>
 | |
|    * </blockquote>
 | |
|    *
 | |
|    * <p>This thusly replaces the certificate with its name and its
 | |
|    * encoded form, which can be deserialized later with the {@link
 | |
|    * CertificateFactory} implementation for this certificate's type.
 | |
|    *
 | |
|    * @return The replacement object to be serialized.
 | |
|    * @throws ObjectStreamException If the replacement could not be
 | |
|    * created.
 | |
|    */
 | |
|   protected Object writeReplace() throws ObjectStreamException
 | |
|   {
 | |
|     try
 | |
|       {
 | |
|         return new CertificateRep(getType(), getEncoded());
 | |
|       }
 | |
|     catch (CertificateEncodingException cee)
 | |
|       {
 | |
|         throw new InvalidObjectException(cee.toString());
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   // Inner class.
 | |
|   // ------------------------------------------------------------------------
 | |
| 
 | |
|   /**
 | |
|      Certificate.CertificateRep is an inner class used to provide an alternate
 | |
|      storage mechanism for serialized Certificates.
 | |
|   */
 | |
|   protected static class CertificateRep implements java.io.Serializable
 | |
|   {
 | |
| 
 | |
|     /** From JDK1.4. */
 | |
|     private static final long serialVersionUID = -8563758940495660020L;
 | |
| 
 | |
|     /** The certificate type, e.g. "X.509". */
 | |
|     private String type;
 | |
| 
 | |
|     /** The encoded certificate data. */
 | |
|     private byte[] data;
 | |
| 
 | |
|     /**
 | |
|      * Create an alternative representation of this certificate. The
 | |
|      * <code>(type, data)</code> pair is typically the certificate's
 | |
|      * type as returned by {@link Certificate#getType()} (i.e. the
 | |
|      * canonical name of the certificate type) and the encoded form as
 | |
|      * returned by {@link Certificate#getEncoded()}.
 | |
|      *
 | |
|      * <p>For example, X.509 certificates would create an instance of
 | |
|      * this class with the parameters "X.509" and the ASN.1
 | |
|      * representation of the certificate, encoded as DER bytes.
 | |
|      *
 | |
|      * @param type The certificate type.
 | |
|      * @param data The encoded certificate data.
 | |
|      */
 | |
|     protected CertificateRep(String type, byte[] data)
 | |
|     {
 | |
|       this.type = type;
 | |
|       this.data = data;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Deserialize this certificate replacement into the appropriate
 | |
|      * certificate object. That is, this method attempts to create a
 | |
|      * {@link CertificateFactory} for this certificate's type, then
 | |
|      * attempts to parse the encoded data with that factory, returning
 | |
|      * the resulting certificate.
 | |
|      *
 | |
|      * @return The deserialized certificate.
 | |
|      * @throws ObjectStreamException If there is no appropriate
 | |
|      * certificate factory for the given type, or if the encoded form
 | |
|      * cannot be parsed.
 | |
|      */
 | |
|     protected Object readResolve() throws ObjectStreamException
 | |
|     {
 | |
|       try
 | |
|         {
 | |
|           CertificateFactory fact = CertificateFactory.getInstance(type);
 | |
|           return fact.generateCertificate(new ByteArrayInputStream(data));
 | |
|         }
 | |
|       catch (Exception e)
 | |
|         {
 | |
|           throw new InvalidObjectException(e.toString());
 | |
|         }
 | |
|     }
 | |
|   }
 | |
| }
 |