/* CertificateFactory.java --- Certificate Factory Class Copyright (C) 1999 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. As a special exception, if you link this library with other files to produce an executable, this library does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ package java.security.cert; import java.security.NoSuchProviderException; import java.security.Provider; import java.security.Security; import java.io.InputStream; import java.util.Collection; /** This class implments the CertificateFactory class interface used to generate certificates and certificate revocation list (CRL) objects from their encodings. A certifcate factory for X.509 returns certificates of the java.security.cert.X509Certificate class, and CRLs of the java.security.cert.X509CRL class. @since JDK 1.2 @author Mark Benvenuto */ public class CertificateFactory { private CertificateFactorySpi certFacSpi; private Provider provider; private String type; /** Creates an instance of CertificateFactory @param certFacSpi A CertificateFactory engine to use @param provider A provider to use @param type The type of Certificate */ protected CertificateFactory(CertificateFactorySpi certFacSpi, Provider provider, String type) { this.certFacSpi = certFacSpi; this.provider = provider; this.type = type; } /** Gets an instance of the CertificateFactory class representing the specified certificate factory. If the type is not found then, it throws CertificateException. @param type the type of certificate to choose @return a CertificateFactory repesenting the desired type @throws CertificateException if the type of certificate is not implemented by providers */ public static final CertificateFactory getInstance(String type) throws CertificateException { Provider[] p = Security.getProviders (); for (int i = 0; i < p.length; i++) { String classname = p[i].getProperty ("CertificateFactory." + type); if (classname != null) return getInstance (classname, type, p[i]); } throw new CertificateException(type); } /** Gets an instance of the CertificateFactory class representing the specified certificate factory from the specified provider. If the type is not found then, it throws CertificateException. If the provider is not found, then it throws NoSuchProviderException. @param type the type of certificate to choose @return a CertificateFactory repesenting the desired type @throws CertificateException if the type of certificate is not implemented by providers @throws NoSuchProviderException if the provider is not found */ public static final CertificateFactory getInstance(String type, String provider) throws CertificateException, NoSuchProviderException { Provider p = Security.getProvider(provider); if( p == null) throw new NoSuchProviderException(); return getInstance (p.getProperty ("CertificateFactory." + type), type, p); } private static CertificateFactory getInstance (String classname, String type, Provider provider) throws CertificateException { try { return new CertificateFactory( (CertificateFactorySpi)Class.forName( classname ).newInstance(), provider, type ); } catch( ClassNotFoundException cnfe) { throw new CertificateException("Class not found"); } catch( InstantiationException ie) { throw new CertificateException("Class instantiation failed"); } catch( IllegalAccessException iae) { throw new CertificateException("Illegal Access"); } } /** Gets the provider that the class is from. @return the provider of this class */ public final Provider getProvider() { return provider; } /** Returns the type of the certificate supported @return A string with the type of certificate */ public final String getType() { return type; } /** Generates a Certificate based on the encoded data read from the InputStream. The input stream must contain only one certificate. If there exists a specialized certificate class for the certificate format handled by the certificate factory then the return Ceritificate should be a typecast of it. Ex: A X.509 CertificateFactory should return X509Certificate. For X.509 certificates, the certificate in inStream must be DER encoded and supplied in binary or printable (Base64) encoding. If the certificate is in Base64 encoding, it must be bounded by -----BEGINCERTIFICATE-----, and -----END CERTIFICATE-----. @param inStream an input stream containing the certificate data @return a certificate initialized with InputStream data. @throws CertificateException Certificate parsing error */ public final Certificate generateCertificate(InputStream inStream) throws CertificateException { return certFacSpi.engineGenerateCertificate( inStream ); } /** Returns a collection of certificates that were read from the input stream. It may be empty, have only one, or have multiple certificates. For a X.509 certificate factory, the stream may contain a single DER encoded certificate or a PKCS#7 certificate chain. This is a PKCS#7 SignedData object with the most significant field being certificates. If no CRLs are present, then an empty collection is returned. @param inStream an input stream containing the certificates @return a collection of certificates initialized with the InputStream data. @throws CertificateException Certificate parsing error */ public final Collection generateCertificates(InputStream inStream) throws CertificateException { return certFacSpi.engineGenerateCertificates( inStream ); } /** Generates a CRL based on the encoded data read from the InputStream. The input stream must contain only one CRL. If there exists a specialized CRL class for the CRL format handled by the certificate factory then the return CRL should be a typecast of it. Ex: A X.509 CertificateFactory should return X509CRL. @param inStream an input stream containing the CRL data @return a CRL initialized with InputStream data. @throws CRLException CRL parsing error */ public final CRL generateCRL(InputStream inStream) throws CRLException { return certFacSpi.engineGenerateCRL( inStream ); } /** Generates CRLs based on the encoded data read from the InputStream. For a X.509 certificate factory, the stream may contain a single DER encoded CRL or a PKCS#7 CRL set. This is a PKCS#7 SignedData object with the most significant field being crls. If no CRLs are present, then an empty collection is returned. @param inStream an input stream containing the CRLs @return a collection of CRLs initialized with the InputStream data. @throws CRLException CRL parsing error */ public final Collection generateCRLs(InputStream inStream) throws CRLException { return certFacSpi.engineGenerateCRLs( inStream ); } }