/* * Copyright (c) 1997, 2001, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.security.cert.internal.x509; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.Serializable; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.ObjectOutputStream; import java.math.BigInteger; import java.security.Signature; import javax.security.cert.*; import java.security.*; import java.util.Date; import java.util.BitSet; import java.util.Enumeration; import java.util.Vector; /** * The X509V1CertImpl class is used as a conversion wrapper around * sun.security.x509.X509Cert certificates when running under JDK1.1.x. * * @author Jeff Nisewanger */ public class X509V1CertImpl extends X509Certificate implements Serializable { static final long serialVersionUID = -2048442350420423405L; private java.security.cert.X509Certificate wrappedCert; synchronized private static java.security.cert.CertificateFactory getFactory() throws java.security.cert.CertificateException { return java.security.cert.CertificateFactory.getInstance("X.509"); } /** * Default constructor. */ public X509V1CertImpl() { } /** * Unmarshals a certificate from its encoded form, parsing the * encoded bytes. This form of constructor is used by agents which * need to examine and use certificate contents. That is, this is * one of the more commonly used constructors. Note that the buffer * must include only a certificate, and no "garbage" may be left at * the end. If you need to ignore data at the end of a certificate, * use another constructor. * * @param certData the encoded bytes, with no trailing padding. * @exception CertificateException on parsing errors. */ public X509V1CertImpl(byte[] certData) throws CertificateException { try { ByteArrayInputStream bs; bs = new ByteArrayInputStream(certData); wrappedCert = (java.security.cert.X509Certificate) getFactory().generateCertificate(bs); } catch (java.security.cert.CertificateException e) { throw new CertificateException(e.getMessage()); } } /** * unmarshals an X.509 certificate from an input stream. * * @param in an input stream holding at least one certificate * @exception CertificateException on parsing errors. */ public X509V1CertImpl(InputStream in) throws CertificateException { try { wrappedCert = (java.security.cert.X509Certificate) getFactory().generateCertificate(in); } catch (java.security.cert.CertificateException e) { throw new CertificateException(e.getMessage()); } } /** * Returns the encoded form of this certificate. It is * assumed that each certificate type would have only a single * form of encoding; for example, X.509 certificates would * be encoded as ASN.1 DER. */ public byte[] getEncoded() throws CertificateEncodingException { try { return wrappedCert.getEncoded(); } catch (java.security.cert.CertificateEncodingException e) { throw new CertificateEncodingException(e.getMessage()); } } /** * Throws an exception if the certificate was not signed using the * verification key provided. Successfully verifying a certificate * does <em>not</em> indicate that one should trust the entity which * it represents. * * @param key the public key used for verification. */ public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { try { wrappedCert.verify(key); } catch (java.security.cert.CertificateException e) { throw new CertificateException(e.getMessage()); } } /** * Throws an exception if the certificate was not signed using the * verification key provided. Successfully verifying a certificate * does <em>not</em> indicate that one should trust the entity which * it represents. * * @param key the public key used for verification. * @param sigProvider the name of the provider. */ public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { try { wrappedCert.verify(key, sigProvider); } catch (java.security.cert.CertificateException e) { throw new CertificateException(e.getMessage()); } } /** * Checks that the certificate is currently valid, i.e. the current * time is within the specified validity period. */ public void checkValidity() throws CertificateExpiredException, CertificateNotYetValidException { checkValidity(new Date()); } /** * Checks that the specified date is within the certificate's * validity period, or basically if the certificate would be * valid at the specified date/time. * * @param date the Date to check against to see if this certificate * is valid at that date/time. */ public void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException { try { wrappedCert.checkValidity(date); } catch (java.security.cert.CertificateNotYetValidException e) { throw new CertificateNotYetValidException(e.getMessage()); } catch (java.security.cert.CertificateExpiredException e) { throw new CertificateExpiredException(e.getMessage()); } } /** * Returns a printable representation of the certificate. This does not * contain all the information available to distinguish this from any * other certificate. The certificate must be fully constructed * before this function may be called. */ public String toString() { return wrappedCert.toString(); } /** * Gets the publickey from this certificate. * * @return the publickey. */ public PublicKey getPublicKey() { PublicKey key = wrappedCert.getPublicKey(); return key; } /* * Gets the version number from the certificate. * * @return the version number. */ public int getVersion() { return wrappedCert.getVersion() - 1; } /** * Gets the serial number from the certificate. * * @return the serial number. */ public BigInteger getSerialNumber() { return wrappedCert.getSerialNumber(); } /** * Gets the subject distinguished name from the certificate. * * @return the subject name. * @exception CertificateException if a parsing error occurs. */ public Principal getSubjectDN() { return wrappedCert.getSubjectDN(); } /** * Gets the issuer distinguished name from the certificate. * * @return the issuer name. * @exception CertificateException if a parsing error occurs. */ public Principal getIssuerDN() { return wrappedCert.getIssuerDN(); } /** * Gets the notBefore date from the validity period of the certificate. * * @return the start date of the validity period. * @exception CertificateException if a parsing error occurs. */ public Date getNotBefore() { return wrappedCert.getNotBefore(); } /** * Gets the notAfter date from the validity period of the certificate. * * @return the end date of the validity period. * @exception CertificateException if a parsing error occurs. */ public Date getNotAfter() { return wrappedCert.getNotAfter(); } /** * Gets the signature algorithm name for the certificate * signature algorithm. * For example, the string "SHA1/DSA". * * @return the signature algorithm name. * @exception CertificateException if a parsing error occurs. */ public String getSigAlgName() { return wrappedCert.getSigAlgName(); } /** * Gets the signature algorithm OID string from the certificate. * For example, the string "1.2.840.10040.4.3" * * @return the signature algorithm oid string. * @exception CertificateException if a parsing error occurs. */ public String getSigAlgOID() { return wrappedCert.getSigAlgOID(); } /** * Gets the DER encoded signature algorithm parameters from this * certificate's signature algorithm. * * @return the DER encoded signature algorithm parameters, or * null if no parameters are present. * @exception CertificateException if a parsing error occurs. */ public byte[] getSigAlgParams() { return wrappedCert.getSigAlgParams(); } private synchronized void writeObject(ObjectOutputStream stream) throws IOException { try { stream.write(getEncoded()); } catch (CertificateEncodingException e) { throw new IOException("getEncoded failed: " + e.getMessage()); } } private synchronized void readObject(ObjectInputStream stream) throws IOException { try { wrappedCert = (java.security.cert.X509Certificate) getFactory().generateCertificate(stream); } catch (java.security.cert.CertificateException e) { throw new IOException("generateCertificate failed: " + e.getMessage()); } } public java.security.cert.X509Certificate getX509Certificate() { return wrappedCert; } }