Showing the changes to java/pkg/java/security/cert (103 of 18352 files). Show all
Unified · Split
Binary file not shown.
| @@ -0,0 +1,88 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * This class is an abstraction of certificate revocation lists (CRLs) that | |
| 30 | + * have different formats but important common uses. For example, all CRLs | |
| 31 | + * share the functionality of listing revoked certificates, and can be queried | |
| 32 | + * on whether or not they list a given certificate. | |
| 33 | + * <p> | |
| 34 | + * Specialized CRL types can be defined by subclassing off of this abstract | |
| 35 | + * class. | |
| 36 | + * | |
| 37 | + * @author Hemma Prafullchandra | |
| 38 | + * | |
| 39 | + * | |
| 40 | + * @see X509CRL | |
| 41 | + * @see CertificateFactory | |
| 42 | + * | |
| 43 | + * @since 1.2 | |
| 44 | + */ | |
| 45 | + | |
| 46 | +public abstract class CRL { | |
| 47 | + | |
| 48 | + // the CRL type | |
| 49 | + private String type; | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * Creates a CRL of the specified type. | |
| 53 | + * | |
| 54 | + * @param type the standard name of the CRL type. | |
| 55 | + * See Appendix A in the <a href= | |
| 56 | + * "../../../../technotes/guides/security/crypto/CryptoSpec.html#AppA"> | |
| 57 | + * Java Cryptography Architecture API Specification & Reference </a> | |
| 58 | + * for information about standard CRL types. | |
| 59 | + */ | |
| 60 | + protected CRL(String type) { | |
| 61 | + this.type = type; | |
| 62 | + } | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Returns the type of this CRL. | |
| 66 | + * | |
| 67 | + * @return the type of this CRL. | |
| 68 | + */ | |
| 69 | + public final String getType() { | |
| 70 | + return this.type; | |
| 71 | + } | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Returns a string representation of this CRL. | |
| 75 | + * | |
| 76 | + * @return a string representation of this CRL. | |
| 77 | + */ | |
| 78 | + public abstract String toString(); | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Checks whether the given certificate is on this CRL. | |
| 82 | + * | |
| 83 | + * @param cert the certificate to check for. | |
| 84 | + * @return true if the given certificate is on this CRL, | |
| 85 | + * false otherwise. | |
| 86 | + */ | |
| 87 | + public abstract boolean isRevoked(Certificate cert); | |
| 88 | +} | |
Binary file not shown.
| @@ -0,0 +1,88 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.GeneralSecurityException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * CRL (Certificate Revocation List) Exception. | |
| 32 | + * | |
| 33 | + * @author Hemma Prafullchandra | |
| 34 | + */ | |
| 35 | +public class CRLException extends GeneralSecurityException { | |
| 36 | + | |
| 37 | + private static final long serialVersionUID = -6694728944094197147L; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * Constructs a CRLException with no detail message. A | |
| 41 | + * detail message is a String that describes this particular | |
| 42 | + * exception. | |
| 43 | + */ | |
| 44 | + public CRLException() { | |
| 45 | + super(); | |
| 46 | + } | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * Constructs a CRLException with the specified detail | |
| 50 | + * message. A detail message is a String that describes this | |
| 51 | + * particular exception. | |
| 52 | + * | |
| 53 | + * @param message the detail message. | |
| 54 | + */ | |
| 55 | + public CRLException(String message) { | |
| 56 | + super(message); | |
| 57 | + } | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Creates a <code>CRLException</code> with the specified | |
| 61 | + * detail message and cause. | |
| 62 | + * | |
| 63 | + * @param message the detail message (which is saved for later retrieval | |
| 64 | + * by the {@link #getMessage()} method). | |
| 65 | + * @param cause the cause (which is saved for later retrieval by the | |
| 66 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 67 | + * and indicates that the cause is nonexistent or unknown.) | |
| 68 | + * @since 1.5 | |
| 69 | + */ | |
| 70 | + public CRLException(String message, Throwable cause) { | |
| 71 | + super(message, cause); | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Creates a <code>CRLException</code> with the specified cause | |
| 76 | + * and a detail message of <tt>(cause==null ? null : cause.toString())</tt> | |
| 77 | + * (which typically contains the class and detail message of | |
| 78 | + * <tt>cause</tt>). | |
| 79 | + * | |
| 80 | + * @param cause the cause (which is saved for later retrieval by the | |
| 81 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 82 | + * and indicates that the cause is nonexistent or unknown.) | |
| 83 | + * @since 1.5 | |
| 84 | + */ | |
| 85 | + public CRLException(Throwable cause) { | |
| 86 | + super(cause); | |
| 87 | + } | |
| 88 | +} | |
Binary file not shown.
| @@ -0,0 +1,104 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * The CRLReason enumeration specifies the reason that a certificate | |
| 30 | + * is revoked, as defined in <a href="http://www.ietf.org/rfc/rfc3280.txt"> | |
| 31 | + * RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL | |
| 32 | + * Profile</a>. | |
| 33 | + * | |
| 34 | + * @author Sean Mullan | |
| 35 | + * @since 1.7 | |
| 36 | + * @see X509CRLEntry#getRevocationReason | |
| 37 | + * @see CertificateRevokedException#getRevocationReason | |
| 38 | + */ | |
| 39 | +public enum CRLReason { | |
| 40 | + /** | |
| 41 | + * This reason indicates that it is unspecified as to why the | |
| 42 | + * certificate has been revoked. | |
| 43 | + */ | |
| 44 | + UNSPECIFIED, | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * This reason indicates that it is known or suspected that the | |
| 48 | + * certificate subject's private key has been compromised. It applies | |
| 49 | + * to end-entity certificates only. | |
| 50 | + */ | |
| 51 | + KEY_COMPROMISE, | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * This reason indicates that it is known or suspected that the | |
| 55 | + * certificate subject's private key has been compromised. It applies | |
| 56 | + * to certificate authority (CA) certificates only. | |
| 57 | + */ | |
| 58 | + CA_COMPROMISE, | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * This reason indicates that the subject's name or other information | |
| 62 | + * has changed. | |
| 63 | + */ | |
| 64 | + AFFILIATION_CHANGED, | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * This reason indicates that the certificate has been superseded. | |
| 68 | + */ | |
| 69 | + SUPERSEDED, | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * This reason indicates that the certificate is no longer needed. | |
| 73 | + */ | |
| 74 | + CESSATION_OF_OPERATION, | |
| 75 | + | |
| 76 | + /** | |
| 77 | + * This reason indicates that the certificate has been put on hold. | |
| 78 | + */ | |
| 79 | + CERTIFICATE_HOLD, | |
| 80 | + | |
| 81 | + /** | |
| 82 | + * Unused reason. | |
| 83 | + */ | |
| 84 | + UNUSED, | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * This reason indicates that the certificate was previously on hold | |
| 88 | + * and should be removed from the CRL. It is for use with delta CRLs. | |
| 89 | + */ | |
| 90 | + REMOVE_FROM_CRL, | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * This reason indicates that the privileges granted to the subject of | |
| 94 | + * the certificate have been withdrawn. | |
| 95 | + */ | |
| 96 | + PRIVILEGE_WITHDRAWN, | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * This reason indicates that it is known or suspected that the | |
| 100 | + * certificate subject's private key has been compromised. It applies | |
| 101 | + * to authority attribute (AA) certificates only. | |
| 102 | + */ | |
| 103 | + AA_COMPROMISE | |
| 104 | +} | |
Binary file not shown.
| @@ -0,0 +1,66 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A selector that defines a set of criteria for selecting <code>CRL</code>s. | |
| 30 | + * Classes that implement this interface are often used to specify | |
| 31 | + * which <code>CRL</code>s should be retrieved from a <code>CertStore</code>. | |
| 32 | + * <p> | |
| 33 | + * <b>Concurrent Access</b> | |
| 34 | + * <p> | |
| 35 | + * Unless otherwise specified, the methods defined in this interface are not | |
| 36 | + * thread-safe. Multiple threads that need to access a single | |
| 37 | + * object concurrently should synchronize amongst themselves and | |
| 38 | + * provide the necessary locking. Multiple threads each manipulating | |
| 39 | + * separate objects need not synchronize. | |
| 40 | + * | |
| 41 | + * @see CRL | |
| 42 | + * @see CertStore | |
| 43 | + * @see CertStore#getCRLs | |
| 44 | + * | |
| 45 | + * @author Steve Hanna | |
| 46 | + * @since 1.4 | |
| 47 | + */ | |
| 48 | +public interface CRLSelector extends Cloneable { | |
| 49 | + | |
| 50 | + /** | |
| 51 | + * Decides whether a <code>CRL</code> should be selected. | |
| 52 | + * | |
| 53 | + * @param crl the <code>CRL</code> to be checked | |
| 54 | + * @return <code>true</code> if the <code>CRL</code> should be selected, | |
| 55 | + * <code>false</code> otherwise | |
| 56 | + */ | |
| 57 | + boolean match(CRL crl); | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Makes a copy of this <code>CRLSelector</code>. Changes to the | |
| 61 | + * copy will not affect the original and vice versa. | |
| 62 | + * | |
| 63 | + * @return a copy of this <code>CRLSelector</code> | |
| 64 | + */ | |
| 65 | + Object clone(); | |
| 66 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,343 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.ByteArrayInputStream; | |
| 29 | +import java.io.NotSerializableException; | |
| 30 | +import java.io.ObjectStreamException; | |
| 31 | +import java.io.Serializable; | |
| 32 | +import java.util.Iterator; | |
| 33 | +import java.util.List; | |
| 34 | + | |
| 35 | +/** | |
| 36 | + * An immutable sequence of certificates (a certification path). | |
| 37 | + * <p> | |
| 38 | + * This is an abstract class that defines the methods common to all | |
| 39 | + * <code>CertPath</code>s. Subclasses can handle different kinds of | |
| 40 | + * certificates (X.509, PGP, etc.). | |
| 41 | + * <p> | |
| 42 | + * All <code>CertPath</code> objects have a type, a list of | |
| 43 | + * <code>Certificate</code>s, and one or more supported encodings. Because the | |
| 44 | + * <code>CertPath</code> class is immutable, a <code>CertPath</code> cannot | |
| 45 | + * change in any externally visible way after being constructed. This | |
| 46 | + * stipulation applies to all public fields and methods of this class and any | |
| 47 | + * added or overridden by subclasses. | |
| 48 | + * <p> | |
| 49 | + * The type is a <code>String</code> that identifies the type of | |
| 50 | + * <code>Certificate</code>s in the certification path. For each | |
| 51 | + * certificate <code>cert</code> in a certification path <code>certPath</code>, | |
| 52 | + * <code>cert.getType().equals(certPath.getType())</code> must be | |
| 53 | + * <code>true</code>. | |
| 54 | + * <p> | |
| 55 | + * The list of <code>Certificate</code>s is an ordered <code>List</code> of | |
| 56 | + * zero or more <code>Certificate</code>s. This <code>List</code> and all | |
| 57 | + * of the <code>Certificate</code>s contained in it must be immutable. | |
| 58 | + * <p> | |
| 59 | + * Each <code>CertPath</code> object must support one or more encodings | |
| 60 | + * so that the object can be translated into a byte array for storage or | |
| 61 | + * transmission to other parties. Preferably, these encodings should be | |
| 62 | + * well-documented standards (such as PKCS#7). One of the encodings supported | |
| 63 | + * by a <code>CertPath</code> is considered the default encoding. This | |
| 64 | + * encoding is used if no encoding is explicitly requested (for the | |
| 65 | + * {@link #getEncoded() getEncoded()} method, for instance). | |
| 66 | + * <p> | |
| 67 | + * All <code>CertPath</code> objects are also <code>Serializable</code>. | |
| 68 | + * <code>CertPath</code> objects are resolved into an alternate | |
| 69 | + * {@link CertPathRep CertPathRep} object during serialization. This allows | |
| 70 | + * a <code>CertPath</code> object to be serialized into an equivalent | |
| 71 | + * representation regardless of its underlying implementation. | |
| 72 | + * <p> | |
| 73 | + * <code>CertPath</code> objects can be created with a | |
| 74 | + * <code>CertificateFactory</code> or they can be returned by other classes, | |
| 75 | + * such as a <code>CertPathBuilder</code>. | |
| 76 | + * <p> | |
| 77 | + * By convention, X.509 <code>CertPath</code>s (consisting of | |
| 78 | + * <code>X509Certificate</code>s), are ordered starting with the target | |
| 79 | + * certificate and ending with a certificate issued by the trust anchor. That | |
| 80 | + * is, the issuer of one certificate is the subject of the following one. The | |
| 81 | + * certificate representing the {@link TrustAnchor TrustAnchor} should not be | |
| 82 | + * included in the certification path. Unvalidated X.509 <code>CertPath</code>s | |
| 83 | + * may not follow these conventions. PKIX <code>CertPathValidator</code>s will | |
| 84 | + * detect any departure from these conventions that cause the certification | |
| 85 | + * path to be invalid and throw a <code>CertPathValidatorException</code>. | |
| 86 | + * | |
| 87 | + * <p> Every implementation of the Java platform is required to support the | |
| 88 | + * following standard <code>CertPath</code> encodings: | |
| 89 | + * <ul> | |
| 90 | + * <li><tt>PKCS7</tt></li> | |
| 91 | + * <li><tt>PkiPath</tt></li> | |
| 92 | + * </ul> | |
| 93 | + * These encodings are described in the <a href= | |
| 94 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathEncodings"> | |
| 95 | + * CertPath Encodings section</a> of the | |
| 96 | + * Java Cryptography Architecture Standard Algorithm Name Documentation. | |
| 97 | + * Consult the release documentation for your implementation to see if any | |
| 98 | + * other encodings are supported. | |
| 99 | + * <p> | |
| 100 | + * <b>Concurrent Access</b> | |
| 101 | + * <p> | |
| 102 | + * All <code>CertPath</code> objects must be thread-safe. That is, multiple | |
| 103 | + * threads may concurrently invoke the methods defined in this class on a | |
| 104 | + * single <code>CertPath</code> object (or more than one) with no | |
| 105 | + * ill effects. This is also true for the <code>List</code> returned by | |
| 106 | + * <code>CertPath.getCertificates</code>. | |
| 107 | + * <p> | |
| 108 | + * Requiring <code>CertPath</code> objects to be immutable and thread-safe | |
| 109 | + * allows them to be passed around to various pieces of code without worrying | |
| 110 | + * about coordinating access. Providing this thread-safety is | |
| 111 | + * generally not difficult, since the <code>CertPath</code> and | |
| 112 | + * <code>List</code> objects in question are immutable. | |
| 113 | + * | |
| 114 | + * @see CertificateFactory | |
| 115 | + * @see CertPathBuilder | |
| 116 | + * | |
| 117 | + * @author Yassir Elley | |
| 118 | + * @since 1.4 | |
| 119 | + */ | |
| 120 | +public abstract class CertPath implements Serializable { | |
| 121 | + | |
| 122 | + private static final long serialVersionUID = 6068470306649138683L; | |
| 123 | + | |
| 124 | + private String type; // the type of certificates in this chain | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Creates a <code>CertPath</code> of the specified type. | |
| 128 | + * <p> | |
| 129 | + * This constructor is protected because most users should use a | |
| 130 | + * <code>CertificateFactory</code> to create <code>CertPath</code>s. | |
| 131 | + * | |
| 132 | + * @param type the standard name of the type of | |
| 133 | + * <code>Certificate</code>s in this path | |
| 134 | + */ | |
| 135 | + protected CertPath(String type) { | |
| 136 | + this.type = type; | |
| 137 | + } | |
| 138 | + | |
| 139 | + /** | |
| 140 | + * Returns the type of <code>Certificate</code>s in this certification | |
| 141 | + * path. This is the same string that would be returned by | |
| 142 | + * {@link java.security.cert.Certificate#getType() cert.getType()} | |
| 143 | + * for all <code>Certificate</code>s in the certification path. | |
| 144 | + * | |
| 145 | + * @return the type of <code>Certificate</code>s in this certification | |
| 146 | + * path (never null) | |
| 147 | + */ | |
| 148 | + public String getType() { | |
| 149 | + return type; | |
| 150 | + } | |
| 151 | + | |
| 152 | + /** | |
| 153 | + * Returns an iteration of the encodings supported by this certification | |
| 154 | + * path, with the default encoding first. Attempts to modify the returned | |
| 155 | + * <code>Iterator</code> via its <code>remove</code> method result in an | |
| 156 | + * <code>UnsupportedOperationException</code>. | |
| 157 | + * | |
| 158 | + * @return an <code>Iterator</code> over the names of the supported | |
| 159 | + * encodings (as Strings) | |
| 160 | + */ | |
| 161 | + public abstract Iterator<String> getEncodings(); | |
| 162 | + | |
| 163 | + /** | |
| 164 | + * Compares this certification path for equality with the specified | |
| 165 | + * object. Two <code>CertPath</code>s are equal if and only if their | |
| 166 | + * types are equal and their certificate <code>List</code>s (and by | |
| 167 | + * implication the <code>Certificate</code>s in those <code>List</code>s) | |
| 168 | + * are equal. A <code>CertPath</code> is never equal to an object that is | |
| 169 | + * not a <code>CertPath</code>. | |
| 170 | + * <p> | |
| 171 | + * This algorithm is implemented by this method. If it is overridden, | |
| 172 | + * the behavior specified here must be maintained. | |
| 173 | + * | |
| 174 | + * @param other the object to test for equality with this certification path | |
| 175 | + * @return true if the specified object is equal to this certification path, | |
| 176 | + * false otherwise | |
| 177 | + */ | |
| 178 | + public boolean equals(Object other) { | |
| 179 | + if (this == other) | |
| 180 | + return true; | |
| 181 | + | |
| 182 | + if (! (other instanceof CertPath)) | |
| 183 | + return false; | |
| 184 | + | |
| 185 | + CertPath otherCP = (CertPath) other; | |
| 186 | + if (! otherCP.getType().equals(type)) | |
| 187 | + return false; | |
| 188 | + | |
| 189 | + List<? extends Certificate> thisCertList = this.getCertificates(); | |
| 190 | + List<? extends Certificate> otherCertList = otherCP.getCertificates(); | |
| 191 | + return(thisCertList.equals(otherCertList)); | |
| 192 | + } | |
| 193 | + | |
| 194 | + /** | |
| 195 | + * Returns the hashcode for this certification path. The hash code of | |
| 196 | + * a certification path is defined to be the result of the following | |
| 197 | + * calculation: | |
| 198 | + * <pre><code> | |
| 199 | + * hashCode = path.getType().hashCode(); | |
| 200 | + * hashCode = 31*hashCode + path.getCertificates().hashCode(); | |
| 201 | + * </code></pre> | |
| 202 | + * This ensures that <code>path1.equals(path2)</code> implies that | |
| 203 | + * <code>path1.hashCode()==path2.hashCode()</code> for any two certification | |
| 204 | + * paths, <code>path1</code> and <code>path2</code>, as required by the | |
| 205 | + * general contract of <code>Object.hashCode</code>. | |
| 206 | + * | |
| 207 | + * @return the hashcode value for this certification path | |
| 208 | + */ | |
| 209 | + public int hashCode() { | |
| 210 | + int hashCode = type.hashCode(); | |
| 211 | + hashCode = 31*hashCode + getCertificates().hashCode(); | |
| 212 | + return hashCode; | |
| 213 | + } | |
| 214 | + | |
| 215 | + /** | |
| 216 | + * Returns a string representation of this certification path. | |
| 217 | + * This calls the <code>toString</code> method on each of the | |
| 218 | + * <code>Certificate</code>s in the path. | |
| 219 | + * | |
| 220 | + * @return a string representation of this certification path | |
| 221 | + */ | |
| 222 | + public String toString() { | |
| 223 | + StringBuffer sb = new StringBuffer(); | |
| 224 | + Iterator<? extends Certificate> stringIterator = | |
| 225 | + getCertificates().iterator(); | |
| 226 | + | |
| 227 | + sb.append("\n" + type + " Cert Path: length = " | |
| 228 | + + getCertificates().size() + ".\n"); | |
| 229 | + sb.append("[\n"); | |
| 230 | + int i = 1; | |
| 231 | + while (stringIterator.hasNext()) { | |
| 232 | + sb.append("==========================================" | |
| 233 | + + "===============Certificate " + i + " start.\n"); | |
| 234 | + Certificate stringCert = stringIterator.next(); | |
| 235 | + sb.append(stringCert.toString()); | |
| 236 | + sb.append("\n========================================" | |
| 237 | + + "=================Certificate " + i + " end.\n\n\n"); | |
| 238 | + i++; | |
| 239 | + } | |
| 240 | + | |
| 241 | + sb.append("\n]"); | |
| 242 | + return sb.toString(); | |
| 243 | + } | |
| 244 | + | |
| 245 | + /** | |
| 246 | + * Returns the encoded form of this certification path, using the default | |
| 247 | + * encoding. | |
| 248 | + * | |
| 249 | + * @return the encoded bytes | |
| 250 | + * @exception CertificateEncodingException if an encoding error occurs | |
| 251 | + */ | |
| 252 | + public abstract byte[] getEncoded() | |
| 253 | + throws CertificateEncodingException; | |
| 254 | + | |
| 255 | + /** | |
| 256 | + * Returns the encoded form of this certification path, using the | |
| 257 | + * specified encoding. | |
| 258 | + * | |
| 259 | + * @param encoding the name of the encoding to use | |
| 260 | + * @return the encoded bytes | |
| 261 | + * @exception CertificateEncodingException if an encoding error occurs or | |
| 262 | + * the encoding requested is not supported | |
| 263 | + */ | |
| 264 | + public abstract byte[] getEncoded(String encoding) | |
| 265 | + throws CertificateEncodingException; | |
| 266 | + | |
| 267 | + /** | |
| 268 | + * Returns the list of certificates in this certification path. | |
| 269 | + * The <code>List</code> returned must be immutable and thread-safe. | |
| 270 | + * | |
| 271 | + * @return an immutable <code>List</code> of <code>Certificate</code>s | |
| 272 | + * (may be empty, but not null) | |
| 273 | + */ | |
| 274 | + public abstract List<? extends Certificate> getCertificates(); | |
| 275 | + | |
| 276 | + /** | |
| 277 | + * Replaces the <code>CertPath</code> to be serialized with a | |
| 278 | + * <code>CertPathRep</code> object. | |
| 279 | + * | |
| 280 | + * @return the <code>CertPathRep</code> to be serialized | |
| 281 | + * | |
| 282 | + * @throws ObjectStreamException if a <code>CertPathRep</code> object | |
| 283 | + * representing this certification path could not be created | |
| 284 | + */ | |
| 285 | + protected Object writeReplace() throws ObjectStreamException { | |
| 286 | + try { | |
| 287 | + return new CertPathRep(type, getEncoded()); | |
| 288 | + } catch (CertificateException ce) { | |
| 289 | + NotSerializableException nse = | |
| 290 | + new NotSerializableException | |
| 291 | + ("java.security.cert.CertPath: " + type); | |
| 292 | + nse.initCause(ce); | |
| 293 | + throw nse; | |
| 294 | + } | |
| 295 | + } | |
| 296 | + | |
| 297 | + /** | |
| 298 | + * Alternate <code>CertPath</code> class for serialization. | |
| 299 | + * @since 1.4 | |
| 300 | + */ | |
| 301 | + protected static class CertPathRep implements Serializable { | |
| 302 | + | |
| 303 | + private static final long serialVersionUID = 3015633072427920915L; | |
| 304 | + | |
| 305 | + /** The Certificate type */ | |
| 306 | + private String type; | |
| 307 | + /** The encoded form of the cert path */ | |
| 308 | + private byte[] data; | |
| 309 | + | |
| 310 | + /** | |
| 311 | + * Creates a <code>CertPathRep</code> with the specified | |
| 312 | + * type and encoded form of a certification path. | |
| 313 | + * | |
| 314 | + * @param type the standard name of a <code>CertPath</code> type | |
| 315 | + * @param data the encoded form of the certification path | |
| 316 | + */ | |
| 317 | + protected CertPathRep(String type, byte[] data) { | |
| 318 | + this.type = type; | |
| 319 | + this.data = data; | |
| 320 | + } | |
| 321 | + | |
| 322 | + /** | |
| 323 | + * Returns a <code>CertPath</code> constructed from the type and data. | |
| 324 | + * | |
| 325 | + * @return the resolved <code>CertPath</code> object | |
| 326 | + * | |
| 327 | + * @throws ObjectStreamException if a <code>CertPath</code> could not | |
| 328 | + * be constructed | |
| 329 | + */ | |
| 330 | + protected Object readResolve() throws ObjectStreamException { | |
| 331 | + try { | |
| 332 | + CertificateFactory cf = CertificateFactory.getInstance(type); | |
| 333 | + return cf.generateCertPath(new ByteArrayInputStream(data)); | |
| 334 | + } catch (CertificateException ce) { | |
| 335 | + NotSerializableException nse = | |
| 336 | + new NotSerializableException | |
| 337 | + ("java.security.cert.CertPath: " + type); | |
| 338 | + nse.initCause(ce); | |
| 339 | + throw nse; | |
| 340 | + } | |
| 341 | + } | |
| 342 | + } | |
| 343 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,304 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.AccessController; | |
| 29 | +import java.security.InvalidAlgorithmParameterException; | |
| 30 | +import java.security.NoSuchAlgorithmException; | |
| 31 | +import java.security.NoSuchProviderException; | |
| 32 | +import java.security.PrivilegedAction; | |
| 33 | +import java.security.Provider; | |
| 34 | +import java.security.Security; | |
| 35 | +import sun.security.util.Debug; | |
| 36 | + | |
| 37 | +import sun.security.jca.*; | |
| 38 | +import sun.security.jca.GetInstance.Instance; | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * A class for building certification paths (also known as certificate chains). | |
| 42 | + * <p> | |
| 43 | + * This class uses a provider-based architecture. | |
| 44 | + * To create a <code>CertPathBuilder</code>, call | |
| 45 | + * one of the static <code>getInstance</code> methods, passing in the | |
| 46 | + * algorithm name of the <code>CertPathBuilder</code> desired and optionally | |
| 47 | + * the name of the provider desired. | |
| 48 | + * <p> | |
| 49 | + * Once a <code>CertPathBuilder</code> object has been created, certification | |
| 50 | + * paths can be constructed by calling the {@link #build build} method and | |
| 51 | + * passing it an algorithm-specific set of parameters. If successful, the | |
| 52 | + * result (including the <code>CertPath</code> that was built) is returned | |
| 53 | + * in an object that implements the <code>CertPathBuilderResult</code> | |
| 54 | + * interface. | |
| 55 | + * | |
| 56 | + * <p> Every implementation of the Java platform is required to support the | |
| 57 | + * following standard <code>CertPathBuilder</code> algorithm: | |
| 58 | + * <ul> | |
| 59 | + * <li><tt>PKIX</tt></li> | |
| 60 | + * </ul> | |
| 61 | + * This algorithm is described in the <a href= | |
| 62 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathBuilder"> | |
| 63 | + * CertPathBuilder section</a> of the | |
| 64 | + * Java Cryptography Architecture Standard Algorithm Name Documentation. | |
| 65 | + * Consult the release documentation for your implementation to see if any | |
| 66 | + * other algorithms are supported. | |
| 67 | + * | |
| 68 | + * <p> | |
| 69 | + * <b>Concurrent Access</b> | |
| 70 | + * <p> | |
| 71 | + * The static methods of this class are guaranteed to be thread-safe. | |
| 72 | + * Multiple threads may concurrently invoke the static methods defined in | |
| 73 | + * this class with no ill effects. | |
| 74 | + * <p> | |
| 75 | + * However, this is not true for the non-static methods defined by this class. | |
| 76 | + * Unless otherwise documented by a specific provider, threads that need to | |
| 77 | + * access a single <code>CertPathBuilder</code> instance concurrently should | |
| 78 | + * synchronize amongst themselves and provide the necessary locking. Multiple | |
| 79 | + * threads each manipulating a different <code>CertPathBuilder</code> instance | |
| 80 | + * need not synchronize. | |
| 81 | + * | |
| 82 | + * @see CertPath | |
| 83 | + * | |
| 84 | + * @since 1.4 | |
| 85 | + * @author Sean Mullan | |
| 86 | + * @author Yassir Elley | |
| 87 | + */ | |
| 88 | +public class CertPathBuilder { | |
| 89 | + | |
| 90 | + /* | |
| 91 | + * Constant to lookup in the Security properties file to determine | |
| 92 | + * the default certpathbuilder type. In the Security properties file, | |
| 93 | + * the default certpathbuilder type is given as: | |
| 94 | + * <pre> | |
| 95 | + * certpathbuilder.type=PKIX | |
| 96 | + * </pre> | |
| 97 | + */ | |
| 98 | + private static final String CPB_TYPE = "certpathbuilder.type"; | |
| 99 | + private static final Debug debug = Debug.getInstance("certpath"); | |
| 100 | + private CertPathBuilderSpi builderSpi; | |
| 101 | + private Provider provider; | |
| 102 | + private String algorithm; | |
| 103 | + | |
| 104 | + /** | |
| 105 | + * Creates a <code>CertPathBuilder</code> object of the given algorithm, | |
| 106 | + * and encapsulates the given provider implementation (SPI object) in it. | |
| 107 | + * | |
| 108 | + * @param builderSpi the provider implementation | |
| 109 | + * @param provider the provider | |
| 110 | + * @param algorithm the algorithm name | |
| 111 | + */ | |
| 112 | + protected CertPathBuilder(CertPathBuilderSpi builderSpi, Provider provider, | |
| 113 | + String algorithm) | |
| 114 | + { | |
| 115 | + this.builderSpi = builderSpi; | |
| 116 | + this.provider = provider; | |
| 117 | + this.algorithm = algorithm; | |
| 118 | + } | |
| 119 | + | |
| 120 | + /** | |
| 121 | + * Returns a <code>CertPathBuilder</code> object that implements the | |
| 122 | + * specified algorithm. | |
| 123 | + * | |
| 124 | + * <p> This method traverses the list of registered security Providers, | |
| 125 | + * starting with the most preferred Provider. | |
| 126 | + * A new CertPathBuilder object encapsulating the | |
| 127 | + * CertPathBuilderSpi implementation from the first | |
| 128 | + * Provider that supports the specified algorithm is returned. | |
| 129 | + * | |
| 130 | + * <p> Note that the list of registered providers may be retrieved via | |
| 131 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 132 | + * | |
| 133 | + * @param algorithm the name of the requested <code>CertPathBuilder</code> | |
| 134 | + * algorithm. See the CertPathBuilder section in the <a href= | |
| 135 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathBuilder"> | |
| 136 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 137 | + * for information about standard algorithm names. | |
| 138 | + * | |
| 139 | + * @return a <code>CertPathBuilder</code> object that implements the | |
| 140 | + * specified algorithm. | |
| 141 | + * | |
| 142 | + * @throws NoSuchAlgorithmException if no Provider supports a | |
| 143 | + * CertPathBuilderSpi implementation for the | |
| 144 | + * specified algorithm. | |
| 145 | + * | |
| 146 | + * @see java.security.Provider | |
| 147 | + */ | |
| 148 | + public static CertPathBuilder getInstance(String algorithm) | |
| 149 | + throws NoSuchAlgorithmException { | |
| 150 | + Instance instance = GetInstance.getInstance("CertPathBuilder", | |
| 151 | + CertPathBuilderSpi.class, algorithm); | |
| 152 | + return new CertPathBuilder((CertPathBuilderSpi)instance.impl, | |
| 153 | + instance.provider, algorithm); | |
| 154 | + } | |
| 155 | + | |
| 156 | + /** | |
| 157 | + * Returns a <code>CertPathBuilder</code> object that implements the | |
| 158 | + * specified algorithm. | |
| 159 | + * | |
| 160 | + * <p> A new CertPathBuilder object encapsulating the | |
| 161 | + * CertPathBuilderSpi implementation from the specified provider | |
| 162 | + * is returned. The specified provider must be registered | |
| 163 | + * in the security provider list. | |
| 164 | + * | |
| 165 | + * <p> Note that the list of registered providers may be retrieved via | |
| 166 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 167 | + * | |
| 168 | + * @param algorithm the name of the requested <code>CertPathBuilder</code> | |
| 169 | + * algorithm. See the CertPathBuilder section in the <a href= | |
| 170 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathBuilder"> | |
| 171 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 172 | + * for information about standard algorithm names. | |
| 173 | + * | |
| 174 | + * @param provider the name of the provider. | |
| 175 | + * | |
| 176 | + * @return a <code>CertPathBuilder</code> object that implements the | |
| 177 | + * specified algorithm. | |
| 178 | + * | |
| 179 | + * @throws NoSuchAlgorithmException if a CertPathBuilderSpi | |
| 180 | + * implementation for the specified algorithm is not | |
| 181 | + * available from the specified provider. | |
| 182 | + * | |
| 183 | + * @throws NoSuchProviderException if the specified provider is not | |
| 184 | + * registered in the security provider list. | |
| 185 | + * | |
| 186 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 187 | + * null or empty. | |
| 188 | + * | |
| 189 | + * @see java.security.Provider | |
| 190 | + */ | |
| 191 | + public static CertPathBuilder getInstance(String algorithm, String provider) | |
| 192 | + throws NoSuchAlgorithmException, NoSuchProviderException { | |
| 193 | + Instance instance = GetInstance.getInstance("CertPathBuilder", | |
| 194 | + CertPathBuilderSpi.class, algorithm, provider); | |
| 195 | + return new CertPathBuilder((CertPathBuilderSpi)instance.impl, | |
| 196 | + instance.provider, algorithm); | |
| 197 | + } | |
| 198 | + | |
| 199 | + /** | |
| 200 | + * Returns a <code>CertPathBuilder</code> object that implements the | |
| 201 | + * specified algorithm. | |
| 202 | + * | |
| 203 | + * <p> A new CertPathBuilder object encapsulating the | |
| 204 | + * CertPathBuilderSpi implementation from the specified Provider | |
| 205 | + * object is returned. Note that the specified Provider object | |
| 206 | + * does not have to be registered in the provider list. | |
| 207 | + * | |
| 208 | + * @param algorithm the name of the requested <code>CertPathBuilder</code> | |
| 209 | + * algorithm. See the CertPathBuilder section in the <a href= | |
| 210 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathBuilder"> | |
| 211 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 212 | + * for information about standard algorithm names. | |
| 213 | + * | |
| 214 | + * @param provider the provider. | |
| 215 | + * | |
| 216 | + * @return a <code>CertPathBuilder</code> object that implements the | |
| 217 | + * specified algorithm. | |
| 218 | + * | |
| 219 | + * @exception NoSuchAlgorithmException if a CertPathBuilderSpi | |
| 220 | + * implementation for the specified algorithm is not available | |
| 221 | + * from the specified Provider object. | |
| 222 | + * | |
| 223 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 224 | + * null. | |
| 225 | + * | |
| 226 | + * @see java.security.Provider | |
| 227 | + */ | |
| 228 | + public static CertPathBuilder getInstance(String algorithm, | |
| 229 | + Provider provider) throws NoSuchAlgorithmException { | |
| 230 | + Instance instance = GetInstance.getInstance("CertPathBuilder", | |
| 231 | + CertPathBuilderSpi.class, algorithm, provider); | |
| 232 | + return new CertPathBuilder((CertPathBuilderSpi)instance.impl, | |
| 233 | + instance.provider, algorithm); | |
| 234 | + } | |
| 235 | + | |
| 236 | + /** | |
| 237 | + * Returns the provider of this <code>CertPathBuilder</code>. | |
| 238 | + * | |
| 239 | + * @return the provider of this <code>CertPathBuilder</code> | |
| 240 | + */ | |
| 241 | + public final Provider getProvider() { | |
| 242 | + return this.provider; | |
| 243 | + } | |
| 244 | + | |
| 245 | + /** | |
| 246 | + * Returns the name of the algorithm of this <code>CertPathBuilder</code>. | |
| 247 | + * | |
| 248 | + * @return the name of the algorithm of this <code>CertPathBuilder</code> | |
| 249 | + */ | |
| 250 | + public final String getAlgorithm() { | |
| 251 | + return this.algorithm; | |
| 252 | + } | |
| 253 | + | |
| 254 | + /** | |
| 255 | + * Attempts to build a certification path using the specified algorithm | |
| 256 | + * parameter set. | |
| 257 | + * | |
| 258 | + * @param params the algorithm parameters | |
| 259 | + * @return the result of the build algorithm | |
| 260 | + * @throws CertPathBuilderException if the builder is unable to construct | |
| 261 | + * a certification path that satisfies the specified parameters | |
| 262 | + * @throws InvalidAlgorithmParameterException if the specified parameters | |
| 263 | + * are inappropriate for this <code>CertPathBuilder</code> | |
| 264 | + */ | |
| 265 | + public final CertPathBuilderResult build(CertPathParameters params) | |
| 266 | + throws CertPathBuilderException, InvalidAlgorithmParameterException | |
| 267 | + { | |
| 268 | + return builderSpi.engineBuild(params); | |
| 269 | + } | |
| 270 | + | |
| 271 | + /** | |
| 272 | + * Returns the default <code>CertPathBuilder</code> type as specified in | |
| 273 | + * the Java security properties file, or the string "PKIX" | |
| 274 | + * if no such property exists. The Java security properties file is | |
| 275 | + * located in the file named <JAVA_HOME>/lib/security/java.security. | |
| 276 | + * <JAVA_HOME> refers to the value of the java.home system property, | |
| 277 | + * and specifies the directory where the JRE is installed. | |
| 278 | + * | |
| 279 | + * <p>The default <code>CertPathBuilder</code> type can be used by | |
| 280 | + * applications that do not want to use a hard-coded type when calling one | |
| 281 | + * of the <code>getInstance</code> methods, and want to provide a default | |
| 282 | + * type in case a user does not specify its own. | |
| 283 | + * | |
| 284 | + * <p>The default <code>CertPathBuilder</code> type can be changed by | |
| 285 | + * setting the value of the "certpathbuilder.type" security property | |
| 286 | + * (in the Java security properties file) to the desired type. | |
| 287 | + * | |
| 288 | + * @return the default <code>CertPathBuilder</code> type as specified | |
| 289 | + * in the Java security properties file, or the string "PKIX" | |
| 290 | + * if no such property exists. | |
| 291 | + */ | |
| 292 | + public final static String getDefaultType() { | |
| 293 | + String cpbtype; | |
| 294 | + cpbtype = AccessController.doPrivileged(new PrivilegedAction<String>() { | |
| 295 | + public String run() { | |
| 296 | + return Security.getProperty(CPB_TYPE); | |
| 297 | + } | |
| 298 | + }); | |
| 299 | + if (cpbtype == null) { | |
| 300 | + cpbtype = "PKIX"; | |
| 301 | + } | |
| 302 | + return cpbtype; | |
| 303 | + } | |
| 304 | +} | |
Binary file not shown.
| @@ -0,0 +1,104 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.GeneralSecurityException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * An exception indicating one of a variety of problems encountered when | |
| 32 | + * building a certification path with a <code>CertPathBuilder</code>. | |
| 33 | + * <p> | |
| 34 | + * A <code>CertPathBuilderException</code> provides support for wrapping | |
| 35 | + * exceptions. The {@link #getCause getCause} method returns the throwable, | |
| 36 | + * if any, that caused this exception to be thrown. | |
| 37 | + * <p> | |
| 38 | + * <b>Concurrent Access</b> | |
| 39 | + * <p> | |
| 40 | + * Unless otherwise specified, the methods defined in this class are not | |
| 41 | + * thread-safe. Multiple threads that need to access a single | |
| 42 | + * object concurrently should synchronize amongst themselves and | |
| 43 | + * provide the necessary locking. Multiple threads each manipulating | |
| 44 | + * separate objects need not synchronize. | |
| 45 | + * | |
| 46 | + * @see CertPathBuilder | |
| 47 | + * | |
| 48 | + * @since 1.4 | |
| 49 | + * @author Sean Mullan | |
| 50 | + */ | |
| 51 | +public class CertPathBuilderException extends GeneralSecurityException { | |
| 52 | + | |
| 53 | + private static final long serialVersionUID = 5316471420178794402L; | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * Creates a <code>CertPathBuilderException</code> with <code>null</code> | |
| 57 | + * as its detail message. | |
| 58 | + */ | |
| 59 | + public CertPathBuilderException() { | |
| 60 | + super(); | |
| 61 | + } | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Creates a <code>CertPathBuilderException</code> with the given | |
| 65 | + * detail message. The detail message is a <code>String</code> that | |
| 66 | + * describes this particular exception in more detail. | |
| 67 | + * | |
| 68 | + * @param msg the detail message | |
| 69 | + */ | |
| 70 | + public CertPathBuilderException(String msg) { | |
| 71 | + super(msg); | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Creates a <code>CertPathBuilderException</code> that wraps the specified | |
| 76 | + * throwable. This allows any exception to be converted into a | |
| 77 | + * <code>CertPathBuilderException</code>, while retaining information | |
| 78 | + * about the wrapped exception, which may be useful for debugging. The | |
| 79 | + * detail message is set to (<code>cause==null ? null : cause.toString() | |
| 80 | + * </code>) (which typically contains the class and detail message of | |
| 81 | + * cause). | |
| 82 | + * | |
| 83 | + * @param cause the cause (which is saved for later retrieval by the | |
| 84 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 85 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 86 | + */ | |
| 87 | + public CertPathBuilderException(Throwable cause) { | |
| 88 | + super(cause); | |
| 89 | + } | |
| 90 | + | |
| 91 | + /** | |
| 92 | + * Creates a <code>CertPathBuilderException</code> with the specified | |
| 93 | + * detail message and cause. | |
| 94 | + * | |
| 95 | + * @param msg the detail message | |
| 96 | + * @param cause the cause (which is saved for later retrieval by the | |
| 97 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 98 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 99 | + */ | |
| 100 | + public CertPathBuilderException(String msg, Throwable cause) { | |
| 101 | + super(msg, cause); | |
| 102 | + } | |
| 103 | + | |
| 104 | +} | |
Binary file not shown.
| @@ -0,0 +1,68 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A specification of the result of a certification path builder algorithm. | |
| 30 | + * All results returned by the {@link CertPathBuilder#build | |
| 31 | + * CertPathBuilder.build} method must implement this interface. | |
| 32 | + * <p> | |
| 33 | + * At a minimum, a <code>CertPathBuilderResult</code> contains the | |
| 34 | + * <code>CertPath</code> built by the <code>CertPathBuilder</code> instance. | |
| 35 | + * Implementations of this interface may add methods to return implementation | |
| 36 | + * or algorithm specific information, such as debugging information or | |
| 37 | + * certification path validation results. | |
| 38 | + * <p> | |
| 39 | + * <b>Concurrent Access</b> | |
| 40 | + * <p> | |
| 41 | + * Unless otherwise specified, the methods defined in this interface are not | |
| 42 | + * thread-safe. Multiple threads that need to access a single | |
| 43 | + * object concurrently should synchronize amongst themselves and | |
| 44 | + * provide the necessary locking. Multiple threads each manipulating | |
| 45 | + * separate objects need not synchronize. | |
| 46 | + * | |
| 47 | + * @see CertPathBuilder | |
| 48 | + * | |
| 49 | + * @since 1.4 | |
| 50 | + * @author Sean Mullan | |
| 51 | + */ | |
| 52 | +public interface CertPathBuilderResult extends Cloneable { | |
| 53 | + | |
| 54 | + /** | |
| 55 | + * Returns the built certification path. | |
| 56 | + * | |
| 57 | + * @return the certification path (never <code>null</code>) | |
| 58 | + */ | |
| 59 | + CertPath getCertPath(); | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Makes a copy of this <code>CertPathBuilderResult</code>. Changes to the | |
| 63 | + * copy will not affect the original and vice versa. | |
| 64 | + * | |
| 65 | + * @return a copy of this <code>CertPathBuilderResult</code> | |
| 66 | + */ | |
| 67 | + Object clone(); | |
| 68 | +} | |
Binary file not shown.
| @@ -0,0 +1,75 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.InvalidAlgorithmParameterException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * The <i>Service Provider Interface</i> (<b>SPI</b>) | |
| 32 | + * for the {@link CertPathBuilder CertPathBuilder} class. All | |
| 33 | + * <code>CertPathBuilder</code> implementations must include a class (the | |
| 34 | + * SPI class) that extends this class (<code>CertPathBuilderSpi</code>) and | |
| 35 | + * implements all of its methods. In general, instances of this class should | |
| 36 | + * only be accessed through the <code>CertPathBuilder</code> class. For | |
| 37 | + * details, see the Java Cryptography Architecture. | |
| 38 | + * <p> | |
| 39 | + * <b>Concurrent Access</b> | |
| 40 | + * <p> | |
| 41 | + * Instances of this class need not be protected against concurrent | |
| 42 | + * access from multiple threads. Threads that need to access a single | |
| 43 | + * <code>CertPathBuilderSpi</code> instance concurrently should synchronize | |
| 44 | + * amongst themselves and provide the necessary locking before calling the | |
| 45 | + * wrapping <code>CertPathBuilder</code> object. | |
| 46 | + * <p> | |
| 47 | + * However, implementations of <code>CertPathBuilderSpi</code> may still | |
| 48 | + * encounter concurrency issues, since multiple threads each | |
| 49 | + * manipulating a different <code>CertPathBuilderSpi</code> instance need not | |
| 50 | + * synchronize. | |
| 51 | + * | |
| 52 | + * @since 1.4 | |
| 53 | + * @author Sean Mullan | |
| 54 | + */ | |
| 55 | +public abstract class CertPathBuilderSpi { | |
| 56 | + | |
| 57 | + /** | |
| 58 | + * The default constructor. | |
| 59 | + */ | |
| 60 | + public CertPathBuilderSpi() { } | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * Attempts to build a certification path using the specified | |
| 64 | + * algorithm parameter set. | |
| 65 | + * | |
| 66 | + * @param params the algorithm parameters | |
| 67 | + * @return the result of the build algorithm | |
| 68 | + * @throws CertPathBuilderException if the builder is unable to construct | |
| 69 | + * a certification path that satisfies the specified parameters | |
| 70 | + * @throws InvalidAlgorithmParameterException if the specified parameters | |
| 71 | + * are inappropriate for this <code>CertPathBuilder</code> | |
| 72 | + */ | |
| 73 | + public abstract CertPathBuilderResult engineBuild(CertPathParameters params) | |
| 74 | + throws CertPathBuilderException, InvalidAlgorithmParameterException; | |
| 75 | +} | |
Binary file not shown.
| @@ -0,0 +1,66 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.util.*; | |
| 29 | + | |
| 30 | +import sun.security.provider.certpath.CertPathHelper; | |
| 31 | + | |
| 32 | +import sun.security.x509.GeneralNameInterface; | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * Helper class that allows the Sun CertPath provider to access | |
| 36 | + * implementation dependent APIs in CertPath framework. | |
| 37 | + * | |
| 38 | + * @author Andreas Sterbenz | |
| 39 | + */ | |
| 40 | +class CertPathHelperImpl extends CertPathHelper { | |
| 41 | + | |
| 42 | + private CertPathHelperImpl() { | |
| 43 | + // empty | |
| 44 | + } | |
| 45 | + | |
| 46 | + /** | |
| 47 | + * Initialize the helper framework. This method must be called from | |
| 48 | + * the static initializer of each class that is the target of one of | |
| 49 | + * the methods in this class. This ensures that the helper is initialized | |
| 50 | + * prior to a tunneled call from the Sun provider. | |
| 51 | + */ | |
| 52 | + synchronized static void initialize() { | |
| 53 | + if (CertPathHelper.instance == null) { | |
| 54 | + CertPathHelper.instance = new CertPathHelperImpl(); | |
| 55 | + } | |
| 56 | + } | |
| 57 | + | |
| 58 | + protected void implSetPathToNames(X509CertSelector sel, | |
| 59 | + Set<GeneralNameInterface> names) { | |
| 60 | + sel.setPathToNamesInternal(names); | |
| 61 | + } | |
| 62 | + | |
| 63 | + protected void implSetDateAndTime(X509CRLSelector sel, Date date, long skew) { | |
| 64 | + sel.setDateAndTime(date, skew); | |
| 65 | + } | |
| 66 | +} | |
Binary file not shown.
| @@ -0,0 +1,49 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A specification of certification path algorithm parameters. | |
| 30 | + * The purpose of this interface is to group (and provide type safety for) | |
| 31 | + * all <code>CertPath</code> parameter specifications. All | |
| 32 | + * <code>CertPath</code> parameter specifications must implement this | |
| 33 | + * interface. | |
| 34 | + * | |
| 35 | + * @author Yassir Elley | |
| 36 | + * @see CertPathValidator#validate(CertPath, CertPathParameters) | |
| 37 | + * @see CertPathBuilder#build(CertPathParameters) | |
| 38 | + * @since 1.4 | |
| 39 | + */ | |
| 40 | +public interface CertPathParameters extends Cloneable { | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * Makes a copy of this <code>CertPathParameters</code>. Changes to the | |
| 44 | + * copy will not affect the original and vice versa. | |
| 45 | + * | |
| 46 | + * @return a copy of this <code>CertPathParameters</code> | |
| 47 | + */ | |
| 48 | + Object clone(); | |
| 49 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,315 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.AccessController; | |
| 29 | +import java.security.InvalidAlgorithmParameterException; | |
| 30 | +import java.security.NoSuchAlgorithmException; | |
| 31 | +import java.security.NoSuchProviderException; | |
| 32 | +import java.security.PrivilegedAction; | |
| 33 | +import java.security.Provider; | |
| 34 | +import java.security.Security; | |
| 35 | +import sun.security.util.Debug; | |
| 36 | + | |
| 37 | +import sun.security.jca.*; | |
| 38 | +import sun.security.jca.GetInstance.Instance; | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * A class for validating certification paths (also known as certificate | |
| 42 | + * chains). | |
| 43 | + * <p> | |
| 44 | + * This class uses a provider-based architecture. | |
| 45 | + * To create a <code>CertPathValidator</code>, | |
| 46 | + * call one of the static <code>getInstance</code> methods, passing in the | |
| 47 | + * algorithm name of the <code>CertPathValidator</code> desired and | |
| 48 | + * optionally the name of the provider desired. | |
| 49 | + * <p> | |
| 50 | + * Once a <code>CertPathValidator</code> object has been created, it can | |
| 51 | + * be used to validate certification paths by calling the {@link #validate | |
| 52 | + * validate} method and passing it the <code>CertPath</code> to be validated | |
| 53 | + * and an algorithm-specific set of parameters. If successful, the result is | |
| 54 | + * returned in an object that implements the | |
| 55 | + * <code>CertPathValidatorResult</code> interface. | |
| 56 | + * | |
| 57 | + * <p> Every implementation of the Java platform is required to support the | |
| 58 | + * following standard <code>CertPathValidator</code> algorithm: | |
| 59 | + * <ul> | |
| 60 | + * <li><tt>PKIX</tt></li> | |
| 61 | + * </ul> | |
| 62 | + * This algorithm is described in the <a href= | |
| 63 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathValidator"> | |
| 64 | + * CertPathValidator section</a> of the | |
| 65 | + * Java Cryptography Architecture Standard Algorithm Name Documentation. | |
| 66 | + * Consult the release documentation for your implementation to see if any | |
| 67 | + * other algorithms are supported. | |
| 68 | + * | |
| 69 | + * <p> | |
| 70 | + * <b>Concurrent Access</b> | |
| 71 | + * <p> | |
| 72 | + * The static methods of this class are guaranteed to be thread-safe. | |
| 73 | + * Multiple threads may concurrently invoke the static methods defined in | |
| 74 | + * this class with no ill effects. | |
| 75 | + * <p> | |
| 76 | + * However, this is not true for the non-static methods defined by this class. | |
| 77 | + * Unless otherwise documented by a specific provider, threads that need to | |
| 78 | + * access a single <code>CertPathValidator</code> instance concurrently should | |
| 79 | + * synchronize amongst themselves and provide the necessary locking. Multiple | |
| 80 | + * threads each manipulating a different <code>CertPathValidator</code> | |
| 81 | + * instance need not synchronize. | |
| 82 | + * | |
| 83 | + * @see CertPath | |
| 84 | + * | |
| 85 | + * @since 1.4 | |
| 86 | + * @author Yassir Elley | |
| 87 | + */ | |
| 88 | +public class CertPathValidator { | |
| 89 | + | |
| 90 | + /* | |
| 91 | + * Constant to lookup in the Security properties file to determine | |
| 92 | + * the default certpathvalidator type. In the Security properties file, | |
| 93 | + * the default certpathvalidator type is given as: | |
| 94 | + * <pre> | |
| 95 | + * certpathvalidator.type=PKIX | |
| 96 | + * </pre> | |
| 97 | + */ | |
| 98 | + private static final String CPV_TYPE = "certpathvalidator.type"; | |
| 99 | + private static final Debug debug = Debug.getInstance("certpath"); | |
| 100 | + private CertPathValidatorSpi validatorSpi; | |
| 101 | + private Provider provider; | |
| 102 | + private String algorithm; | |
| 103 | + | |
| 104 | + /** | |
| 105 | + * Creates a <code>CertPathValidator</code> object of the given algorithm, | |
| 106 | + * and encapsulates the given provider implementation (SPI object) in it. | |
| 107 | + * | |
| 108 | + * @param validatorSpi the provider implementation | |
| 109 | + * @param provider the provider | |
| 110 | + * @param algorithm the algorithm name | |
| 111 | + */ | |
| 112 | + protected CertPathValidator(CertPathValidatorSpi validatorSpi, | |
| 113 | + Provider provider, String algorithm) | |
| 114 | + { | |
| 115 | + this.validatorSpi = validatorSpi; | |
| 116 | + this.provider = provider; | |
| 117 | + this.algorithm = algorithm; | |
| 118 | + } | |
| 119 | + | |
| 120 | + /** | |
| 121 | + * Returns a <code>CertPathValidator</code> object that implements the | |
| 122 | + * specified algorithm. | |
| 123 | + * | |
| 124 | + * <p> This method traverses the list of registered security Providers, | |
| 125 | + * starting with the most preferred Provider. | |
| 126 | + * A new CertPathValidator object encapsulating the | |
| 127 | + * CertPathValidatorSpi implementation from the first | |
| 128 | + * Provider that supports the specified algorithm is returned. | |
| 129 | + * | |
| 130 | + * <p> Note that the list of registered providers may be retrieved via | |
| 131 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 132 | + * | |
| 133 | + * @param algorithm the name of the requested <code>CertPathValidator</code> | |
| 134 | + * algorithm. See the CertPathValidator section in the <a href= | |
| 135 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathValidator"> | |
| 136 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 137 | + * for information about standard algorithm names. | |
| 138 | + * | |
| 139 | + * @return a <code>CertPathValidator</code> object that implements the | |
| 140 | + * specified algorithm. | |
| 141 | + * | |
| 142 | + * @exception NoSuchAlgorithmException if no Provider supports a | |
| 143 | + * CertPathValidatorSpi implementation for the | |
| 144 | + * specified algorithm. | |
| 145 | + * | |
| 146 | + * @see java.security.Provider | |
| 147 | + */ | |
| 148 | + public static CertPathValidator getInstance(String algorithm) | |
| 149 | + throws NoSuchAlgorithmException { | |
| 150 | + Instance instance = GetInstance.getInstance("CertPathValidator", | |
| 151 | + CertPathValidatorSpi.class, algorithm); | |
| 152 | + return new CertPathValidator((CertPathValidatorSpi)instance.impl, | |
| 153 | + instance.provider, algorithm); | |
| 154 | + } | |
| 155 | + | |
| 156 | + /** | |
| 157 | + * Returns a <code>CertPathValidator</code> object that implements the | |
| 158 | + * specified algorithm. | |
| 159 | + * | |
| 160 | + * <p> A new CertPathValidator object encapsulating the | |
| 161 | + * CertPathValidatorSpi implementation from the specified provider | |
| 162 | + * is returned. The specified provider must be registered | |
| 163 | + * in the security provider list. | |
| 164 | + * | |
| 165 | + * <p> Note that the list of registered providers may be retrieved via | |
| 166 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 167 | + * | |
| 168 | + * @param algorithm the name of the requested <code>CertPathValidator</code> | |
| 169 | + * algorithm. See the CertPathValidator section in the <a href= | |
| 170 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathValidator"> | |
| 171 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 172 | + * for information about standard algorithm names. | |
| 173 | + * | |
| 174 | + * @param provider the name of the provider. | |
| 175 | + * | |
| 176 | + * @return a <code>CertPathValidator</code> object that implements the | |
| 177 | + * specified algorithm. | |
| 178 | + * | |
| 179 | + * @exception NoSuchAlgorithmException if a CertPathValidatorSpi | |
| 180 | + * implementation for the specified algorithm is not | |
| 181 | + * available from the specified provider. | |
| 182 | + * | |
| 183 | + * @exception NoSuchProviderException if the specified provider is not | |
| 184 | + * registered in the security provider list. | |
| 185 | + * | |
| 186 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 187 | + * null or empty. | |
| 188 | + * | |
| 189 | + * @see java.security.Provider | |
| 190 | + */ | |
| 191 | + public static CertPathValidator getInstance(String algorithm, | |
| 192 | + String provider) throws NoSuchAlgorithmException, | |
| 193 | + NoSuchProviderException { | |
| 194 | + Instance instance = GetInstance.getInstance("CertPathValidator", | |
| 195 | + CertPathValidatorSpi.class, algorithm, provider); | |
| 196 | + return new CertPathValidator((CertPathValidatorSpi)instance.impl, | |
| 197 | + instance.provider, algorithm); | |
| 198 | + } | |
| 199 | + | |
| 200 | + /** | |
| 201 | + * Returns a <code>CertPathValidator</code> object that implements the | |
| 202 | + * specified algorithm. | |
| 203 | + * | |
| 204 | + * <p> A new CertPathValidator object encapsulating the | |
| 205 | + * CertPathValidatorSpi implementation from the specified Provider | |
| 206 | + * object is returned. Note that the specified Provider object | |
| 207 | + * does not have to be registered in the provider list. | |
| 208 | + * | |
| 209 | + * @param algorithm the name of the requested <code>CertPathValidator</code> | |
| 210 | + * algorithm. See the CertPathValidator section in the <a href= | |
| 211 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathValidator"> | |
| 212 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 213 | + * for information about standard algorithm names. | |
| 214 | + * | |
| 215 | + * @param provider the provider. | |
| 216 | + * | |
| 217 | + * @return a <code>CertPathValidator</code> object that implements the | |
| 218 | + * specified algorithm. | |
| 219 | + * | |
| 220 | + * @exception NoSuchAlgorithmException if a CertPathValidatorSpi | |
| 221 | + * implementation for the specified algorithm is not available | |
| 222 | + * from the specified Provider object. | |
| 223 | + * | |
| 224 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 225 | + * null. | |
| 226 | + * | |
| 227 | + * @see java.security.Provider | |
| 228 | + */ | |
| 229 | + public static CertPathValidator getInstance(String algorithm, | |
| 230 | + Provider provider) throws NoSuchAlgorithmException { | |
| 231 | + Instance instance = GetInstance.getInstance("CertPathValidator", | |
| 232 | + CertPathValidatorSpi.class, algorithm, provider); | |
| 233 | + return new CertPathValidator((CertPathValidatorSpi)instance.impl, | |
| 234 | + instance.provider, algorithm); | |
| 235 | + } | |
| 236 | + | |
| 237 | + /** | |
| 238 | + * Returns the <code>Provider</code> of this | |
| 239 | + * <code>CertPathValidator</code>. | |
| 240 | + * | |
| 241 | + * @return the <code>Provider</code> of this <code>CertPathValidator</code> | |
| 242 | + */ | |
| 243 | + public final Provider getProvider() { | |
| 244 | + return this.provider; | |
| 245 | + } | |
| 246 | + | |
| 247 | + /** | |
| 248 | + * Returns the algorithm name of this <code>CertPathValidator</code>. | |
| 249 | + * | |
| 250 | + * @return the algorithm name of this <code>CertPathValidator</code> | |
| 251 | + */ | |
| 252 | + public final String getAlgorithm() { | |
| 253 | + return this.algorithm; | |
| 254 | + } | |
| 255 | + | |
| 256 | + /** | |
| 257 | + * Validates the specified certification path using the specified | |
| 258 | + * algorithm parameter set. | |
| 259 | + * <p> | |
| 260 | + * The <code>CertPath</code> specified must be of a type that is | |
| 261 | + * supported by the validation algorithm, otherwise an | |
| 262 | + * <code>InvalidAlgorithmParameterException</code> will be thrown. For | |
| 263 | + * example, a <code>CertPathValidator</code> that implements the PKIX | |
| 264 | + * algorithm validates <code>CertPath</code> objects of type X.509. | |
| 265 | + * | |
| 266 | + * @param certPath the <code>CertPath</code> to be validated | |
| 267 | + * @param params the algorithm parameters | |
| 268 | + * @return the result of the validation algorithm | |
| 269 | + * @exception CertPathValidatorException if the <code>CertPath</code> | |
| 270 | + * does not validate | |
| 271 | + * @exception InvalidAlgorithmParameterException if the specified | |
| 272 | + * parameters or the type of the specified <code>CertPath</code> are | |
| 273 | + * inappropriate for this <code>CertPathValidator</code> | |
| 274 | + */ | |
| 275 | + public final CertPathValidatorResult validate(CertPath certPath, | |
| 276 | + CertPathParameters params) | |
| 277 | + throws CertPathValidatorException, InvalidAlgorithmParameterException | |
| 278 | + { | |
| 279 | + return validatorSpi.engineValidate(certPath, params); | |
| 280 | + } | |
| 281 | + | |
| 282 | + /** | |
| 283 | + * Returns the default <code>CertPathValidator</code> type as specified in | |
| 284 | + * the Java security properties file, or the string "PKIX" | |
| 285 | + * if no such property exists. The Java security properties file is | |
| 286 | + * located in the file named <JAVA_HOME>/lib/security/java.security. | |
| 287 | + * <JAVA_HOME> refers to the value of the java.home system property, | |
| 288 | + * and specifies the directory where the JRE is installed. | |
| 289 | + * | |
| 290 | + * <p>The default <code>CertPathValidator</code> type can be used by | |
| 291 | + * applications that do not want to use a hard-coded type when calling one | |
| 292 | + * of the <code>getInstance</code> methods, and want to provide a default | |
| 293 | + * type in case a user does not specify its own. | |
| 294 | + * | |
| 295 | + * <p>The default <code>CertPathValidator</code> type can be changed by | |
| 296 | + * setting the value of the "certpathvalidator.type" security property | |
| 297 | + * (in the Java security properties file) to the desired type. | |
| 298 | + * | |
| 299 | + * @return the default <code>CertPathValidator</code> type as specified | |
| 300 | + * in the Java security properties file, or the string "PKIX" | |
| 301 | + * if no such property exists. | |
| 302 | + */ | |
| 303 | + public final static String getDefaultType() { | |
| 304 | + String cpvtype; | |
| 305 | + cpvtype = AccessController.doPrivileged(new PrivilegedAction<String>() { | |
| 306 | + public String run() { | |
| 307 | + return Security.getProperty(CPV_TYPE); | |
| 308 | + } | |
| 309 | + }); | |
| 310 | + if (cpvtype == null) { | |
| 311 | + cpvtype = "PKIX"; | |
| 312 | + } | |
| 313 | + return cpvtype; | |
| 314 | + } | |
| 315 | +} | |
Binary file not shown.
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,296 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.InvalidObjectException; | |
| 29 | +import java.io.IOException; | |
| 30 | +import java.io.ObjectInputStream; | |
| 31 | +import java.security.GeneralSecurityException; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * An exception indicating one of a variety of problems encountered when | |
| 35 | + * validating a certification path. | |
| 36 | + * <p> | |
| 37 | + * A <code>CertPathValidatorException</code> provides support for wrapping | |
| 38 | + * exceptions. The {@link #getCause getCause} method returns the throwable, | |
| 39 | + * if any, that caused this exception to be thrown. | |
| 40 | + * <p> | |
| 41 | + * A <code>CertPathValidatorException</code> may also include the | |
| 42 | + * certification path that was being validated when the exception was thrown, | |
| 43 | + * the index of the certificate in the certification path that caused the | |
| 44 | + * exception to be thrown, and the reason that caused the failure. Use the | |
| 45 | + * {@link #getCertPath getCertPath}, {@link #getIndex getIndex}, and | |
| 46 | + * {@link #getReason getReason} methods to retrieve this information. | |
| 47 | + * | |
| 48 | + * <p> | |
| 49 | + * <b>Concurrent Access</b> | |
| 50 | + * <p> | |
| 51 | + * Unless otherwise specified, the methods defined in this class are not | |
| 52 | + * thread-safe. Multiple threads that need to access a single | |
| 53 | + * object concurrently should synchronize amongst themselves and | |
| 54 | + * provide the necessary locking. Multiple threads each manipulating | |
| 55 | + * separate objects need not synchronize. | |
| 56 | + * | |
| 57 | + * @see CertPathValidator | |
| 58 | + * | |
| 59 | + * @since 1.4 | |
| 60 | + * @author Yassir Elley | |
| 61 | + */ | |
| 62 | +public class CertPathValidatorException extends GeneralSecurityException { | |
| 63 | + | |
| 64 | + private static final long serialVersionUID = -3083180014971893139L; | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * @serial the index of the certificate in the certification path | |
| 68 | + * that caused the exception to be thrown | |
| 69 | + */ | |
| 70 | + private int index = -1; | |
| 71 | + | |
| 72 | + /** | |
| 73 | + * @serial the <code>CertPath</code> that was being validated when | |
| 74 | + * the exception was thrown | |
| 75 | + */ | |
| 76 | + private CertPath certPath; | |
| 77 | + | |
| 78 | + /** | |
| 79 | + * @serial the reason the validation failed | |
| 80 | + */ | |
| 81 | + private Reason reason = BasicReason.UNSPECIFIED; | |
| 82 | + | |
| 83 | + /** | |
| 84 | + * Creates a <code>CertPathValidatorException</code> with | |
| 85 | + * no detail message. | |
| 86 | + */ | |
| 87 | + public CertPathValidatorException() { | |
| 88 | + this(null, null); | |
| 89 | + } | |
| 90 | + | |
| 91 | + /** | |
| 92 | + * Creates a <code>CertPathValidatorException</code> with the given | |
| 93 | + * detail message. A detail message is a <code>String</code> that | |
| 94 | + * describes this particular exception. | |
| 95 | + * | |
| 96 | + * @param msg the detail message | |
| 97 | + */ | |
| 98 | + public CertPathValidatorException(String msg) { | |
| 99 | + this(msg, null); | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Creates a <code>CertPathValidatorException</code> that wraps the | |
| 104 | + * specified throwable. This allows any exception to be converted into a | |
| 105 | + * <code>CertPathValidatorException</code>, while retaining information | |
| 106 | + * about the wrapped exception, which may be useful for debugging. The | |
| 107 | + * detail message is set to (<code>cause==null ? null : cause.toString() | |
| 108 | + * </code>) (which typically contains the class and detail message of | |
| 109 | + * cause). | |
| 110 | + * | |
| 111 | + * @param cause the cause (which is saved for later retrieval by the | |
| 112 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 113 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 114 | + */ | |
| 115 | + public CertPathValidatorException(Throwable cause) { | |
| 116 | + this((cause == null ? null : cause.toString()), cause); | |
| 117 | + } | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * Creates a <code>CertPathValidatorException</code> with the specified | |
| 121 | + * detail message and cause. | |
| 122 | + * | |
| 123 | + * @param msg the detail message | |
| 124 | + * @param cause the cause (which is saved for later retrieval by the | |
| 125 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 126 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 127 | + */ | |
| 128 | + public CertPathValidatorException(String msg, Throwable cause) { | |
| 129 | + this(msg, cause, null, -1); | |
| 130 | + } | |
| 131 | + | |
| 132 | + /** | |
| 133 | + * Creates a <code>CertPathValidatorException</code> with the specified | |
| 134 | + * detail message, cause, certification path, and index. | |
| 135 | + * | |
| 136 | + * @param msg the detail message (or <code>null</code> if none) | |
| 137 | + * @param cause the cause (or <code>null</code> if none) | |
| 138 | + * @param certPath the certification path that was in the process of | |
| 139 | + * being validated when the error was encountered | |
| 140 | + * @param index the index of the certificate in the certification path | |
| 141 | + * that caused the error (or -1 if not applicable). Note that | |
| 142 | + * the list of certificates in a <code>CertPath</code> is zero based. | |
| 143 | + * @throws IndexOutOfBoundsException if the index is out of range | |
| 144 | + * <code>(index < -1 || (certPath != null && index >= | |
| 145 | + * certPath.getCertificates().size())</code> | |
| 146 | + * @throws IllegalArgumentException if <code>certPath</code> is | |
| 147 | + * <code>null</code> and <code>index</code> is not -1 | |
| 148 | + */ | |
| 149 | + public CertPathValidatorException(String msg, Throwable cause, | |
| 150 | + CertPath certPath, int index) { | |
| 151 | + this(msg, cause, certPath, index, BasicReason.UNSPECIFIED); | |
| 152 | + } | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Creates a <code>CertPathValidatorException</code> with the specified | |
| 156 | + * detail message, cause, certification path, index, and reason. | |
| 157 | + * | |
| 158 | + * @param msg the detail message (or <code>null</code> if none) | |
| 159 | + * @param cause the cause (or <code>null</code> if none) | |
| 160 | + * @param certPath the certification path that was in the process of | |
| 161 | + * being validated when the error was encountered | |
| 162 | + * @param index the index of the certificate in the certification path | |
| 163 | + * that caused the error (or -1 if not applicable). Note that | |
| 164 | + * the list of certificates in a <code>CertPath</code> is zero based. | |
| 165 | + * @param reason the reason the validation failed | |
| 166 | + * @throws IndexOutOfBoundsException if the index is out of range | |
| 167 | + * <code>(index < -1 || (certPath != null && index >= | |
| 168 | + * certPath.getCertificates().size())</code> | |
| 169 | + * @throws IllegalArgumentException if <code>certPath</code> is | |
| 170 | + * <code>null</code> and <code>index</code> is not -1 | |
| 171 | + * @throws NullPointerException if <code>reason</code> is <code>null</code> | |
| 172 | + * | |
| 173 | + * @since 1.7 | |
| 174 | + */ | |
| 175 | + public CertPathValidatorException(String msg, Throwable cause, | |
| 176 | + CertPath certPath, int index, Reason reason) { | |
| 177 | + super(msg, cause); | |
| 178 | + if (certPath == null && index != -1) { | |
| 179 | + throw new IllegalArgumentException(); | |
| 180 | + } | |
| 181 | + if (index < -1 || | |
| 182 | + (certPath != null && index >= certPath.getCertificates().size())) { | |
| 183 | + throw new IndexOutOfBoundsException(); | |
| 184 | + } | |
| 185 | + if (reason == null) { | |
| 186 | + throw new NullPointerException("reason can't be null"); | |
| 187 | + } | |
| 188 | + this.certPath = certPath; | |
| 189 | + this.index = index; | |
| 190 | + this.reason = reason; | |
| 191 | + } | |
| 192 | + | |
| 193 | + /** | |
| 194 | + * Returns the certification path that was being validated when | |
| 195 | + * the exception was thrown. | |
| 196 | + * | |
| 197 | + * @return the <code>CertPath</code> that was being validated when | |
| 198 | + * the exception was thrown (or <code>null</code> if not specified) | |
| 199 | + */ | |
| 200 | + public CertPath getCertPath() { | |
| 201 | + return this.certPath; | |
| 202 | + } | |
| 203 | + | |
| 204 | + /** | |
| 205 | + * Returns the index of the certificate in the certification path | |
| 206 | + * that caused the exception to be thrown. Note that the list of | |
| 207 | + * certificates in a <code>CertPath</code> is zero based. If no | |
| 208 | + * index has been set, -1 is returned. | |
| 209 | + * | |
| 210 | + * @return the index that has been set, or -1 if none has been set | |
| 211 | + */ | |
| 212 | + public int getIndex() { | |
| 213 | + return this.index; | |
| 214 | + } | |
| 215 | + | |
| 216 | + /** | |
| 217 | + * Returns the reason that the validation failed. The reason is | |
| 218 | + * associated with the index of the certificate returned by | |
| 219 | + * {@link #getIndex}. | |
| 220 | + * | |
| 221 | + * @return the reason that the validation failed, or | |
| 222 | + * <code>BasicReason.UNSPECIFIED</code> if a reason has not been | |
| 223 | + * specified | |
| 224 | + * | |
| 225 | + * @since 1.7 | |
| 226 | + */ | |
| 227 | + public Reason getReason() { | |
| 228 | + return this.reason; | |
| 229 | + } | |
| 230 | + | |
| 231 | + private void readObject(ObjectInputStream stream) | |
| 232 | + throws ClassNotFoundException, IOException { | |
| 233 | + stream.defaultReadObject(); | |
| 234 | + if (reason == null) { | |
| 235 | + reason = BasicReason.UNSPECIFIED; | |
| 236 | + } | |
| 237 | + if (certPath == null && index != -1) { | |
| 238 | + throw new InvalidObjectException("certpath is null and index != -1"); | |
| 239 | + } | |
| 240 | + if (index < -1 || | |
| 241 | + (certPath != null && index >= certPath.getCertificates().size())) { | |
| 242 | + throw new InvalidObjectException("index out of range"); | |
| 243 | + } | |
| 244 | + } | |
| 245 | + | |
| 246 | + /** | |
| 247 | + * The reason the validation algorithm failed. | |
| 248 | + * | |
| 249 | + * @since 1.7 | |
| 250 | + */ | |
| 251 | + public static interface Reason extends java.io.Serializable { } | |
| 252 | + | |
| 253 | + | |
| 254 | + /** | |
| 255 | + * The BasicReason enumerates the potential reasons that a certification | |
| 256 | + * path of any type may be invalid. | |
| 257 | + * | |
| 258 | + * @since 1.7 | |
| 259 | + */ | |
| 260 | + public static enum BasicReason implements Reason { | |
| 261 | + /** | |
| 262 | + * Unspecified reason. | |
| 263 | + */ | |
| 264 | + UNSPECIFIED, | |
| 265 | + | |
| 266 | + /** | |
| 267 | + * The certificate is expired. | |
| 268 | + */ | |
| 269 | + EXPIRED, | |
| 270 | + | |
| 271 | + /** | |
| 272 | + * The certificate is not yet valid. | |
| 273 | + */ | |
| 274 | + NOT_YET_VALID, | |
| 275 | + | |
| 276 | + /** | |
| 277 | + * The certificate is revoked. | |
| 278 | + */ | |
| 279 | + REVOKED, | |
| 280 | + | |
| 281 | + /** | |
| 282 | + * The revocation status of the certificate could not be determined. | |
| 283 | + */ | |
| 284 | + UNDETERMINED_REVOCATION_STATUS, | |
| 285 | + | |
| 286 | + /** | |
| 287 | + * The signature is invalid. | |
| 288 | + */ | |
| 289 | + INVALID_SIGNATURE, | |
| 290 | + | |
| 291 | + /** | |
| 292 | + * The public key or the signature algorithm has been constrained. | |
| 293 | + */ | |
| 294 | + ALGORITHM_CONSTRAINED | |
| 295 | + } | |
| 296 | +} | |
Binary file not shown.
| @@ -0,0 +1,50 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A specification of the result of a certification path validator algorithm. | |
| 30 | + * <p> | |
| 31 | + * The purpose of this interface is to group (and provide type safety | |
| 32 | + * for) all certification path validator results. All results returned | |
| 33 | + * by the {@link CertPathValidator#validate CertPathValidator.validate} | |
| 34 | + * method must implement this interface. | |
| 35 | + * | |
| 36 | + * @see CertPathValidator | |
| 37 | + * | |
| 38 | + * @since 1.4 | |
| 39 | + * @author Yassir Elley | |
| 40 | + */ | |
| 41 | +public interface CertPathValidatorResult extends Cloneable { | |
| 42 | + | |
| 43 | + /** | |
| 44 | + * Makes a copy of this <code>CertPathValidatorResult</code>. Changes to the | |
| 45 | + * copy will not affect the original and vice versa. | |
| 46 | + * | |
| 47 | + * @return a copy of this <code>CertPathValidatorResult</code> | |
| 48 | + */ | |
| 49 | + Object clone(); | |
| 50 | +} | |
Binary file not shown.
| @@ -0,0 +1,85 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.InvalidAlgorithmParameterException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * | |
| 32 | + * The <i>Service Provider Interface</i> (<b>SPI</b>) | |
| 33 | + * for the {@link CertPathValidator CertPathValidator} class. All | |
| 34 | + * <code>CertPathValidator</code> implementations must include a class (the | |
| 35 | + * SPI class) that extends this class (<code>CertPathValidatorSpi</code>) | |
| 36 | + * and implements all of its methods. In general, instances of this class | |
| 37 | + * should only be accessed through the <code>CertPathValidator</code> class. | |
| 38 | + * For details, see the Java Cryptography Architecture. | |
| 39 | + * <p> | |
| 40 | + * <b>Concurrent Access</b> | |
| 41 | + * <p> | |
| 42 | + * Instances of this class need not be protected against concurrent | |
| 43 | + * access from multiple threads. Threads that need to access a single | |
| 44 | + * <code>CertPathValidatorSpi</code> instance concurrently should synchronize | |
| 45 | + * amongst themselves and provide the necessary locking before calling the | |
| 46 | + * wrapping <code>CertPathValidator</code> object. | |
| 47 | + * <p> | |
| 48 | + * However, implementations of <code>CertPathValidatorSpi</code> may still | |
| 49 | + * encounter concurrency issues, since multiple threads each | |
| 50 | + * manipulating a different <code>CertPathValidatorSpi</code> instance need not | |
| 51 | + * synchronize. | |
| 52 | + * | |
| 53 | + * @since 1.4 | |
| 54 | + * @author Yassir Elley | |
| 55 | + */ | |
| 56 | +public abstract class CertPathValidatorSpi { | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * The default constructor. | |
| 60 | + */ | |
| 61 | + public CertPathValidatorSpi() {} | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Validates the specified certification path using the specified | |
| 65 | + * algorithm parameter set. | |
| 66 | + * <p> | |
| 67 | + * The <code>CertPath</code> specified must be of a type that is | |
| 68 | + * supported by the validation algorithm, otherwise an | |
| 69 | + * <code>InvalidAlgorithmParameterException</code> will be thrown. For | |
| 70 | + * example, a <code>CertPathValidator</code> that implements the PKIX | |
| 71 | + * algorithm validates <code>CertPath</code> objects of type X.509. | |
| 72 | + * | |
| 73 | + * @param certPath the <code>CertPath</code> to be validated | |
| 74 | + * @param params the algorithm parameters | |
| 75 | + * @return the result of the validation algorithm | |
| 76 | + * @exception CertPathValidatorException if the <code>CertPath</code> | |
| 77 | + * does not validate | |
| 78 | + * @exception InvalidAlgorithmParameterException if the specified | |
| 79 | + * parameters or the type of the specified <code>CertPath</code> are | |
| 80 | + * inappropriate for this <code>CertPathValidator</code> | |
| 81 | + */ | |
| 82 | + public abstract CertPathValidatorResult | |
| 83 | + engineValidate(CertPath certPath, CertPathParameters params) | |
| 84 | + throws CertPathValidatorException, InvalidAlgorithmParameterException; | |
| 85 | +} | |
Binary file not shown.
| @@ -0,0 +1,67 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A selector that defines a set of criteria for selecting | |
| 30 | + * <code>Certificate</code>s. Classes that implement this interface | |
| 31 | + * are often used to specify which <code>Certificate</code>s should | |
| 32 | + * be retrieved from a <code>CertStore</code>. | |
| 33 | + * <p> | |
| 34 | + * <b>Concurrent Access</b> | |
| 35 | + * <p> | |
| 36 | + * Unless otherwise specified, the methods defined in this interface are not | |
| 37 | + * thread-safe. Multiple threads that need to access a single | |
| 38 | + * object concurrently should synchronize amongst themselves and | |
| 39 | + * provide the necessary locking. Multiple threads each manipulating | |
| 40 | + * separate objects need not synchronize. | |
| 41 | + * | |
| 42 | + * @see Certificate | |
| 43 | + * @see CertStore | |
| 44 | + * @see CertStore#getCertificates | |
| 45 | + * | |
| 46 | + * @author Steve Hanna | |
| 47 | + * @since 1.4 | |
| 48 | + */ | |
| 49 | +public interface CertSelector extends Cloneable { | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * Decides whether a <code>Certificate</code> should be selected. | |
| 53 | + * | |
| 54 | + * @param cert the <code>Certificate</code> to be checked | |
| 55 | + * @return <code>true</code> if the <code>Certificate</code> | |
| 56 | + * should be selected, <code>false</code> otherwise | |
| 57 | + */ | |
| 58 | + boolean match(Certificate cert); | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * Makes a copy of this <code>CertSelector</code>. Changes to the | |
| 62 | + * copy will not affect the original and vice versa. | |
| 63 | + * | |
| 64 | + * @return a copy of this <code>CertSelector</code> | |
| 65 | + */ | |
| 66 | + Object clone(); | |
| 67 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,424 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.AccessController; | |
| 29 | +import java.security.InvalidAlgorithmParameterException; | |
| 30 | +import java.security.NoSuchAlgorithmException; | |
| 31 | +import java.security.NoSuchProviderException; | |
| 32 | +import java.security.PrivilegedAction; | |
| 33 | +import java.security.Provider; | |
| 34 | +import java.security.Security; | |
| 35 | +import java.util.Collection; | |
| 36 | + | |
| 37 | +import sun.security.jca.*; | |
| 38 | +import sun.security.jca.GetInstance.Instance; | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * A class for retrieving <code>Certificate</code>s and <code>CRL</code>s | |
| 42 | + * from a repository. | |
| 43 | + * <p> | |
| 44 | + * This class uses a provider-based architecture. | |
| 45 | + * To create a <code>CertStore</code>, call one of the static | |
| 46 | + * <code>getInstance</code> methods, passing in the type of | |
| 47 | + * <code>CertStore</code> desired, any applicable initialization parameters | |
| 48 | + * and optionally the name of the provider desired. | |
| 49 | + * <p> | |
| 50 | + * Once the <code>CertStore</code> has been created, it can be used to | |
| 51 | + * retrieve <code>Certificate</code>s and <code>CRL</code>s by calling its | |
| 52 | + * {@link #getCertificates(CertSelector selector) getCertificates} and | |
| 53 | + * {@link #getCRLs(CRLSelector selector) getCRLs} methods. | |
| 54 | + * <p> | |
| 55 | + * Unlike a {@link java.security.KeyStore KeyStore}, which provides access | |
| 56 | + * to a cache of private keys and trusted certificates, a | |
| 57 | + * <code>CertStore</code> is designed to provide access to a potentially | |
| 58 | + * vast repository of untrusted certificates and CRLs. For example, an LDAP | |
| 59 | + * implementation of <code>CertStore</code> provides access to certificates | |
| 60 | + * and CRLs stored in one or more directories using the LDAP protocol and the | |
| 61 | + * schema as defined in the RFC service attribute. | |
| 62 | + * | |
| 63 | + * <p> Every implementation of the Java platform is required to support the | |
| 64 | + * following standard <code>CertStore</code> type: | |
| 65 | + * <ul> | |
| 66 | + * <li><tt>Collection</tt></li> | |
| 67 | + * </ul> | |
| 68 | + * This type is described in the <a href= | |
| 69 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertStore"> | |
| 70 | + * CertStore section</a> of the | |
| 71 | + * Java Cryptography Architecture Standard Algorithm Name Documentation. | |
| 72 | + * Consult the release documentation for your implementation to see if any | |
| 73 | + * other types are supported. | |
| 74 | + * | |
| 75 | + * <p> | |
| 76 | + * <b>Concurrent Access</b> | |
| 77 | + * <p> | |
| 78 | + * All public methods of <code>CertStore</code> objects must be thread-safe. | |
| 79 | + * That is, multiple threads may concurrently invoke these methods on a | |
| 80 | + * single <code>CertStore</code> object (or more than one) with no | |
| 81 | + * ill effects. This allows a <code>CertPathBuilder</code> to search for a | |
| 82 | + * CRL while simultaneously searching for further certificates, for instance. | |
| 83 | + * <p> | |
| 84 | + * The static methods of this class are also guaranteed to be thread-safe. | |
| 85 | + * Multiple threads may concurrently invoke the static methods defined in | |
| 86 | + * this class with no ill effects. | |
| 87 | + * | |
| 88 | + * @since 1.4 | |
| 89 | + * @author Sean Mullan, Steve Hanna | |
| 90 | + */ | |
| 91 | +public class CertStore { | |
| 92 | + /* | |
| 93 | + * Constant to lookup in the Security properties file to determine | |
| 94 | + * the default certstore type. In the Security properties file, the | |
| 95 | + * default certstore type is given as: | |
| 96 | + * <pre> | |
| 97 | + * certstore.type=LDAP | |
| 98 | + * </pre> | |
| 99 | + */ | |
| 100 | + private static final String CERTSTORE_TYPE = "certstore.type"; | |
| 101 | + private CertStoreSpi storeSpi; | |
| 102 | + private Provider provider; | |
| 103 | + private String type; | |
| 104 | + private CertStoreParameters params; | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * Creates a <code>CertStore</code> object of the given type, and | |
| 108 | + * encapsulates the given provider implementation (SPI object) in it. | |
| 109 | + * | |
| 110 | + * @param storeSpi the provider implementation | |
| 111 | + * @param provider the provider | |
| 112 | + * @param type the type | |
| 113 | + * @param params the initialization parameters (may be <code>null</code>) | |
| 114 | + */ | |
| 115 | + protected CertStore(CertStoreSpi storeSpi, Provider provider, | |
| 116 | + String type, CertStoreParameters params) { | |
| 117 | + this.storeSpi = storeSpi; | |
| 118 | + this.provider = provider; | |
| 119 | + this.type = type; | |
| 120 | + if (params != null) | |
| 121 | + this.params = (CertStoreParameters) params.clone(); | |
| 122 | + } | |
| 123 | + | |
| 124 | + /** | |
| 125 | + * Returns a <code>Collection</code> of <code>Certificate</code>s that | |
| 126 | + * match the specified selector. If no <code>Certificate</code>s | |
| 127 | + * match the selector, an empty <code>Collection</code> will be returned. | |
| 128 | + * <p> | |
| 129 | + * For some <code>CertStore</code> types, the resulting | |
| 130 | + * <code>Collection</code> may not contain <b>all</b> of the | |
| 131 | + * <code>Certificate</code>s that match the selector. For instance, | |
| 132 | + * an LDAP <code>CertStore</code> may not search all entries in the | |
| 133 | + * directory. Instead, it may just search entries that are likely to | |
| 134 | + * contain the <code>Certificate</code>s it is looking for. | |
| 135 | + * <p> | |
| 136 | + * Some <code>CertStore</code> implementations (especially LDAP | |
| 137 | + * <code>CertStore</code>s) may throw a <code>CertStoreException</code> | |
| 138 | + * unless a non-null <code>CertSelector</code> is provided that | |
| 139 | + * includes specific criteria that can be used to find the certificates. | |
| 140 | + * Issuer and/or subject names are especially useful criteria. | |
| 141 | + * | |
| 142 | + * @param selector A <code>CertSelector</code> used to select which | |
| 143 | + * <code>Certificate</code>s should be returned. Specify <code>null</code> | |
| 144 | + * to return all <code>Certificate</code>s (if supported). | |
| 145 | + * @return A <code>Collection</code> of <code>Certificate</code>s that | |
| 146 | + * match the specified selector (never <code>null</code>) | |
| 147 | + * @throws CertStoreException if an exception occurs | |
| 148 | + */ | |
| 149 | + public final Collection<? extends Certificate> getCertificates | |
| 150 | + (CertSelector selector) throws CertStoreException { | |
| 151 | + return storeSpi.engineGetCertificates(selector); | |
| 152 | + } | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Returns a <code>Collection</code> of <code>CRL</code>s that | |
| 156 | + * match the specified selector. If no <code>CRL</code>s | |
| 157 | + * match the selector, an empty <code>Collection</code> will be returned. | |
| 158 | + * <p> | |
| 159 | + * For some <code>CertStore</code> types, the resulting | |
| 160 | + * <code>Collection</code> may not contain <b>all</b> of the | |
| 161 | + * <code>CRL</code>s that match the selector. For instance, | |
| 162 | + * an LDAP <code>CertStore</code> may not search all entries in the | |
| 163 | + * directory. Instead, it may just search entries that are likely to | |
| 164 | + * contain the <code>CRL</code>s it is looking for. | |
| 165 | + * <p> | |
| 166 | + * Some <code>CertStore</code> implementations (especially LDAP | |
| 167 | + * <code>CertStore</code>s) may throw a <code>CertStoreException</code> | |
| 168 | + * unless a non-null <code>CRLSelector</code> is provided that | |
| 169 | + * includes specific criteria that can be used to find the CRLs. | |
| 170 | + * Issuer names and/or the certificate to be checked are especially useful. | |
| 171 | + * | |
| 172 | + * @param selector A <code>CRLSelector</code> used to select which | |
| 173 | + * <code>CRL</code>s should be returned. Specify <code>null</code> | |
| 174 | + * to return all <code>CRL</code>s (if supported). | |
| 175 | + * @return A <code>Collection</code> of <code>CRL</code>s that | |
| 176 | + * match the specified selector (never <code>null</code>) | |
| 177 | + * @throws CertStoreException if an exception occurs | |
| 178 | + */ | |
| 179 | + public final Collection<? extends CRL> getCRLs(CRLSelector selector) | |
| 180 | + throws CertStoreException { | |
| 181 | + return storeSpi.engineGetCRLs(selector); | |
| 182 | + } | |
| 183 | + | |
| 184 | + /** | |
| 185 | + * Returns a <code>CertStore</code> object that implements the specified | |
| 186 | + * <code>CertStore</code> type and is initialized with the specified | |
| 187 | + * parameters. | |
| 188 | + * | |
| 189 | + * <p> This method traverses the list of registered security Providers, | |
| 190 | + * starting with the most preferred Provider. | |
| 191 | + * A new CertStore object encapsulating the | |
| 192 | + * CertStoreSpi implementation from the first | |
| 193 | + * Provider that supports the specified type is returned. | |
| 194 | + * | |
| 195 | + * <p> Note that the list of registered providers may be retrieved via | |
| 196 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 197 | + * | |
| 198 | + * <p>The <code>CertStore</code> that is returned is initialized with the | |
| 199 | + * specified <code>CertStoreParameters</code>. The type of parameters | |
| 200 | + * needed may vary between different types of <code>CertStore</code>s. | |
| 201 | + * Note that the specified <code>CertStoreParameters</code> object is | |
| 202 | + * cloned. | |
| 203 | + * | |
| 204 | + * @param type the name of the requested <code>CertStore</code> type. | |
| 205 | + * See the CertStore section in the <a href= | |
| 206 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertStore"> | |
| 207 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 208 | + * for information about standard types. | |
| 209 | + * | |
| 210 | + * @param params the initialization parameters (may be <code>null</code>). | |
| 211 | + * | |
| 212 | + * @return a <code>CertStore</code> object that implements the specified | |
| 213 | + * <code>CertStore</code> type. | |
| 214 | + * | |
| 215 | + * @throws NoSuchAlgorithmException if no Provider supports a | |
| 216 | + * CertStoreSpi implementation for the specified type. | |
| 217 | + * | |
| 218 | + * @throws InvalidAlgorithmParameterException if the specified | |
| 219 | + * initialization parameters are inappropriate for this | |
| 220 | + * <code>CertStore</code>. | |
| 221 | + * | |
| 222 | + * @see java.security.Provider | |
| 223 | + */ | |
| 224 | + public static CertStore getInstance(String type, CertStoreParameters params) | |
| 225 | + throws InvalidAlgorithmParameterException, | |
| 226 | + NoSuchAlgorithmException { | |
| 227 | + try { | |
| 228 | + Instance instance = GetInstance.getInstance("CertStore", | |
| 229 | + CertStoreSpi.class, type, params); | |
| 230 | + return new CertStore((CertStoreSpi)instance.impl, | |
| 231 | + instance.provider, type, params); | |
| 232 | + } catch (NoSuchAlgorithmException e) { | |
| 233 | + return handleException(e); | |
| 234 | + } | |
| 235 | + } | |
| 236 | + | |
| 237 | + private static CertStore handleException(NoSuchAlgorithmException e) | |
| 238 | + throws NoSuchAlgorithmException, InvalidAlgorithmParameterException { | |
| 239 | + Throwable cause = e.getCause(); | |
| 240 | + if (cause instanceof InvalidAlgorithmParameterException) { | |
| 241 | + throw (InvalidAlgorithmParameterException)cause; | |
| 242 | + } | |
| 243 | + throw e; | |
| 244 | + } | |
| 245 | + | |
| 246 | + /** | |
| 247 | + * Returns a <code>CertStore</code> object that implements the specified | |
| 248 | + * <code>CertStore</code> type. | |
| 249 | + * | |
| 250 | + * <p> A new CertStore object encapsulating the | |
| 251 | + * CertStoreSpi implementation from the specified provider | |
| 252 | + * is returned. The specified provider must be registered | |
| 253 | + * in the security provider list. | |
| 254 | + * | |
| 255 | + * <p> Note that the list of registered providers may be retrieved via | |
| 256 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 257 | + * | |
| 258 | + * <p>The <code>CertStore</code> that is returned is initialized with the | |
| 259 | + * specified <code>CertStoreParameters</code>. The type of parameters | |
| 260 | + * needed may vary between different types of <code>CertStore</code>s. | |
| 261 | + * Note that the specified <code>CertStoreParameters</code> object is | |
| 262 | + * cloned. | |
| 263 | + * | |
| 264 | + * @param type the requested <code>CertStore</code> type. | |
| 265 | + * See the CertStore section in the <a href= | |
| 266 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertStore"> | |
| 267 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 268 | + * for information about standard types. | |
| 269 | + * | |
| 270 | + * @param params the initialization parameters (may be <code>null</code>). | |
| 271 | + * | |
| 272 | + * @param provider the name of the provider. | |
| 273 | + * | |
| 274 | + * @return a <code>CertStore</code> object that implements the | |
| 275 | + * specified type. | |
| 276 | + * | |
| 277 | + * @throws NoSuchAlgorithmException if a CertStoreSpi | |
| 278 | + * implementation for the specified type is not | |
| 279 | + * available from the specified provider. | |
| 280 | + * | |
| 281 | + * @throws InvalidAlgorithmParameterException if the specified | |
| 282 | + * initialization parameters are inappropriate for this | |
| 283 | + * <code>CertStore</code>. | |
| 284 | + * | |
| 285 | + * @throws NoSuchProviderException if the specified provider is not | |
| 286 | + * registered in the security provider list. | |
| 287 | + * | |
| 288 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 289 | + * null or empty. | |
| 290 | + * | |
| 291 | + * @see java.security.Provider | |
| 292 | + */ | |
| 293 | + public static CertStore getInstance(String type, | |
| 294 | + CertStoreParameters params, String provider) | |
| 295 | + throws InvalidAlgorithmParameterException, | |
| 296 | + NoSuchAlgorithmException, NoSuchProviderException { | |
| 297 | + try { | |
| 298 | + Instance instance = GetInstance.getInstance("CertStore", | |
| 299 | + CertStoreSpi.class, type, params, provider); | |
| 300 | + return new CertStore((CertStoreSpi)instance.impl, | |
| 301 | + instance.provider, type, params); | |
| 302 | + } catch (NoSuchAlgorithmException e) { | |
| 303 | + return handleException(e); | |
| 304 | + } | |
| 305 | + } | |
| 306 | + | |
| 307 | + /** | |
| 308 | + * Returns a <code>CertStore</code> object that implements the specified | |
| 309 | + * <code>CertStore</code> type. | |
| 310 | + * | |
| 311 | + * <p> A new CertStore object encapsulating the | |
| 312 | + * CertStoreSpi implementation from the specified Provider | |
| 313 | + * object is returned. Note that the specified Provider object | |
| 314 | + * does not have to be registered in the provider list. | |
| 315 | + * | |
| 316 | + * <p>The <code>CertStore</code> that is returned is initialized with the | |
| 317 | + * specified <code>CertStoreParameters</code>. The type of parameters | |
| 318 | + * needed may vary between different types of <code>CertStore</code>s. | |
| 319 | + * Note that the specified <code>CertStoreParameters</code> object is | |
| 320 | + * cloned. | |
| 321 | + * | |
| 322 | + * @param type the requested <code>CertStore</code> type. | |
| 323 | + * See the CertStore section in the <a href= | |
| 324 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertStore"> | |
| 325 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 326 | + * for information about standard types. | |
| 327 | + * | |
| 328 | + * @param params the initialization parameters (may be <code>null</code>). | |
| 329 | + * | |
| 330 | + * @param provider the provider. | |
| 331 | + * | |
| 332 | + * @return a <code>CertStore</code> object that implements the | |
| 333 | + * specified type. | |
| 334 | + * | |
| 335 | + * @exception NoSuchAlgorithmException if a CertStoreSpi | |
| 336 | + * implementation for the specified type is not available | |
| 337 | + * from the specified Provider object. | |
| 338 | + * | |
| 339 | + * @throws InvalidAlgorithmParameterException if the specified | |
| 340 | + * initialization parameters are inappropriate for this | |
| 341 | + * <code>CertStore</code> | |
| 342 | + * | |
| 343 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 344 | + * null. | |
| 345 | + * | |
| 346 | + * @see java.security.Provider | |
| 347 | + */ | |
| 348 | + public static CertStore getInstance(String type, CertStoreParameters params, | |
| 349 | + Provider provider) throws NoSuchAlgorithmException, | |
| 350 | + InvalidAlgorithmParameterException { | |
| 351 | + try { | |
| 352 | + Instance instance = GetInstance.getInstance("CertStore", | |
| 353 | + CertStoreSpi.class, type, params, provider); | |
| 354 | + return new CertStore((CertStoreSpi)instance.impl, | |
| 355 | + instance.provider, type, params); | |
| 356 | + } catch (NoSuchAlgorithmException e) { | |
| 357 | + return handleException(e); | |
| 358 | + } | |
| 359 | + } | |
| 360 | + | |
| 361 | + /** | |
| 362 | + * Returns the parameters used to initialize this <code>CertStore</code>. | |
| 363 | + * Note that the <code>CertStoreParameters</code> object is cloned before | |
| 364 | + * it is returned. | |
| 365 | + * | |
| 366 | + * @return the parameters used to initialize this <code>CertStore</code> | |
| 367 | + * (may be <code>null</code>) | |
| 368 | + */ | |
| 369 | + public final CertStoreParameters getCertStoreParameters() { | |
| 370 | + return (params == null ? null : (CertStoreParameters) params.clone()); | |
| 371 | + } | |
| 372 | + | |
| 373 | + /** | |
| 374 | + * Returns the type of this <code>CertStore</code>. | |
| 375 | + * | |
| 376 | + * @return the type of this <code>CertStore</code> | |
| 377 | + */ | |
| 378 | + public final String getType() { | |
| 379 | + return this.type; | |
| 380 | + } | |
| 381 | + | |
| 382 | + /** | |
| 383 | + * Returns the provider of this <code>CertStore</code>. | |
| 384 | + * | |
| 385 | + * @return the provider of this <code>CertStore</code> | |
| 386 | + */ | |
| 387 | + public final Provider getProvider() { | |
| 388 | + return this.provider; | |
| 389 | + } | |
| 390 | + | |
| 391 | + /** | |
| 392 | + * Returns the default <code>CertStore</code> type as specified in the | |
| 393 | + * Java security properties file, or the string "LDAP" if no | |
| 394 | + * such property exists. The Java security properties file is located in | |
| 395 | + * the file named <JAVA_HOME>/lib/security/java.security. | |
| 396 | + * <JAVA_HOME> refers to the value of the java.home system property, | |
| 397 | + * and specifies the directory where the JRE is installed. | |
| 398 | + * | |
| 399 | + * <p>The default <code>CertStore</code> type can be used by applications | |
| 400 | + * that do not want to use a hard-coded type when calling one of the | |
| 401 | + * <code>getInstance</code> methods, and want to provide a default | |
| 402 | + * <code>CertStore</code> type in case a user does not specify its own. | |
| 403 | + * | |
| 404 | + * <p>The default <code>CertStore</code> type can be changed by setting | |
| 405 | + * the value of the "certstore.type" security property (in the Java | |
| 406 | + * security properties file) to the desired type. | |
| 407 | + * | |
| 408 | + * @return the default <code>CertStore</code> type as specified in the | |
| 409 | + * Java security properties file, or the string "LDAP" | |
| 410 | + * if no such property exists. | |
| 411 | + */ | |
| 412 | + public final static String getDefaultType() { | |
| 413 | + String cstype; | |
| 414 | + cstype = AccessController.doPrivileged(new PrivilegedAction<String>() { | |
| 415 | + public String run() { | |
| 416 | + return Security.getProperty(CERTSTORE_TYPE); | |
| 417 | + } | |
| 418 | + }); | |
| 419 | + if (cstype == null) { | |
| 420 | + cstype = "LDAP"; | |
| 421 | + } | |
| 422 | + return cstype; | |
| 423 | + } | |
| 424 | +} | |
Binary file not shown.
| @@ -0,0 +1,103 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.GeneralSecurityException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * An exception indicating one of a variety of problems retrieving | |
| 32 | + * certificates and CRLs from a <code>CertStore</code>. | |
| 33 | + * <p> | |
| 34 | + * A <code>CertStoreException</code> provides support for wrapping | |
| 35 | + * exceptions. The {@link #getCause getCause} method returns the throwable, | |
| 36 | + * if any, that caused this exception to be thrown. | |
| 37 | + * <p> | |
| 38 | + * <b>Concurrent Access</b> | |
| 39 | + * <p> | |
| 40 | + * Unless otherwise specified, the methods defined in this class are not | |
| 41 | + * thread-safe. Multiple threads that need to access a single | |
| 42 | + * object concurrently should synchronize amongst themselves and | |
| 43 | + * provide the necessary locking. Multiple threads each manipulating | |
| 44 | + * separate objects need not synchronize. | |
| 45 | + * | |
| 46 | + * @see CertStore | |
| 47 | + * | |
| 48 | + * @since 1.4 | |
| 49 | + * @author Sean Mullan | |
| 50 | + */ | |
| 51 | +public class CertStoreException extends GeneralSecurityException { | |
| 52 | + | |
| 53 | + private static final long serialVersionUID = 2395296107471573245L; | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * Creates a <code>CertStoreException</code> with <code>null</code> as | |
| 57 | + * its detail message. | |
| 58 | + */ | |
| 59 | + public CertStoreException() { | |
| 60 | + super(); | |
| 61 | + } | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Creates a <code>CertStoreException</code> with the given detail | |
| 65 | + * message. A detail message is a <code>String</code> that describes this | |
| 66 | + * particular exception. | |
| 67 | + * | |
| 68 | + * @param msg the detail message | |
| 69 | + */ | |
| 70 | + public CertStoreException(String msg) { | |
| 71 | + super(msg); | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Creates a <code>CertStoreException</code> that wraps the specified | |
| 76 | + * throwable. This allows any exception to be converted into a | |
| 77 | + * <code>CertStoreException</code>, while retaining information about the | |
| 78 | + * cause, which may be useful for debugging. The detail message is | |
| 79 | + * set to (<code>cause==null ? null : cause.toString()</code>) (which | |
| 80 | + * typically contains the class and detail message of cause). | |
| 81 | + * | |
| 82 | + * @param cause the cause (which is saved for later retrieval by the | |
| 83 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 84 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 85 | + */ | |
| 86 | + public CertStoreException(Throwable cause) { | |
| 87 | + super(cause); | |
| 88 | + } | |
| 89 | + | |
| 90 | + /** | |
| 91 | + * Creates a <code>CertStoreException</code> with the specified detail | |
| 92 | + * message and cause. | |
| 93 | + * | |
| 94 | + * @param msg the detail message | |
| 95 | + * @param cause the cause (which is saved for later retrieval by the | |
| 96 | + * {@link #getCause getCause()} method). (A <code>null</code> value is | |
| 97 | + * permitted, and indicates that the cause is nonexistent or unknown.) | |
| 98 | + */ | |
| 99 | + public CertStoreException(String msg, Throwable cause) { | |
| 100 | + super(msg, cause); | |
| 101 | + } | |
| 102 | + | |
| 103 | +} | |
Binary file not shown.
| @@ -0,0 +1,80 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * A specification of <code>CertStore</code> parameters. | |
| 30 | + * <p> | |
| 31 | + * The purpose of this interface is to group (and provide type safety for) | |
| 32 | + * all <code>CertStore</code> parameter specifications. All | |
| 33 | + * <code>CertStore</code> parameter specifications must implement this | |
| 34 | + * interface. | |
| 35 | + * <p> | |
| 36 | + * Typically, a <code>CertStoreParameters</code> object is passed as a parameter | |
| 37 | + * to one of the {@link CertStore#getInstance CertStore.getInstance} methods. | |
| 38 | + * The <code>getInstance</code> method returns a <code>CertStore</code> that | |
| 39 | + * is used for retrieving <code>Certificate</code>s and <code>CRL</code>s. The | |
| 40 | + * <code>CertStore</code> that is returned is initialized with the specified | |
| 41 | + * parameters. The type of parameters needed may vary between different types | |
| 42 | + * of <code>CertStore</code>s. | |
| 43 | + * | |
| 44 | + * @see CertStore#getInstance | |
| 45 | + * | |
| 46 | + * @since 1.4 | |
| 47 | + * @author Steve Hanna | |
| 48 | + */ | |
| 49 | +public interface CertStoreParameters extends Cloneable { | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * Makes a copy of this <code>CertStoreParameters</code>. | |
| 53 | + * <p> | |
| 54 | + * The precise meaning of "copy" may depend on the class of | |
| 55 | + * the <code>CertStoreParameters</code> object. A typical implementation | |
| 56 | + * performs a "deep copy" of this object, but this is not an absolute | |
| 57 | + * requirement. Some implementations may perform a "shallow copy" of some | |
| 58 | + * or all of the fields of this object. | |
| 59 | + * <p> | |
| 60 | + * Note that the <code>CertStore.getInstance</code> methods make a copy | |
| 61 | + * of the specified <code>CertStoreParameters</code>. A deep copy | |
| 62 | + * implementation of <code>clone</code> is safer and more robust, as it | |
| 63 | + * prevents the caller from corrupting a shared <code>CertStore</code> by | |
| 64 | + * subsequently modifying the contents of its initialization parameters. | |
| 65 | + * However, a shallow copy implementation of <code>clone</code> is more | |
| 66 | + * appropriate for applications that need to hold a reference to a | |
| 67 | + * parameter contained in the <code>CertStoreParameters</code>. For example, | |
| 68 | + * a shallow copy clone allows an application to release the resources of | |
| 69 | + * a particular <code>CertStore</code> initialization parameter immediately, | |
| 70 | + * rather than waiting for the garbage collection mechanism. This should | |
| 71 | + * be done with the utmost care, since the <code>CertStore</code> may still | |
| 72 | + * be in use by other threads. | |
| 73 | + * <p> | |
| 74 | + * Each subclass should state the precise behavior of this method so | |
| 75 | + * that users and developers know what to expect. | |
| 76 | + * | |
| 77 | + * @return a copy of this <code>CertStoreParameters</code> | |
| 78 | + */ | |
| 79 | + Object clone(); | |
| 80 | +} | |
Binary file not shown.
| @@ -0,0 +1,125 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.InvalidAlgorithmParameterException; | |
| 29 | +import java.util.Collection; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * The <i>Service Provider Interface</i> (<b>SPI</b>) | |
| 33 | + * for the {@link CertStore CertStore} class. All <code>CertStore</code> | |
| 34 | + * implementations must include a class (the SPI class) that extends | |
| 35 | + * this class (<code>CertStoreSpi</code>), provides a constructor with | |
| 36 | + * a single argument of type <code>CertStoreParameters</code>, and implements | |
| 37 | + * all of its methods. In general, instances of this class should only be | |
| 38 | + * accessed through the <code>CertStore</code> class. | |
| 39 | + * For details, see the Java Cryptography Architecture. | |
| 40 | + * <p> | |
| 41 | + * <b>Concurrent Access</b> | |
| 42 | + * <p> | |
| 43 | + * The public methods of all <code>CertStoreSpi</code> objects must be | |
| 44 | + * thread-safe. That is, multiple threads may concurrently invoke these | |
| 45 | + * methods on a single <code>CertStoreSpi</code> object (or more than one) | |
| 46 | + * with no ill effects. This allows a <code>CertPathBuilder</code> to search | |
| 47 | + * for a CRL while simultaneously searching for further certificates, for | |
| 48 | + * instance. | |
| 49 | + * <p> | |
| 50 | + * Simple <code>CertStoreSpi</code> implementations will probably ensure | |
| 51 | + * thread safety by adding a <code>synchronized</code> keyword to their | |
| 52 | + * <code>engineGetCertificates</code> and <code>engineGetCRLs</code> methods. | |
| 53 | + * More sophisticated ones may allow truly concurrent access. | |
| 54 | + * | |
| 55 | + * @since 1.4 | |
| 56 | + * @author Steve Hanna | |
| 57 | + */ | |
| 58 | +public abstract class CertStoreSpi { | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * The sole constructor. | |
| 62 | + * | |
| 63 | + * @param params the initialization parameters (may be <code>null</code>) | |
| 64 | + * @throws InvalidAlgorithmParameterException if the initialization | |
| 65 | + * parameters are inappropriate for this <code>CertStoreSpi</code> | |
| 66 | + */ | |
| 67 | + public CertStoreSpi(CertStoreParameters params) | |
| 68 | + throws InvalidAlgorithmParameterException { } | |
| 69 | + | |
| 70 | + /** | |
| 71 | + * Returns a <code>Collection</code> of <code>Certificate</code>s that | |
| 72 | + * match the specified selector. If no <code>Certificate</code>s | |
| 73 | + * match the selector, an empty <code>Collection</code> will be returned. | |
| 74 | + * <p> | |
| 75 | + * For some <code>CertStore</code> types, the resulting | |
| 76 | + * <code>Collection</code> may not contain <b>all</b> of the | |
| 77 | + * <code>Certificate</code>s that match the selector. For instance, | |
| 78 | + * an LDAP <code>CertStore</code> may not search all entries in the | |
| 79 | + * directory. Instead, it may just search entries that are likely to | |
| 80 | + * contain the <code>Certificate</code>s it is looking for. | |
| 81 | + * <p> | |
| 82 | + * Some <code>CertStore</code> implementations (especially LDAP | |
| 83 | + * <code>CertStore</code>s) may throw a <code>CertStoreException</code> | |
| 84 | + * unless a non-null <code>CertSelector</code> is provided that includes | |
| 85 | + * specific criteria that can be used to find the certificates. Issuer | |
| 86 | + * and/or subject names are especially useful criteria. | |
| 87 | + * | |
| 88 | + * @param selector A <code>CertSelector</code> used to select which | |
| 89 | + * <code>Certificate</code>s should be returned. Specify <code>null</code> | |
| 90 | + * to return all <code>Certificate</code>s (if supported). | |
| 91 | + * @return A <code>Collection</code> of <code>Certificate</code>s that | |
| 92 | + * match the specified selector (never <code>null</code>) | |
| 93 | + * @throws CertStoreException if an exception occurs | |
| 94 | + */ | |
| 95 | + public abstract Collection<? extends Certificate> engineGetCertificates | |
| 96 | + (CertSelector selector) throws CertStoreException; | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Returns a <code>Collection</code> of <code>CRL</code>s that | |
| 100 | + * match the specified selector. If no <code>CRL</code>s | |
| 101 | + * match the selector, an empty <code>Collection</code> will be returned. | |
| 102 | + * <p> | |
| 103 | + * For some <code>CertStore</code> types, the resulting | |
| 104 | + * <code>Collection</code> may not contain <b>all</b> of the | |
| 105 | + * <code>CRL</code>s that match the selector. For instance, | |
| 106 | + * an LDAP <code>CertStore</code> may not search all entries in the | |
| 107 | + * directory. Instead, it may just search entries that are likely to | |
| 108 | + * contain the <code>CRL</code>s it is looking for. | |
| 109 | + * <p> | |
| 110 | + * Some <code>CertStore</code> implementations (especially LDAP | |
| 111 | + * <code>CertStore</code>s) may throw a <code>CertStoreException</code> | |
| 112 | + * unless a non-null <code>CRLSelector</code> is provided that includes | |
| 113 | + * specific criteria that can be used to find the CRLs. Issuer names | |
| 114 | + * and/or the certificate to be checked are especially useful. | |
| 115 | + * | |
| 116 | + * @param selector A <code>CRLSelector</code> used to select which | |
| 117 | + * <code>CRL</code>s should be returned. Specify <code>null</code> | |
| 118 | + * to return all <code>CRL</code>s (if supported). | |
| 119 | + * @return A <code>Collection</code> of <code>CRL</code>s that | |
| 120 | + * match the specified selector (never <code>null</code>) | |
| 121 | + * @throws CertStoreException if an exception occurs | |
| 122 | + */ | |
| 123 | + public abstract Collection<? extends CRL> engineGetCRLs | |
| 124 | + (CRLSelector selector) throws CertStoreException; | |
| 125 | +} | |
Binary file not shown.
Binary file not shown.
| @@ -0,0 +1,274 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.util.Arrays; | |
| 29 | + | |
| 30 | +import java.security.PublicKey; | |
| 31 | +import java.security.NoSuchAlgorithmException; | |
| 32 | +import java.security.NoSuchProviderException; | |
| 33 | +import java.security.InvalidKeyException; | |
| 34 | +import java.security.SignatureException; | |
| 35 | + | |
| 36 | +import sun.security.x509.X509CertImpl; | |
| 37 | + | |
| 38 | +/** | |
| 39 | + * <p>Abstract class for managing a variety of identity certificates. | |
| 40 | + * An identity certificate is a binding of a principal to a public key which | |
| 41 | + * is vouched for by another principal. (A principal represents | |
| 42 | + * an entity such as an individual user, a group, or a corporation.) | |
| 43 | + *<p> | |
| 44 | + * This class is an abstraction for certificates that have different | |
| 45 | + * formats but important common uses. For example, different types of | |
| 46 | + * certificates, such as X.509 and PGP, share general certificate | |
| 47 | + * functionality (like encoding and verifying) and | |
| 48 | + * some types of information (like a public key). | |
| 49 | + * <p> | |
| 50 | + * X.509, PGP, and SDSI certificates can all be implemented by | |
| 51 | + * subclassing the Certificate class, even though they contain different | |
| 52 | + * sets of information, and they store and retrieve the information in | |
| 53 | + * different ways. | |
| 54 | + * | |
| 55 | + * @see X509Certificate | |
| 56 | + * @see CertificateFactory | |
| 57 | + * | |
| 58 | + * @author Hemma Prafullchandra | |
| 59 | + */ | |
| 60 | + | |
| 61 | +public abstract class Certificate implements java.io.Serializable { | |
| 62 | + | |
| 63 | + private static final long serialVersionUID = -3585440601605666277L; | |
| 64 | + | |
| 65 | + // the certificate type | |
| 66 | + private final String type; | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Creates a certificate of the specified type. | |
| 70 | + * | |
| 71 | + * @param type the standard name of the certificate type. | |
| 72 | + * See the CertificateFactory section in the <a href= | |
| 73 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertificateFactory"> | |
| 74 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 75 | + * for information about standard certificate types. | |
| 76 | + */ | |
| 77 | + protected Certificate(String type) { | |
| 78 | + this.type = type; | |
| 79 | + } | |
| 80 | + | |
| 81 | + /** | |
| 82 | + * Returns the type of this certificate. | |
| 83 | + * | |
| 84 | + * @return the type of this certificate. | |
| 85 | + */ | |
| 86 | + public final String getType() { | |
| 87 | + return this.type; | |
| 88 | + } | |
| 89 | + | |
| 90 | + /** | |
| 91 | + * Compares this certificate for equality with the specified | |
| 92 | + * object. If the <code>other</code> object is an | |
| 93 | + * <code>instanceof</code> <code>Certificate</code>, then | |
| 94 | + * its encoded form is retrieved and compared with the | |
| 95 | + * encoded form of this certificate. | |
| 96 | + * | |
| 97 | + * @param other the object to test for equality with this certificate. | |
| 98 | + * @return true iff the encoded forms of the two certificates | |
| 99 | + * match, false otherwise. | |
| 100 | + */ | |
| 101 | + public boolean equals(Object other) { | |
| 102 | + if (this == other) { | |
| 103 | + return true; | |
| 104 | + } | |
| 105 | + if (!(other instanceof Certificate)) { | |
| 106 | + return false; | |
| 107 | + } | |
| 108 | + try { | |
| 109 | + byte[] thisCert = X509CertImpl.getEncodedInternal(this); | |
| 110 | + byte[] otherCert = X509CertImpl.getEncodedInternal((Certificate)other); | |
| 111 | + | |
| 112 | + return Arrays.equals(thisCert, otherCert); | |
| 113 | + } catch (CertificateException e) { | |
| 114 | + return false; | |
| 115 | + } | |
| 116 | + } | |
| 117 | + | |
| 118 | + /** | |
| 119 | + * Returns a hashcode value for this certificate from its | |
| 120 | + * encoded form. | |
| 121 | + * | |
| 122 | + * @return the hashcode value. | |
| 123 | + */ | |
| 124 | + public int hashCode() { | |
| 125 | + int retval = 0; | |
| 126 | + try { | |
| 127 | + byte[] certData = X509CertImpl.getEncodedInternal(this); | |
| 128 | + for (int i = 1; i < certData.length; i++) { | |
| 129 | + retval += certData[i] * i; | |
| 130 | + } | |
| 131 | + return retval; | |
| 132 | + } catch (CertificateException e) { | |
| 133 | + return retval; | |
| 134 | + } | |
| 135 | + } | |
| 136 | + | |
| 137 | + /** | |
| 138 | + * Returns the encoded form of this certificate. It is | |
| 139 | + * assumed that each certificate type would have only a single | |
| 140 | + * form of encoding; for example, X.509 certificates would | |
| 141 | + * be encoded as ASN.1 DER. | |
| 142 | + * | |
| 143 | + * @return the encoded form of this certificate | |
| 144 | + * | |
| 145 | + * @exception CertificateEncodingException if an encoding error occurs. | |
| 146 | + */ | |
| 147 | + public abstract byte[] getEncoded() | |
| 148 | + throws CertificateEncodingException; | |
| 149 | + | |
| 150 | + /** | |
| 151 | + * Verifies that this certificate was signed using the | |
| 152 | + * private key that corresponds to the specified public key. | |
| 153 | + * | |
| 154 | + * @param key the PublicKey used to carry out the verification. | |
| 155 | + * | |
| 156 | + * @exception NoSuchAlgorithmException on unsupported signature | |
| 157 | + * algorithms. | |
| 158 | + * @exception InvalidKeyException on incorrect key. | |
| 159 | + * @exception NoSuchProviderException if there's no default provider. | |
| 160 | + * @exception SignatureException on signature errors. | |
| 161 | + * @exception CertificateException on encoding errors. | |
| 162 | + */ | |
| 163 | + public abstract void verify(PublicKey key) | |
| 164 | + throws CertificateException, NoSuchAlgorithmException, | |
| 165 | + InvalidKeyException, NoSuchProviderException, | |
| 166 | + SignatureException; | |
| 167 | + | |
| 168 | + /** | |
| 169 | + * Verifies that this certificate was signed using the | |
| 170 | + * private key that corresponds to the specified public key. | |
| 171 | + * This method uses the signature verification engine | |
| 172 | + * supplied by the specified provider. | |
| 173 | + * | |
| 174 | + * @param key the PublicKey used to carry out the verification. | |
| 175 | + * @param sigProvider the name of the signature provider. | |
| 176 | + * | |
| 177 | + * @exception NoSuchAlgorithmException on unsupported signature | |
| 178 | + * algorithms. | |
| 179 | + * @exception InvalidKeyException on incorrect key. | |
| 180 | + * @exception NoSuchProviderException on incorrect provider. | |
| 181 | + * @exception SignatureException on signature errors. | |
| 182 | + * @exception CertificateException on encoding errors. | |
| 183 | + */ | |
| 184 | + public abstract void verify(PublicKey key, String sigProvider) | |
| 185 | + throws CertificateException, NoSuchAlgorithmException, | |
| 186 | + InvalidKeyException, NoSuchProviderException, | |
| 187 | + SignatureException; | |
| 188 | + | |
| 189 | + /** | |
| 190 | + * Returns a string representation of this certificate. | |
| 191 | + * | |
| 192 | + * @return a string representation of this certificate. | |
| 193 | + */ | |
| 194 | + public abstract String toString(); | |
| 195 | + | |
| 196 | + /** | |
| 197 | + * Gets the public key from this certificate. | |
| 198 | + * | |
| 199 | + * @return the public key. | |
| 200 | + */ | |
| 201 | + public abstract PublicKey getPublicKey(); | |
| 202 | + | |
| 203 | + /** | |
| 204 | + * Alternate Certificate class for serialization. | |
| 205 | + * @since 1.3 | |
| 206 | + */ | |
| 207 | + protected static class CertificateRep implements java.io.Serializable { | |
| 208 | + | |
| 209 | + private static final long serialVersionUID = -8563758940495660020L; | |
| 210 | + | |
| 211 | + private String type; | |
| 212 | + private byte[] data; | |
| 213 | + | |
| 214 | + /** | |
| 215 | + * Construct the alternate Certificate class with the Certificate | |
| 216 | + * type and Certificate encoding bytes. | |
| 217 | + * | |
| 218 | + * <p> | |
| 219 | + * | |
| 220 | + * @param type the standard name of the Certificate type. <p> | |
| 221 | + * | |
| 222 | + * @param data the Certificate data. | |
| 223 | + */ | |
| 224 | + protected CertificateRep(String type, byte[] data) { | |
| 225 | + this.type = type; | |
| 226 | + this.data = data; | |
| 227 | + } | |
| 228 | + | |
| 229 | + /** | |
| 230 | + * Resolve the Certificate Object. | |
| 231 | + * | |
| 232 | + * <p> | |
| 233 | + * | |
| 234 | + * @return the resolved Certificate Object | |
| 235 | + * | |
| 236 | + * @throws java.io.ObjectStreamException if the Certificate | |
| 237 | + * could not be resolved | |
| 238 | + */ | |
| 239 | + protected Object readResolve() throws java.io.ObjectStreamException { | |
| 240 | + try { | |
| 241 | + CertificateFactory cf = CertificateFactory.getInstance(type); | |
| 242 | + return cf.generateCertificate | |
| 243 | + (new java.io.ByteArrayInputStream(data)); | |
| 244 | + } catch (CertificateException e) { | |
| 245 | + throw new java.io.NotSerializableException | |
| 246 | + ("java.security.cert.Certificate: " + | |
| 247 | + type + | |
| 248 | + ": " + | |
| 249 | + e.getMessage()); | |
| 250 | + } | |
| 251 | + } | |
| 252 | + } | |
| 253 | + | |
| 254 | + /** | |
| 255 | + * Replace the Certificate to be serialized. | |
| 256 | + * | |
| 257 | + * @return the alternate Certificate object to be serialized | |
| 258 | + * | |
| 259 | + * @throws java.io.ObjectStreamException if a new object representing | |
| 260 | + * this Certificate could not be created | |
| 261 | + * @since 1.3 | |
| 262 | + */ | |
| 263 | + protected Object writeReplace() throws java.io.ObjectStreamException { | |
| 264 | + try { | |
| 265 | + return new CertificateRep(type, getEncoded()); | |
| 266 | + } catch (CertificateException e) { | |
| 267 | + throw new java.io.NotSerializableException | |
| 268 | + ("java.security.cert.Certificate: " + | |
| 269 | + type + | |
| 270 | + ": " + | |
| 271 | + e.getMessage()); | |
| 272 | + } | |
| 273 | + } | |
| 274 | +} | |
Binary file not shown.
| @@ -0,0 +1,88 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Certificate Encoding Exception. This is thrown whenever an error | |
| 30 | + * occurs while attempting to encode a certificate. | |
| 31 | + * | |
| 32 | + * @author Hemma Prafullchandra | |
| 33 | + */ | |
| 34 | +public class CertificateEncodingException extends CertificateException { | |
| 35 | + | |
| 36 | + private static final long serialVersionUID = 6219492851589449162L; | |
| 37 | + | |
| 38 | + /** | |
| 39 | + * Constructs a CertificateEncodingException with no detail message. A | |
| 40 | + * detail message is a String that describes this particular | |
| 41 | + * exception. | |
| 42 | + */ | |
| 43 | + public CertificateEncodingException() { | |
| 44 | + super(); | |
| 45 | + } | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Constructs a CertificateEncodingException with the specified detail | |
| 49 | + * message. A detail message is a String that describes this | |
| 50 | + * particular exception. | |
| 51 | + * | |
| 52 | + * @param message the detail message. | |
| 53 | + */ | |
| 54 | + public CertificateEncodingException(String message) { | |
| 55 | + super(message); | |
| 56 | + } | |
| 57 | + | |
| 58 | + /** | |
| 59 | + * Creates a <code>CertificateEncodingException</code> with the specified | |
| 60 | + * detail message and cause. | |
| 61 | + * | |
| 62 | + * @param message the detail message (which is saved for later retrieval | |
| 63 | + * by the {@link #getMessage()} method). | |
| 64 | + * @param cause the cause (which is saved for later retrieval by the | |
| 65 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 66 | + * and indicates that the cause is nonexistent or unknown.) | |
| 67 | + * @since 1.5 | |
| 68 | + */ | |
| 69 | + public CertificateEncodingException(String message, Throwable cause) { | |
| 70 | + super(message, cause); | |
| 71 | + } | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Creates a <code>CertificateEncodingException</code> | |
| 75 | + * with the specified cause and a detail message of | |
| 76 | + * <tt>(cause==null ? null : cause.toString())</tt> | |
| 77 | + * (which typically contains the class and detail message of | |
| 78 | + * <tt>cause</tt>). | |
| 79 | + * | |
| 80 | + * @param cause the cause (which is saved for later retrieval by the | |
| 81 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 82 | + * and indicates that the cause is nonexistent or unknown.) | |
| 83 | + * @since 1.5 | |
| 84 | + */ | |
| 85 | + public CertificateEncodingException(Throwable cause) { | |
| 86 | + super(cause); | |
| 87 | + } | |
| 88 | +} | |
Binary file not shown.
| @@ -0,0 +1,88 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.GeneralSecurityException; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * This exception indicates one of a variety of certificate problems. | |
| 32 | + * | |
| 33 | + * @author Hemma Prafullchandra | |
| 34 | + * @see Certificate | |
| 35 | + */ | |
| 36 | +public class CertificateException extends GeneralSecurityException { | |
| 37 | + | |
| 38 | + private static final long serialVersionUID = 3192535253797119798L; | |
| 39 | + | |
| 40 | + /** | |
| 41 | + * Constructs a certificate exception with no detail message. A detail | |
| 42 | + * message is a String that describes this particular exception. | |
| 43 | + */ | |
| 44 | + public CertificateException() { | |
| 45 | + super(); | |
| 46 | + } | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * Constructs a certificate exception with the given detail | |
| 50 | + * message. A detail message is a String that describes this | |
| 51 | + * particular exception. | |
| 52 | + * | |
| 53 | + * @param msg the detail message. | |
| 54 | + */ | |
| 55 | + public CertificateException(String msg) { | |
| 56 | + super(msg); | |
| 57 | + } | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Creates a <code>CertificateException</code> with the specified | |
| 61 | + * detail message and cause. | |
| 62 | + * | |
| 63 | + * @param message the detail message (which is saved for later retrieval | |
| 64 | + * by the {@link #getMessage()} method). | |
| 65 | + * @param cause the cause (which is saved for later retrieval by the | |
| 66 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 67 | + * and indicates that the cause is nonexistent or unknown.) | |
| 68 | + * @since 1.5 | |
| 69 | + */ | |
| 70 | + public CertificateException(String message, Throwable cause) { | |
| 71 | + super(message, cause); | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Creates a <code>CertificateException</code> with the specified cause | |
| 76 | + * and a detail message of <tt>(cause==null ? null : cause.toString())</tt> | |
| 77 | + * (which typically contains the class and detail message of | |
| 78 | + * <tt>cause</tt>). | |
| 79 | + * | |
| 80 | + * @param cause the cause (which is saved for later retrieval by the | |
| 81 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 82 | + * and indicates that the cause is nonexistent or unknown.) | |
| 83 | + * @since 1.5 | |
| 84 | + */ | |
| 85 | + public CertificateException(Throwable cause) { | |
| 86 | + super(cause); | |
| 87 | + } | |
| 88 | +} | |
Binary file not shown.
| @@ -0,0 +1,59 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Certificate Expired Exception. This is thrown whenever the current | |
| 30 | + * <code>Date</code> or the specified <code>Date</code> is after the | |
| 31 | + * <code>notAfter</code> date/time specified in the validity period | |
| 32 | + * of the certificate. | |
| 33 | + * | |
| 34 | + * @author Hemma Prafullchandra | |
| 35 | + */ | |
| 36 | +public class CertificateExpiredException extends CertificateException { | |
| 37 | + | |
| 38 | + private static final long serialVersionUID = 9071001339691533771L; | |
| 39 | + | |
| 40 | + /** | |
| 41 | + * Constructs a CertificateExpiredException with no detail message. A | |
| 42 | + * detail message is a String that describes this particular | |
| 43 | + * exception. | |
| 44 | + */ | |
| 45 | + public CertificateExpiredException() { | |
| 46 | + super(); | |
| 47 | + } | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Constructs a CertificateExpiredException with the specified detail | |
| 51 | + * message. A detail message is a String that describes this | |
| 52 | + * particular exception. | |
| 53 | + * | |
| 54 | + * @param message the detail message. | |
| 55 | + */ | |
| 56 | + public CertificateExpiredException(String message) { | |
| 57 | + super(message); | |
| 58 | + } | |
| 59 | +} | |
Binary file not shown.
| @@ -0,0 +1,537 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.InputStream; | |
| 29 | +import java.util.Collection; | |
| 30 | +import java.util.Iterator; | |
| 31 | +import java.util.List; | |
| 32 | +import java.security.Provider; | |
| 33 | +import java.security.Security; | |
| 34 | +import java.security.AccessController; | |
| 35 | +import java.security.PrivilegedAction; | |
| 36 | +import java.security.NoSuchAlgorithmException; | |
| 37 | +import java.security.NoSuchProviderException; | |
| 38 | + | |
| 39 | +import sun.security.jca.*; | |
| 40 | +import sun.security.jca.GetInstance.Instance; | |
| 41 | + | |
| 42 | +/** | |
| 43 | + * This class defines the functionality of a certificate factory, which is | |
| 44 | + * used to generate certificate, certification path (<code>CertPath</code>) | |
| 45 | + * and certificate revocation list (CRL) objects from their encodings. | |
| 46 | + * | |
| 47 | + * <p>For encodings consisting of multiple certificates, use | |
| 48 | + * <code>generateCertificates</code> when you want to | |
| 49 | + * parse a collection of possibly unrelated certificates. Otherwise, | |
| 50 | + * use <code>generateCertPath</code> when you want to generate | |
| 51 | + * a <code>CertPath</code> (a certificate chain) and subsequently | |
| 52 | + * validate it with a <code>CertPathValidator</code>. | |
| 53 | + * | |
| 54 | + * <p>A certificate factory for X.509 must return certificates that are an | |
| 55 | + * instance of <code>java.security.cert.X509Certificate</code>, and CRLs | |
| 56 | + * that are an instance of <code>java.security.cert.X509CRL</code>. | |
| 57 | + * | |
| 58 | + * <p>The following example reads a file with Base64 encoded certificates, | |
| 59 | + * which are each bounded at the beginning by -----BEGIN CERTIFICATE-----, and | |
| 60 | + * bounded at the end by -----END CERTIFICATE-----. We convert the | |
| 61 | + * <code>FileInputStream</code> (which does not support <code>mark</code> | |
| 62 | + * and <code>reset</code>) to a <code>BufferedInputStream</code> (which | |
| 63 | + * supports those methods), so that each call to | |
| 64 | + * <code>generateCertificate</code> consumes only one certificate, and the | |
| 65 | + * read position of the input stream is positioned to the next certificate in | |
| 66 | + * the file:<p> | |
| 67 | + * | |
| 68 | + * <pre> | |
| 69 | + * FileInputStream fis = new FileInputStream(filename); | |
| 70 | + * BufferedInputStream bis = new BufferedInputStream(fis); | |
| 71 | + * | |
| 72 | + * CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |
| 73 | + * | |
| 74 | + * while (bis.available() > 0) { | |
| 75 | + * Certificate cert = cf.generateCertificate(bis); | |
| 76 | + * System.out.println(cert.toString()); | |
| 77 | + * } | |
| 78 | + * </pre> | |
| 79 | + * | |
| 80 | + * <p>The following example parses a PKCS#7-formatted certificate reply stored | |
| 81 | + * in a file and extracts all the certificates from it:<p> | |
| 82 | + * | |
| 83 | + * <pre> | |
| 84 | + * FileInputStream fis = new FileInputStream(filename); | |
| 85 | + * CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |
| 86 | + * Collection c = cf.generateCertificates(fis); | |
| 87 | + * Iterator i = c.iterator(); | |
| 88 | + * while (i.hasNext()) { | |
| 89 | + * Certificate cert = (Certificate)i.next(); | |
| 90 | + * System.out.println(cert); | |
| 91 | + * } | |
| 92 | + * </pre> | |
| 93 | + * | |
| 94 | + * <p> Every implementation of the Java platform is required to support the | |
| 95 | + * following standard <code>CertificateFactory</code> type: | |
| 96 | + * <ul> | |
| 97 | + * <li><tt>X.509</tt></li> | |
| 98 | + * </ul> | |
| 99 | + * and the following standard <code>CertPath</code> encodings: | |
| 100 | + * <ul> | |
| 101 | + * <li><tt>PKCS7</tt></li> | |
| 102 | + * <li><tt>PkiPath</tt></li> | |
| 103 | + * </ul> | |
| 104 | + * The type and encodings are described in the <a href= | |
| 105 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertificateFactory"> | |
| 106 | + * CertificateFactory section</a> and the <a href= | |
| 107 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathEncodings"> | |
| 108 | + * CertPath Encodings section</a> of the | |
| 109 | + * Java Cryptography Architecture Standard Algorithm Name Documentation. | |
| 110 | + * Consult the release documentation for your implementation to see if any | |
| 111 | + * other types or encodings are supported. | |
| 112 | + * | |
| 113 | + * @author Hemma Prafullchandra | |
| 114 | + * @author Jan Luehe | |
| 115 | + * @author Sean Mullan | |
| 116 | + * | |
| 117 | + * @see Certificate | |
| 118 | + * @see X509Certificate | |
| 119 | + * @see CertPath | |
| 120 | + * @see CRL | |
| 121 | + * @see X509CRL | |
| 122 | + * | |
| 123 | + * @since 1.2 | |
| 124 | + */ | |
| 125 | + | |
| 126 | +public class CertificateFactory { | |
| 127 | + | |
| 128 | + // The certificate type | |
| 129 | + private String type; | |
| 130 | + | |
| 131 | + // The provider | |
| 132 | + private Provider provider; | |
| 133 | + | |
| 134 | + // The provider implementation | |
| 135 | + private CertificateFactorySpi certFacSpi; | |
| 136 | + | |
| 137 | + /** | |
| 138 | + * Creates a CertificateFactory object of the given type, and encapsulates | |
| 139 | + * the given provider implementation (SPI object) in it. | |
| 140 | + * | |
| 141 | + * @param certFacSpi the provider implementation. | |
| 142 | + * @param provider the provider. | |
| 143 | + * @param type the certificate type. | |
| 144 | + */ | |
| 145 | + protected CertificateFactory(CertificateFactorySpi certFacSpi, | |
| 146 | + Provider provider, String type) | |
| 147 | + { | |
| 148 | + this.certFacSpi = certFacSpi; | |
| 149 | + this.provider = provider; | |
| 150 | + this.type = type; | |
| 151 | + } | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * Returns a certificate factory object that implements the | |
| 155 | + * specified certificate type. | |
| 156 | + * | |
| 157 | + * <p> This method traverses the list of registered security Providers, | |
| 158 | + * starting with the most preferred Provider. | |
| 159 | + * A new CertificateFactory object encapsulating the | |
| 160 | + * CertificateFactorySpi implementation from the first | |
| 161 | + * Provider that supports the specified type is returned. | |
| 162 | + * | |
| 163 | + * <p> Note that the list of registered providers may be retrieved via | |
| 164 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 165 | + * | |
| 166 | + * @param type the name of the requested certificate type. | |
| 167 | + * See the CertificateFactory section in the <a href= | |
| 168 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertificateFactory"> | |
| 169 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 170 | + * for information about standard certificate types. | |
| 171 | + * | |
| 172 | + * @return a certificate factory object for the specified type. | |
| 173 | + * | |
| 174 | + * @exception CertificateException if no Provider supports a | |
| 175 | + * CertificateFactorySpi implementation for the | |
| 176 | + * specified type. | |
| 177 | + * | |
| 178 | + * @see java.security.Provider | |
| 179 | + */ | |
| 180 | + public static final CertificateFactory getInstance(String type) | |
| 181 | + throws CertificateException { | |
| 182 | + try { | |
| 183 | + Instance instance = GetInstance.getInstance("CertificateFactory", | |
| 184 | + CertificateFactorySpi.class, type); | |
| 185 | + return new CertificateFactory((CertificateFactorySpi)instance.impl, | |
| 186 | + instance.provider, type); | |
| 187 | + } catch (NoSuchAlgorithmException e) { | |
| 188 | + throw new CertificateException(type + " not found", e); | |
| 189 | + } | |
| 190 | + } | |
| 191 | + | |
| 192 | + /** | |
| 193 | + * Returns a certificate factory object for the specified | |
| 194 | + * certificate type. | |
| 195 | + * | |
| 196 | + * <p> A new CertificateFactory object encapsulating the | |
| 197 | + * CertificateFactorySpi implementation from the specified provider | |
| 198 | + * is returned. The specified provider must be registered | |
| 199 | + * in the security provider list. | |
| 200 | + * | |
| 201 | + * <p> Note that the list of registered providers may be retrieved via | |
| 202 | + * the {@link Security#getProviders() Security.getProviders()} method. | |
| 203 | + * | |
| 204 | + * @param type the certificate type. | |
| 205 | + * See the CertificateFactory section in the <a href= | |
| 206 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertificateFactory"> | |
| 207 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 208 | + * for information about standard certificate types. | |
| 209 | + * | |
| 210 | + * @param provider the name of the provider. | |
| 211 | + * | |
| 212 | + * @return a certificate factory object for the specified type. | |
| 213 | + * | |
| 214 | + * @exception CertificateException if a CertificateFactorySpi | |
| 215 | + * implementation for the specified algorithm is not | |
| 216 | + * available from the specified provider. | |
| 217 | + * | |
| 218 | + * @exception NoSuchProviderException if the specified provider is not | |
| 219 | + * registered in the security provider list. | |
| 220 | + * | |
| 221 | + * @exception IllegalArgumentException if the provider name is null | |
| 222 | + * or empty. | |
| 223 | + * | |
| 224 | + * @see java.security.Provider | |
| 225 | + */ | |
| 226 | + public static final CertificateFactory getInstance(String type, | |
| 227 | + String provider) throws CertificateException, | |
| 228 | + NoSuchProviderException { | |
| 229 | + try { | |
| 230 | + Instance instance = GetInstance.getInstance("CertificateFactory", | |
| 231 | + CertificateFactorySpi.class, type, provider); | |
| 232 | + return new CertificateFactory((CertificateFactorySpi)instance.impl, | |
| 233 | + instance.provider, type); | |
| 234 | + } catch (NoSuchAlgorithmException e) { | |
| 235 | + throw new CertificateException(type + " not found", e); | |
| 236 | + } | |
| 237 | + } | |
| 238 | + | |
| 239 | + /** | |
| 240 | + * Returns a certificate factory object for the specified | |
| 241 | + * certificate type. | |
| 242 | + * | |
| 243 | + * <p> A new CertificateFactory object encapsulating the | |
| 244 | + * CertificateFactorySpi implementation from the specified Provider | |
| 245 | + * object is returned. Note that the specified Provider object | |
| 246 | + * does not have to be registered in the provider list. | |
| 247 | + * | |
| 248 | + * @param type the certificate type. | |
| 249 | + * See the CertificateFactory section in the <a href= | |
| 250 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertificateFactory"> | |
| 251 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 252 | + * for information about standard certificate types. | |
| 253 | + * @param provider the provider. | |
| 254 | + * | |
| 255 | + * @return a certificate factory object for the specified type. | |
| 256 | + * | |
| 257 | + * @exception CertificateException if a CertificateFactorySpi | |
| 258 | + * implementation for the specified algorithm is not available | |
| 259 | + * from the specified Provider object. | |
| 260 | + * | |
| 261 | + * @exception IllegalArgumentException if the <code>provider</code> is | |
| 262 | + * null. | |
| 263 | + * | |
| 264 | + * @see java.security.Provider | |
| 265 | + * | |
| 266 | + * @since 1.4 | |
| 267 | + */ | |
| 268 | + public static final CertificateFactory getInstance(String type, | |
| 269 | + Provider provider) throws CertificateException { | |
| 270 | + try { | |
| 271 | + Instance instance = GetInstance.getInstance("CertificateFactory", | |
| 272 | + CertificateFactorySpi.class, type, provider); | |
| 273 | + return new CertificateFactory((CertificateFactorySpi)instance.impl, | |
| 274 | + instance.provider, type); | |
| 275 | + } catch (NoSuchAlgorithmException e) { | |
| 276 | + throw new CertificateException(type + " not found", e); | |
| 277 | + } | |
| 278 | + } | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * Returns the provider of this certificate factory. | |
| 282 | + * | |
| 283 | + * @return the provider of this certificate factory. | |
| 284 | + */ | |
| 285 | + public final Provider getProvider() { | |
| 286 | + return this.provider; | |
| 287 | + } | |
| 288 | + | |
| 289 | + /** | |
| 290 | + * Returns the name of the certificate type associated with this | |
| 291 | + * certificate factory. | |
| 292 | + * | |
| 293 | + * @return the name of the certificate type associated with this | |
| 294 | + * certificate factory. | |
| 295 | + */ | |
| 296 | + public final String getType() { | |
| 297 | + return this.type; | |
| 298 | + } | |
| 299 | + | |
| 300 | + /** | |
| 301 | + * Generates a certificate object and initializes it with | |
| 302 | + * the data read from the input stream <code>inStream</code>. | |
| 303 | + * | |
| 304 | + * <p>In order to take advantage of the specialized certificate format | |
| 305 | + * supported by this certificate factory, | |
| 306 | + * the returned certificate object can be typecast to the corresponding | |
| 307 | + * certificate class. For example, if this certificate | |
| 308 | + * factory implements X.509 certificates, the returned certificate object | |
| 309 | + * can be typecast to the <code>X509Certificate</code> class. | |
| 310 | + * | |
| 311 | + * <p>In the case of a certificate factory for X.509 certificates, the | |
| 312 | + * certificate provided in <code>inStream</code> must be DER-encoded and | |
| 313 | + * may be supplied in binary or printable (Base64) encoding. If the | |
| 314 | + * certificate is provided in Base64 encoding, it must be bounded at | |
| 315 | + * the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at | |
| 316 | + * the end by -----END CERTIFICATE-----. | |
| 317 | + * | |
| 318 | + * <p>Note that if the given input stream does not support | |
| 319 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 320 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 321 | + * consume the entire input stream. Otherwise, each call to this | |
| 322 | + * method consumes one certificate and the read position of the | |
| 323 | + * input stream is positioned to the next available byte after | |
| 324 | + * the inherent end-of-certificate marker. If the data in the input stream | |
| 325 | + * does not contain an inherent end-of-certificate marker (other | |
| 326 | + * than EOF) and there is trailing data after the certificate is parsed, a | |
| 327 | + * <code>CertificateException</code> is thrown. | |
| 328 | + * | |
| 329 | + * @param inStream an input stream with the certificate data. | |
| 330 | + * | |
| 331 | + * @return a certificate object initialized with the data | |
| 332 | + * from the input stream. | |
| 333 | + * | |
| 334 | + * @exception CertificateException on parsing errors. | |
| 335 | + */ | |
| 336 | + public final Certificate generateCertificate(InputStream inStream) | |
| 337 | + throws CertificateException | |
| 338 | + { | |
| 339 | + return certFacSpi.engineGenerateCertificate(inStream); | |
| 340 | + } | |
| 341 | + | |
| 342 | + /** | |
| 343 | + * Returns an iteration of the <code>CertPath</code> encodings supported | |
| 344 | + * by this certificate factory, with the default encoding first. See | |
| 345 | + * the CertPath Encodings section in the <a href= | |
| 346 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathEncodings"> | |
| 347 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 348 | + * for information about standard encoding names and their formats. | |
| 349 | + * <p> | |
| 350 | + * Attempts to modify the returned <code>Iterator</code> via its | |
| 351 | + * <code>remove</code> method result in an | |
| 352 | + * <code>UnsupportedOperationException</code>. | |
| 353 | + * | |
| 354 | + * @return an <code>Iterator</code> over the names of the supported | |
| 355 | + * <code>CertPath</code> encodings (as <code>String</code>s) | |
| 356 | + * @since 1.4 | |
| 357 | + */ | |
| 358 | + public final Iterator<String> getCertPathEncodings() { | |
| 359 | + return(certFacSpi.engineGetCertPathEncodings()); | |
| 360 | + } | |
| 361 | + | |
| 362 | + /** | |
| 363 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 364 | + * the data read from the <code>InputStream</code> inStream. The data | |
| 365 | + * is assumed to be in the default encoding. The name of the default | |
| 366 | + * encoding is the first element of the <code>Iterator</code> returned by | |
| 367 | + * the {@link #getCertPathEncodings getCertPathEncodings} method. | |
| 368 | + * | |
| 369 | + * @param inStream an <code>InputStream</code> containing the data | |
| 370 | + * @return a <code>CertPath</code> initialized with the data from the | |
| 371 | + * <code>InputStream</code> | |
| 372 | + * @exception CertificateException if an exception occurs while decoding | |
| 373 | + * @since 1.4 | |
| 374 | + */ | |
| 375 | + public final CertPath generateCertPath(InputStream inStream) | |
| 376 | + throws CertificateException | |
| 377 | + { | |
| 378 | + return(certFacSpi.engineGenerateCertPath(inStream)); | |
| 379 | + } | |
| 380 | + | |
| 381 | + /** | |
| 382 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 383 | + * the data read from the <code>InputStream</code> inStream. The data | |
| 384 | + * is assumed to be in the specified encoding. See | |
| 385 | + * the CertPath Encodings section in the <a href= | |
| 386 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathEncodings"> | |
| 387 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 388 | + * for information about standard encoding names and their formats. | |
| 389 | + * | |
| 390 | + * @param inStream an <code>InputStream</code> containing the data | |
| 391 | + * @param encoding the encoding used for the data | |
| 392 | + * @return a <code>CertPath</code> initialized with the data from the | |
| 393 | + * <code>InputStream</code> | |
| 394 | + * @exception CertificateException if an exception occurs while decoding or | |
| 395 | + * the encoding requested is not supported | |
| 396 | + * @since 1.4 | |
| 397 | + */ | |
| 398 | + public final CertPath generateCertPath(InputStream inStream, | |
| 399 | + String encoding) throws CertificateException | |
| 400 | + { | |
| 401 | + return(certFacSpi.engineGenerateCertPath(inStream, encoding)); | |
| 402 | + } | |
| 403 | + | |
| 404 | + /** | |
| 405 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 406 | + * a <code>List</code> of <code>Certificate</code>s. | |
| 407 | + * <p> | |
| 408 | + * The certificates supplied must be of a type supported by the | |
| 409 | + * <code>CertificateFactory</code>. They will be copied out of the supplied | |
| 410 | + * <code>List</code> object. | |
| 411 | + * | |
| 412 | + * @param certificates a <code>List</code> of <code>Certificate</code>s | |
| 413 | + * @return a <code>CertPath</code> initialized with the supplied list of | |
| 414 | + * certificates | |
| 415 | + * @exception CertificateException if an exception occurs | |
| 416 | + * @since 1.4 | |
| 417 | + */ | |
| 418 | + public final CertPath | |
| 419 | + generateCertPath(List<? extends Certificate> certificates) | |
| 420 | + throws CertificateException | |
| 421 | + { | |
| 422 | + return(certFacSpi.engineGenerateCertPath(certificates)); | |
| 423 | + } | |
| 424 | + | |
| 425 | + /** | |
| 426 | + * Returns a (possibly empty) collection view of the certificates read | |
| 427 | + * from the given input stream <code>inStream</code>. | |
| 428 | + * | |
| 429 | + * <p>In order to take advantage of the specialized certificate format | |
| 430 | + * supported by this certificate factory, each element in | |
| 431 | + * the returned collection view can be typecast to the corresponding | |
| 432 | + * certificate class. For example, if this certificate | |
| 433 | + * factory implements X.509 certificates, the elements in the returned | |
| 434 | + * collection can be typecast to the <code>X509Certificate</code> class. | |
| 435 | + * | |
| 436 | + * <p>In the case of a certificate factory for X.509 certificates, | |
| 437 | + * <code>inStream</code> may contain a sequence of DER-encoded certificates | |
| 438 | + * in the formats described for | |
| 439 | + * {@link #generateCertificate(java.io.InputStream) generateCertificate}. | |
| 440 | + * In addition, <code>inStream</code> may contain a PKCS#7 certificate | |
| 441 | + * chain. This is a PKCS#7 <i>SignedData</i> object, with the only | |
| 442 | + * significant field being <i>certificates</i>. In particular, the | |
| 443 | + * signature and the contents are ignored. This format allows multiple | |
| 444 | + * certificates to be downloaded at once. If no certificates are present, | |
| 445 | + * an empty collection is returned. | |
| 446 | + * | |
| 447 | + * <p>Note that if the given input stream does not support | |
| 448 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 449 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 450 | + * consume the entire input stream. | |
| 451 | + * | |
| 452 | + * @param inStream the input stream with the certificates. | |
| 453 | + * | |
| 454 | + * @return a (possibly empty) collection view of | |
| 455 | + * java.security.cert.Certificate objects | |
| 456 | + * initialized with the data from the input stream. | |
| 457 | + * | |
| 458 | + * @exception CertificateException on parsing errors. | |
| 459 | + */ | |
| 460 | + public final Collection<? extends Certificate> generateCertificates | |
| 461 | + (InputStream inStream) throws CertificateException { | |
| 462 | + return certFacSpi.engineGenerateCertificates(inStream); | |
| 463 | + } | |
| 464 | + | |
| 465 | + /** | |
| 466 | + * Generates a certificate revocation list (CRL) object and initializes it | |
| 467 | + * with the data read from the input stream <code>inStream</code>. | |
| 468 | + * | |
| 469 | + * <p>In order to take advantage of the specialized CRL format | |
| 470 | + * supported by this certificate factory, | |
| 471 | + * the returned CRL object can be typecast to the corresponding | |
| 472 | + * CRL class. For example, if this certificate | |
| 473 | + * factory implements X.509 CRLs, the returned CRL object | |
| 474 | + * can be typecast to the <code>X509CRL</code> class. | |
| 475 | + * | |
| 476 | + * <p>Note that if the given input stream does not support | |
| 477 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 478 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 479 | + * consume the entire input stream. Otherwise, each call to this | |
| 480 | + * method consumes one CRL and the read position of the input stream | |
| 481 | + * is positioned to the next available byte after the inherent | |
| 482 | + * end-of-CRL marker. If the data in the | |
| 483 | + * input stream does not contain an inherent end-of-CRL marker (other | |
| 484 | + * than EOF) and there is trailing data after the CRL is parsed, a | |
| 485 | + * <code>CRLException</code> is thrown. | |
| 486 | + * | |
| 487 | + * @param inStream an input stream with the CRL data. | |
| 488 | + * | |
| 489 | + * @return a CRL object initialized with the data | |
| 490 | + * from the input stream. | |
| 491 | + * | |
| 492 | + * @exception CRLException on parsing errors. | |
| 493 | + */ | |
| 494 | + public final CRL generateCRL(InputStream inStream) | |
| 495 | + throws CRLException | |
| 496 | + { | |
| 497 | + return certFacSpi.engineGenerateCRL(inStream); | |
| 498 | + } | |
| 499 | + | |
| 500 | + /** | |
| 501 | + * Returns a (possibly empty) collection view of the CRLs read | |
| 502 | + * from the given input stream <code>inStream</code>. | |
| 503 | + * | |
| 504 | + * <p>In order to take advantage of the specialized CRL format | |
| 505 | + * supported by this certificate factory, each element in | |
| 506 | + * the returned collection view can be typecast to the corresponding | |
| 507 | + * CRL class. For example, if this certificate | |
| 508 | + * factory implements X.509 CRLs, the elements in the returned | |
| 509 | + * collection can be typecast to the <code>X509CRL</code> class. | |
| 510 | + * | |
| 511 | + * <p>In the case of a certificate factory for X.509 CRLs, | |
| 512 | + * <code>inStream</code> may contain a sequence of DER-encoded CRLs. | |
| 513 | + * In addition, <code>inStream</code> may contain a PKCS#7 CRL | |
| 514 | + * set. This is a PKCS#7 <i>SignedData</i> object, with the only | |
| 515 | + * significant field being <i>crls</i>. In particular, the | |
| 516 | + * signature and the contents are ignored. This format allows multiple | |
| 517 | + * CRLs to be downloaded at once. If no CRLs are present, | |
| 518 | + * an empty collection is returned. | |
| 519 | + * | |
| 520 | + * <p>Note that if the given input stream does not support | |
| 521 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 522 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 523 | + * consume the entire input stream. | |
| 524 | + * | |
| 525 | + * @param inStream the input stream with the CRLs. | |
| 526 | + * | |
| 527 | + * @return a (possibly empty) collection view of | |
| 528 | + * java.security.cert.CRL objects initialized with the data from the input | |
| 529 | + * stream. | |
| 530 | + * | |
| 531 | + * @exception CRLException on parsing errors. | |
| 532 | + */ | |
| 533 | + public final Collection<? extends CRL> generateCRLs(InputStream inStream) | |
| 534 | + throws CRLException { | |
| 535 | + return certFacSpi.engineGenerateCRLs(inStream); | |
| 536 | + } | |
| 537 | +} | |
Binary file not shown.
| @@ -0,0 +1,315 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.InputStream; | |
| 29 | +import java.util.Collection; | |
| 30 | +import java.util.Iterator; | |
| 31 | +import java.util.List; | |
| 32 | +import java.security.Provider; | |
| 33 | +import java.security.NoSuchAlgorithmException; | |
| 34 | +import java.security.NoSuchProviderException; | |
| 35 | + | |
| 36 | +/** | |
| 37 | + * This class defines the <i>Service Provider Interface</i> (<b>SPI</b>) | |
| 38 | + * for the <code>CertificateFactory</code> class. | |
| 39 | + * All the abstract methods in this class must be implemented by each | |
| 40 | + * cryptographic service provider who wishes to supply the implementation | |
| 41 | + * of a certificate factory for a particular certificate type, e.g., X.509. | |
| 42 | + * | |
| 43 | + * <p>Certificate factories are used to generate certificate, certification path | |
| 44 | + * (<code>CertPath</code>) and certificate revocation list (CRL) objects from | |
| 45 | + * their encodings. | |
| 46 | + * | |
| 47 | + * <p>A certificate factory for X.509 must return certificates that are an | |
| 48 | + * instance of <code>java.security.cert.X509Certificate</code>, and CRLs | |
| 49 | + * that are an instance of <code>java.security.cert.X509CRL</code>. | |
| 50 | + * | |
| 51 | + * @author Hemma Prafullchandra | |
| 52 | + * @author Jan Luehe | |
| 53 | + * @author Sean Mullan | |
| 54 | + * | |
| 55 | + * | |
| 56 | + * @see CertificateFactory | |
| 57 | + * @see Certificate | |
| 58 | + * @see X509Certificate | |
| 59 | + * @see CertPath | |
| 60 | + * @see CRL | |
| 61 | + * @see X509CRL | |
| 62 | + * | |
| 63 | + * @since 1.2 | |
| 64 | + */ | |
| 65 | + | |
| 66 | +public abstract class CertificateFactorySpi { | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Generates a certificate object and initializes it with | |
| 70 | + * the data read from the input stream <code>inStream</code>. | |
| 71 | + * | |
| 72 | + * <p>In order to take advantage of the specialized certificate format | |
| 73 | + * supported by this certificate factory, | |
| 74 | + * the returned certificate object can be typecast to the corresponding | |
| 75 | + * certificate class. For example, if this certificate | |
| 76 | + * factory implements X.509 certificates, the returned certificate object | |
| 77 | + * can be typecast to the <code>X509Certificate</code> class. | |
| 78 | + * | |
| 79 | + * <p>In the case of a certificate factory for X.509 certificates, the | |
| 80 | + * certificate provided in <code>inStream</code> must be DER-encoded and | |
| 81 | + * may be supplied in binary or printable (Base64) encoding. If the | |
| 82 | + * certificate is provided in Base64 encoding, it must be bounded at | |
| 83 | + * the beginning by -----BEGIN CERTIFICATE-----, and must be bounded at | |
| 84 | + * the end by -----END CERTIFICATE-----. | |
| 85 | + * | |
| 86 | + * <p>Note that if the given input stream does not support | |
| 87 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 88 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 89 | + * consume the entire input stream. Otherwise, each call to this | |
| 90 | + * method consumes one certificate and the read position of the input stream | |
| 91 | + * is positioned to the next available byte after the inherent | |
| 92 | + * end-of-certificate marker. If the data in the | |
| 93 | + * input stream does not contain an inherent end-of-certificate marker (other | |
| 94 | + * than EOF) and there is trailing data after the certificate is parsed, a | |
| 95 | + * <code>CertificateException</code> is thrown. | |
| 96 | + * | |
| 97 | + * @param inStream an input stream with the certificate data. | |
| 98 | + * | |
| 99 | + * @return a certificate object initialized with the data | |
| 100 | + * from the input stream. | |
| 101 | + * | |
| 102 | + * @exception CertificateException on parsing errors. | |
| 103 | + */ | |
| 104 | + public abstract Certificate engineGenerateCertificate(InputStream inStream) | |
| 105 | + throws CertificateException; | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 109 | + * the data read from the <code>InputStream</code> inStream. The data | |
| 110 | + * is assumed to be in the default encoding. | |
| 111 | + * | |
| 112 | + * <p> This method was added to version 1.4 of the Java 2 Platform | |
| 113 | + * Standard Edition. In order to maintain backwards compatibility with | |
| 114 | + * existing service providers, this method cannot be <code>abstract</code> | |
| 115 | + * and by default throws an <code>UnsupportedOperationException</code>. | |
| 116 | + * | |
| 117 | + * @param inStream an <code>InputStream</code> containing the data | |
| 118 | + * @return a <code>CertPath</code> initialized with the data from the | |
| 119 | + * <code>InputStream</code> | |
| 120 | + * @exception CertificateException if an exception occurs while decoding | |
| 121 | + * @exception UnsupportedOperationException if the method is not supported | |
| 122 | + * @since 1.4 | |
| 123 | + */ | |
| 124 | + public CertPath engineGenerateCertPath(InputStream inStream) | |
| 125 | + throws CertificateException | |
| 126 | + { | |
| 127 | + throw new UnsupportedOperationException(); | |
| 128 | + } | |
| 129 | + | |
| 130 | + /** | |
| 131 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 132 | + * the data read from the <code>InputStream</code> inStream. The data | |
| 133 | + * is assumed to be in the specified encoding. | |
| 134 | + * | |
| 135 | + * <p> This method was added to version 1.4 of the Java 2 Platform | |
| 136 | + * Standard Edition. In order to maintain backwards compatibility with | |
| 137 | + * existing service providers, this method cannot be <code>abstract</code> | |
| 138 | + * and by default throws an <code>UnsupportedOperationException</code>. | |
| 139 | + * | |
| 140 | + * @param inStream an <code>InputStream</code> containing the data | |
| 141 | + * @param encoding the encoding used for the data | |
| 142 | + * @return a <code>CertPath</code> initialized with the data from the | |
| 143 | + * <code>InputStream</code> | |
| 144 | + * @exception CertificateException if an exception occurs while decoding or | |
| 145 | + * the encoding requested is not supported | |
| 146 | + * @exception UnsupportedOperationException if the method is not supported | |
| 147 | + * @since 1.4 | |
| 148 | + */ | |
| 149 | + public CertPath engineGenerateCertPath(InputStream inStream, | |
| 150 | + String encoding) throws CertificateException | |
| 151 | + { | |
| 152 | + throw new UnsupportedOperationException(); | |
| 153 | + } | |
| 154 | + | |
| 155 | + /** | |
| 156 | + * Generates a <code>CertPath</code> object and initializes it with | |
| 157 | + * a <code>List</code> of <code>Certificate</code>s. | |
| 158 | + * <p> | |
| 159 | + * The certificates supplied must be of a type supported by the | |
| 160 | + * <code>CertificateFactory</code>. They will be copied out of the supplied | |
| 161 | + * <code>List</code> object. | |
| 162 | + * | |
| 163 | + * <p> This method was added to version 1.4 of the Java 2 Platform | |
| 164 | + * Standard Edition. In order to maintain backwards compatibility with | |
| 165 | + * existing service providers, this method cannot be <code>abstract</code> | |
| 166 | + * and by default throws an <code>UnsupportedOperationException</code>. | |
| 167 | + * | |
| 168 | + * @param certificates a <code>List</code> of <code>Certificate</code>s | |
| 169 | + * @return a <code>CertPath</code> initialized with the supplied list of | |
| 170 | + * certificates | |
| 171 | + * @exception CertificateException if an exception occurs | |
| 172 | + * @exception UnsupportedOperationException if the method is not supported | |
| 173 | + * @since 1.4 | |
| 174 | + */ | |
| 175 | + public CertPath | |
| 176 | + engineGenerateCertPath(List<? extends Certificate> certificates) | |
| 177 | + throws CertificateException | |
| 178 | + { | |
| 179 | + throw new UnsupportedOperationException(); | |
| 180 | + } | |
| 181 | + | |
| 182 | + /** | |
| 183 | + * Returns an iteration of the <code>CertPath</code> encodings supported | |
| 184 | + * by this certificate factory, with the default encoding first. See | |
| 185 | + * the CertPath Encodings section in the <a href= | |
| 186 | + * "{@docRoot}/../technotes/guides/security/StandardNames.html#CertPathEncodings"> | |
| 187 | + * Java Cryptography Architecture Standard Algorithm Name Documentation</a> | |
| 188 | + * for information about standard encoding names. | |
| 189 | + * <p> | |
| 190 | + * Attempts to modify the returned <code>Iterator</code> via its | |
| 191 | + * <code>remove</code> method result in an | |
| 192 | + * <code>UnsupportedOperationException</code>. | |
| 193 | + * | |
| 194 | + * <p> This method was added to version 1.4 of the Java 2 Platform | |
| 195 | + * Standard Edition. In order to maintain backwards compatibility with | |
| 196 | + * existing service providers, this method cannot be <code>abstract</code> | |
| 197 | + * and by default throws an <code>UnsupportedOperationException</code>. | |
| 198 | + * | |
| 199 | + * @return an <code>Iterator</code> over the names of the supported | |
| 200 | + * <code>CertPath</code> encodings (as <code>String</code>s) | |
| 201 | + * @exception UnsupportedOperationException if the method is not supported | |
| 202 | + * @since 1.4 | |
| 203 | + */ | |
| 204 | + public Iterator<String> engineGetCertPathEncodings() { | |
| 205 | + throw new UnsupportedOperationException(); | |
| 206 | + } | |
| 207 | + | |
| 208 | + /** | |
| 209 | + * Returns a (possibly empty) collection view of the certificates read | |
| 210 | + * from the given input stream <code>inStream</code>. | |
| 211 | + * | |
| 212 | + * <p>In order to take advantage of the specialized certificate format | |
| 213 | + * supported by this certificate factory, each element in | |
| 214 | + * the returned collection view can be typecast to the corresponding | |
| 215 | + * certificate class. For example, if this certificate | |
| 216 | + * factory implements X.509 certificates, the elements in the returned | |
| 217 | + * collection can be typecast to the <code>X509Certificate</code> class. | |
| 218 | + * | |
| 219 | + * <p>In the case of a certificate factory for X.509 certificates, | |
| 220 | + * <code>inStream</code> may contain a single DER-encoded certificate | |
| 221 | + * in the formats described for | |
| 222 | + * {@link CertificateFactory#generateCertificate(java.io.InputStream) | |
| 223 | + * generateCertificate}. | |
| 224 | + * In addition, <code>inStream</code> may contain a PKCS#7 certificate | |
| 225 | + * chain. This is a PKCS#7 <i>SignedData</i> object, with the only | |
| 226 | + * significant field being <i>certificates</i>. In particular, the | |
| 227 | + * signature and the contents are ignored. This format allows multiple | |
| 228 | + * certificates to be downloaded at once. If no certificates are present, | |
| 229 | + * an empty collection is returned. | |
| 230 | + * | |
| 231 | + * <p>Note that if the given input stream does not support | |
| 232 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 233 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 234 | + * consume the entire input stream. | |
| 235 | + * | |
| 236 | + * @param inStream the input stream with the certificates. | |
| 237 | + * | |
| 238 | + * @return a (possibly empty) collection view of | |
| 239 | + * java.security.cert.Certificate objects | |
| 240 | + * initialized with the data from the input stream. | |
| 241 | + * | |
| 242 | + * @exception CertificateException on parsing errors. | |
| 243 | + */ | |
| 244 | + public abstract Collection<? extends Certificate> | |
| 245 | + engineGenerateCertificates(InputStream inStream) | |
| 246 | + throws CertificateException; | |
| 247 | + | |
| 248 | + /** | |
| 249 | + * Generates a certificate revocation list (CRL) object and initializes it | |
| 250 | + * with the data read from the input stream <code>inStream</code>. | |
| 251 | + * | |
| 252 | + * <p>In order to take advantage of the specialized CRL format | |
| 253 | + * supported by this certificate factory, | |
| 254 | + * the returned CRL object can be typecast to the corresponding | |
| 255 | + * CRL class. For example, if this certificate | |
| 256 | + * factory implements X.509 CRLs, the returned CRL object | |
| 257 | + * can be typecast to the <code>X509CRL</code> class. | |
| 258 | + * | |
| 259 | + * <p>Note that if the given input stream does not support | |
| 260 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 261 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 262 | + * consume the entire input stream. Otherwise, each call to this | |
| 263 | + * method consumes one CRL and the read position of the input stream | |
| 264 | + * is positioned to the next available byte after the inherent | |
| 265 | + * end-of-CRL marker. If the data in the | |
| 266 | + * input stream does not contain an inherent end-of-CRL marker (other | |
| 267 | + * than EOF) and there is trailing data after the CRL is parsed, a | |
| 268 | + * <code>CRLException</code> is thrown. | |
| 269 | + * | |
| 270 | + * @param inStream an input stream with the CRL data. | |
| 271 | + * | |
| 272 | + * @return a CRL object initialized with the data | |
| 273 | + * from the input stream. | |
| 274 | + * | |
| 275 | + * @exception CRLException on parsing errors. | |
| 276 | + */ | |
| 277 | + public abstract CRL engineGenerateCRL(InputStream inStream) | |
| 278 | + throws CRLException; | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * Returns a (possibly empty) collection view of the CRLs read | |
| 282 | + * from the given input stream <code>inStream</code>. | |
| 283 | + * | |
| 284 | + * <p>In order to take advantage of the specialized CRL format | |
| 285 | + * supported by this certificate factory, each element in | |
| 286 | + * the returned collection view can be typecast to the corresponding | |
| 287 | + * CRL class. For example, if this certificate | |
| 288 | + * factory implements X.509 CRLs, the elements in the returned | |
| 289 | + * collection can be typecast to the <code>X509CRL</code> class. | |
| 290 | + * | |
| 291 | + * <p>In the case of a certificate factory for X.509 CRLs, | |
| 292 | + * <code>inStream</code> may contain a single DER-encoded CRL. | |
| 293 | + * In addition, <code>inStream</code> may contain a PKCS#7 CRL | |
| 294 | + * set. This is a PKCS#7 <i>SignedData</i> object, with the only | |
| 295 | + * significant field being <i>crls</i>. In particular, the | |
| 296 | + * signature and the contents are ignored. This format allows multiple | |
| 297 | + * CRLs to be downloaded at once. If no CRLs are present, | |
| 298 | + * an empty collection is returned. | |
| 299 | + * | |
| 300 | + * <p>Note that if the given input stream does not support | |
| 301 | + * {@link java.io.InputStream#mark(int) mark} and | |
| 302 | + * {@link java.io.InputStream#reset() reset}, this method will | |
| 303 | + * consume the entire input stream. | |
| 304 | + * | |
| 305 | + * @param inStream the input stream with the CRLs. | |
| 306 | + * | |
| 307 | + * @return a (possibly empty) collection view of | |
| 308 | + * java.security.cert.CRL objects initialized with the data from the input | |
| 309 | + * stream. | |
| 310 | + * | |
| 311 | + * @exception CRLException on parsing errors. | |
| 312 | + */ | |
| 313 | + public abstract Collection<? extends CRL> engineGenerateCRLs | |
| 314 | + (InputStream inStream) throws CRLException; | |
| 315 | +} | |
Binary file not shown.
| @@ -0,0 +1,59 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Certificate is not yet valid exception. This is thrown whenever | |
| 30 | + * the current <code>Date</code> or the specified <code>Date</code> | |
| 31 | + * is before the <code>notBefore</code> date/time in the Certificate | |
| 32 | + * validity period. | |
| 33 | + * | |
| 34 | + * @author Hemma Prafullchandra | |
| 35 | + */ | |
| 36 | +public class CertificateNotYetValidException extends CertificateException { | |
| 37 | + | |
| 38 | + static final long serialVersionUID = 4355919900041064702L; | |
| 39 | + | |
| 40 | + /** | |
| 41 | + * Constructs a CertificateNotYetValidException with no detail message. A | |
| 42 | + * detail message is a String that describes this particular | |
| 43 | + * exception. | |
| 44 | + */ | |
| 45 | + public CertificateNotYetValidException() { | |
| 46 | + super(); | |
| 47 | + } | |
| 48 | + | |
| 49 | + /** | |
| 50 | + * Constructs a CertificateNotYetValidException with the specified detail | |
| 51 | + * message. A detail message is a String that describes this | |
| 52 | + * particular exception. | |
| 53 | + * | |
| 54 | + * @param message the detail message. | |
| 55 | + */ | |
| 56 | + public CertificateNotYetValidException(String message) { | |
| 57 | + super(message); | |
| 58 | + } | |
| 59 | +} | |
Binary file not shown.
| @@ -0,0 +1,89 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Certificate Parsing Exception. This is thrown whenever an | |
| 30 | + * invalid DER-encoded certificate is parsed or unsupported DER features | |
| 31 | + * are found in the Certificate. | |
| 32 | + * | |
| 33 | + * @author Hemma Prafullchandra | |
| 34 | + */ | |
| 35 | +public class CertificateParsingException extends CertificateException { | |
| 36 | + | |
| 37 | + private static final long serialVersionUID = -7989222416793322029L; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * Constructs a CertificateParsingException with no detail message. A | |
| 41 | + * detail message is a String that describes this particular | |
| 42 | + * exception. | |
| 43 | + */ | |
| 44 | + public CertificateParsingException() { | |
| 45 | + super(); | |
| 46 | + } | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * Constructs a CertificateParsingException with the specified detail | |
| 50 | + * message. A detail message is a String that describes this | |
| 51 | + * particular exception. | |
| 52 | + * | |
| 53 | + * @param message the detail message. | |
| 54 | + */ | |
| 55 | + public CertificateParsingException(String message) { | |
| 56 | + super(message); | |
| 57 | + } | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Creates a <code>CertificateParsingException</code> with the specified | |
| 61 | + * detail message and cause. | |
| 62 | + * | |
| 63 | + * @param message the detail message (which is saved for later retrieval | |
| 64 | + * by the {@link #getMessage()} method). | |
| 65 | + * @param cause the cause (which is saved for later retrieval by the | |
| 66 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 67 | + * and indicates that the cause is nonexistent or unknown.) | |
| 68 | + * @since 1.5 | |
| 69 | + */ | |
| 70 | + public CertificateParsingException(String message, Throwable cause) { | |
| 71 | + super(message, cause); | |
| 72 | + } | |
| 73 | + | |
| 74 | + /** | |
| 75 | + * Creates a <code>CertificateParsingException</code> with the | |
| 76 | + * specified cause and a detail message of | |
| 77 | + * <tt>(cause==null ? null : cause.toString())</tt> | |
| 78 | + * (which typically contains the class and detail message of | |
| 79 | + * <tt>cause</tt>). | |
| 80 | + * | |
| 81 | + * @param cause the cause (which is saved for later retrieval by the | |
| 82 | + * {@link #getCause()} method). (A <tt>null</tt> value is permitted, | |
| 83 | + * and indicates that the cause is nonexistent or unknown.) | |
| 84 | + * @since 1.5 | |
| 85 | + */ | |
| 86 | + public CertificateParsingException(Throwable cause) { | |
| 87 | + super(cause); | |
| 88 | + } | |
| 89 | +} | |
Binary file not shown.
| @@ -0,0 +1,245 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.ObjectInputStream; | |
| 29 | +import java.io.ObjectOutputStream; | |
| 30 | +import java.io.IOException; | |
| 31 | +import java.util.Collections; | |
| 32 | +import java.util.Date; | |
| 33 | +import java.util.HashMap; | |
| 34 | +import java.util.Map; | |
| 35 | +import java.util.Map.Entry; | |
| 36 | +import javax.security.auth.x500.X500Principal; | |
| 37 | + | |
| 38 | +import sun.security.util.ObjectIdentifier; | |
| 39 | +import sun.security.x509.InvalidityDateExtension; | |
| 40 | + | |
| 41 | +/** | |
| 42 | + * An exception that indicates an X.509 certificate is revoked. A | |
| 43 | + * <code>CertificateRevokedException</code> contains additional information | |
| 44 | + * about the revoked certificate, such as the date on which the | |
| 45 | + * certificate was revoked and the reason it was revoked. | |
| 46 | + * | |
| 47 | + * @author Sean Mullan | |
| 48 | + * @since 1.7 | |
| 49 | + * @see CertPathValidatorException | |
| 50 | + */ | |
| 51 | +public class CertificateRevokedException extends CertificateException { | |
| 52 | + | |
| 53 | + private static final long serialVersionUID = 7839996631571608627L; | |
| 54 | + | |
| 55 | + /** | |
| 56 | + * @serial the date on which the certificate was revoked | |
| 57 | + */ | |
| 58 | + private Date revocationDate; | |
| 59 | + /** | |
| 60 | + * @serial the revocation reason | |
| 61 | + */ | |
| 62 | + private final CRLReason reason; | |
| 63 | + /** | |
| 64 | + * @serial the <code>X500Principal</code> that represents the name of the | |
| 65 | + * authority that signed the certificate's revocation status information | |
| 66 | + */ | |
| 67 | + private final X500Principal authority; | |
| 68 | + | |
| 69 | + private transient Map<String, Extension> extensions; | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * Constructs a <code>CertificateRevokedException</code> with | |
| 73 | + * the specified revocation date, reason code, authority name, and map | |
| 74 | + * of extensions. | |
| 75 | + * | |
| 76 | + * @param revocationDate the date on which the certificate was revoked. The | |
| 77 | + * date is copied to protect against subsequent modification. | |
| 78 | + * @param reason the revocation reason | |
| 79 | + * @param extensions a map of X.509 Extensions. Each key is an OID String | |
| 80 | + * that maps to the corresponding Extension. The map is copied to | |
| 81 | + * prevent subsequent modification. | |
| 82 | + * @param authority the <code>X500Principal</code> that represents the name | |
| 83 | + * of the authority that signed the certificate's revocation status | |
| 84 | + * information | |
| 85 | + * @throws NullPointerException if <code>revocationDate</code>, | |
| 86 | + * <code>reason</code>, <code>authority</code>, or | |
| 87 | + * <code>extensions</code> is <code>null</code> | |
| 88 | + */ | |
| 89 | + public CertificateRevokedException(Date revocationDate, CRLReason reason, | |
| 90 | + X500Principal authority, Map<String, Extension> extensions) { | |
| 91 | + if (revocationDate == null || reason == null || authority == null || | |
| 92 | + extensions == null) { | |
| 93 | + throw new NullPointerException(); | |
| 94 | + } | |
| 95 | + this.revocationDate = new Date(revocationDate.getTime()); | |
| 96 | + this.reason = reason; | |
| 97 | + this.authority = authority; | |
| 98 | + this.extensions = new HashMap(extensions); | |
| 99 | + } | |
| 100 | + | |
| 101 | + /** | |
| 102 | + * Returns the date on which the certificate was revoked. A new copy is | |
| 103 | + * returned each time the method is invoked to protect against subsequent | |
| 104 | + * modification. | |
| 105 | + * | |
| 106 | + * @return the revocation date | |
| 107 | + */ | |
| 108 | + public Date getRevocationDate() { | |
| 109 | + return (Date) revocationDate.clone(); | |
| 110 | + } | |
| 111 | + | |
| 112 | + /** | |
| 113 | + * Returns the reason the certificate was revoked. | |
| 114 | + * | |
| 115 | + * @return the revocation reason | |
| 116 | + */ | |
| 117 | + public CRLReason getRevocationReason() { | |
| 118 | + return reason; | |
| 119 | + } | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * Returns the name of the authority that signed the certificate's | |
| 123 | + * revocation status information. | |
| 124 | + * | |
| 125 | + * @return the <code>X500Principal</code> that represents the name of the | |
| 126 | + * authority that signed the certificate's revocation status information | |
| 127 | + */ | |
| 128 | + public X500Principal getAuthorityName() { | |
| 129 | + return authority; | |
| 130 | + } | |
| 131 | + | |
| 132 | + /** | |
| 133 | + * Returns the invalidity date, as specifed in the Invalidity Date | |
| 134 | + * extension of this <code>CertificateRevokedException</code>. The | |
| 135 | + * invalidity date is the date on which it is known or suspected that the | |
| 136 | + * private key was compromised or that the certificate otherwise became | |
| 137 | + * invalid. This implementation calls <code>getExtensions()</code> and | |
| 138 | + * checks the returned map for an entry for the Invalidity Date extension | |
| 139 | + * OID ("2.5.29.24"). If found, it returns the invalidity date in the | |
| 140 | + * extension; otherwise null. A new Date object is returned each time the | |
| 141 | + * method is invoked to protect against subsequent modification. | |
| 142 | + * | |
| 143 | + * @return the invalidity date, or <code>null</code> if not specified | |
| 144 | + */ | |
| 145 | + public Date getInvalidityDate() { | |
| 146 | + Extension ext = getExtensions().get("2.5.29.24"); | |
| 147 | + if (ext == null) { | |
| 148 | + return null; | |
| 149 | + } else { | |
| 150 | + try { | |
| 151 | + Date invalidity = | |
| 152 | + (Date) InvalidityDateExtension.toImpl(ext).get("DATE"); | |
| 153 | + return new Date(invalidity.getTime()); | |
| 154 | + } catch (IOException ioe) { | |
| 155 | + return null; | |
| 156 | + } | |
| 157 | + } | |
| 158 | + } | |
| 159 | + | |
| 160 | + /** | |
| 161 | + * Returns a map of X.509 extensions containing additional information | |
| 162 | + * about the revoked certificate, such as the Invalidity Date | |
| 163 | + * Extension. Each key is an OID String that maps to the corresponding | |
| 164 | + * Extension. | |
| 165 | + * | |
| 166 | + * @return an unmodifiable map of X.509 extensions, or an empty map | |
| 167 | + * if there are no extensions | |
| 168 | + */ | |
| 169 | + public Map<String, Extension> getExtensions() { | |
| 170 | + return Collections.unmodifiableMap(extensions); | |
| 171 | + } | |
| 172 | + | |
| 173 | + @Override | |
| 174 | + public String getMessage() { | |
| 175 | + return "Certificate has been revoked, reason: " | |
| 176 | + + reason + ", revocation date: " + revocationDate | |
| 177 | + + ", authority: " + authority + ", extensions: " + extensions; | |
| 178 | + } | |
| 179 | + | |
| 180 | + /** | |
| 181 | + * Serialize this <code>CertificateRevokedException</code> instance. | |
| 182 | + * | |
| 183 | + * @serialData the size of the extensions map (int), followed by all of | |
| 184 | + * the extensions in the map, in no particular order. For each extension, | |
| 185 | + * the following data is emitted: the OID String (Object), the criticality | |
| 186 | + * flag (boolean), the length of the encoded extension value byte array | |
| 187 | + * (int), and the encoded extension value bytes. | |
| 188 | + */ | |
| 189 | + private void writeObject(ObjectOutputStream oos) throws IOException { | |
| 190 | + // Write out the non-transient fields | |
| 191 | + // (revocationDate, reason, authority) | |
| 192 | + oos.defaultWriteObject(); | |
| 193 | + | |
| 194 | + // Write out the size (number of mappings) of the extensions map | |
| 195 | + oos.writeInt(extensions.size()); | |
| 196 | + | |
| 197 | + // For each extension in the map, the following are emitted (in order): | |
| 198 | + // the OID String (Object), the criticality flag (boolean), the length | |
| 199 | + // of the encoded extension value byte array (int), and the encoded | |
| 200 | + // extension value byte array. The extensions themselves are emitted | |
| 201 | + // in no particular order. | |
| 202 | + for (Map.Entry<String, Extension> entry : extensions.entrySet()) { | |
| 203 | + Extension ext = entry.getValue(); | |
| 204 | + oos.writeObject(ext.getId()); | |
| 205 | + oos.writeBoolean(ext.isCritical()); | |
| 206 | + byte[] extVal = ext.getValue(); | |
| 207 | + oos.writeInt(extVal.length); | |
| 208 | + oos.write(extVal); | |
| 209 | + } | |
| 210 | + } | |
| 211 | + | |
| 212 | + /** | |
| 213 | + * Deserialize the <code>CertificateRevokedException</code> instance. | |
| 214 | + */ | |
| 215 | + private void readObject(ObjectInputStream ois) | |
| 216 | + throws IOException, ClassNotFoundException { | |
| 217 | + // Read in the non-transient fields | |
| 218 | + // (revocationDate, reason, authority) | |
| 219 | + ois.defaultReadObject(); | |
| 220 | + | |
| 221 | + // Defensively copy the revocation date | |
| 222 | + revocationDate = new Date(revocationDate.getTime()); | |
| 223 | + | |
| 224 | + // Read in the size (number of mappings) of the extensions map | |
| 225 | + // and create the extensions map | |
| 226 | + int size = ois.readInt(); | |
| 227 | + if (size == 0) { | |
| 228 | + extensions = Collections.emptyMap(); | |
| 229 | + } else { | |
| 230 | + extensions = new HashMap<String, Extension>(size); | |
| 231 | + } | |
| 232 | + | |
| 233 | + // Read in the extensions and put the mappings in the extensions map | |
| 234 | + for (int i = 0; i < size; i++) { | |
| 235 | + String oid = (String) ois.readObject(); | |
| 236 | + boolean critical = ois.readBoolean(); | |
| 237 | + int length = ois.readInt(); | |
| 238 | + byte[] extVal = new byte[length]; | |
| 239 | + ois.readFully(extVal); | |
| 240 | + Extension ext = sun.security.x509.Extension.newExtension | |
| 241 | + (new ObjectIdentifier(oid), critical, extVal); | |
| 242 | + extensions.put(oid, ext); | |
| 243 | + } | |
| 244 | + } | |
| 245 | +} | |
Binary file not shown.
| @@ -0,0 +1,141 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.Serializable; | |
| 29 | +import java.util.Collection; | |
| 30 | +import java.util.Collections; | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * Parameters used as input for the Collection <code>CertStore</code> | |
| 34 | + * algorithm. | |
| 35 | + * <p> | |
| 36 | + * This class is used to provide necessary configuration parameters | |
| 37 | + * to implementations of the Collection <code>CertStore</code> | |
| 38 | + * algorithm. The only parameter included in this class is the | |
| 39 | + * <code>Collection</code> from which the <code>CertStore</code> will | |
| 40 | + * retrieve certificates and CRLs. | |
| 41 | + * <p> | |
| 42 | + * <b>Concurrent Access</b> | |
| 43 | + * <p> | |
| 44 | + * Unless otherwise specified, the methods defined in this class are not | |
| 45 | + * thread-safe. Multiple threads that need to access a single | |
| 46 | + * object concurrently should synchronize amongst themselves and | |
| 47 | + * provide the necessary locking. Multiple threads each manipulating | |
| 48 | + * separate objects need not synchronize. | |
| 49 | + * | |
| 50 | + * @since 1.4 | |
| 51 | + * @author Steve Hanna | |
| 52 | + * @see java.util.Collection | |
| 53 | + * @see CertStore | |
| 54 | + */ | |
| 55 | +public class CollectionCertStoreParameters | |
| 56 | + implements CertStoreParameters { | |
| 57 | + | |
| 58 | + private Collection<?> coll; | |
| 59 | + | |
| 60 | + /** | |
| 61 | + * Creates an instance of <code>CollectionCertStoreParameters</code> | |
| 62 | + * which will allow certificates and CRLs to be retrieved from the | |
| 63 | + * specified <code>Collection</code>. If the specified | |
| 64 | + * <code>Collection</code> contains an object that is not a | |
| 65 | + * <code>Certificate</code> or <code>CRL</code>, that object will be | |
| 66 | + * ignored by the Collection <code>CertStore</code>. | |
| 67 | + * <p> | |
| 68 | + * The <code>Collection</code> is <b>not</b> copied. Instead, a | |
| 69 | + * reference is used. This allows the caller to subsequently add or | |
| 70 | + * remove <code>Certificates</code> or <code>CRL</code>s from the | |
| 71 | + * <code>Collection</code>, thus changing the set of | |
| 72 | + * <code>Certificates</code> or <code>CRL</code>s available to the | |
| 73 | + * Collection <code>CertStore</code>. The Collection <code>CertStore</code> | |
| 74 | + * will not modify the contents of the <code>Collection</code>. | |
| 75 | + * <p> | |
| 76 | + * If the <code>Collection</code> will be modified by one thread while | |
| 77 | + * another thread is calling a method of a Collection <code>CertStore</code> | |
| 78 | + * that has been initialized with this <code>Collection</code>, the | |
| 79 | + * <code>Collection</code> must have fail-fast iterators. | |
| 80 | + * | |
| 81 | + * @param collection a <code>Collection</code> of | |
| 82 | + * <code>Certificate</code>s and <code>CRL</code>s | |
| 83 | + * @exception NullPointerException if <code>collection</code> is | |
| 84 | + * <code>null</code> | |
| 85 | + */ | |
| 86 | + public CollectionCertStoreParameters(Collection<?> collection) { | |
| 87 | + if (collection == null) | |
| 88 | + throw new NullPointerException(); | |
| 89 | + coll = collection; | |
| 90 | + } | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * Creates an instance of <code>CollectionCertStoreParameters</code> with | |
| 94 | + * the default parameter values (an empty and immutable | |
| 95 | + * <code>Collection</code>). | |
| 96 | + */ | |
| 97 | + public CollectionCertStoreParameters() { | |
| 98 | + coll = Collections.EMPTY_SET; | |
| 99 | + } | |
| 100 | + | |
| 101 | + /** | |
| 102 | + * Returns the <code>Collection</code> from which <code>Certificate</code>s | |
| 103 | + * and <code>CRL</code>s are retrieved. This is <b>not</b> a copy of the | |
| 104 | + * <code>Collection</code>, it is a reference. This allows the caller to | |
| 105 | + * subsequently add or remove <code>Certificates</code> or | |
| 106 | + * <code>CRL</code>s from the <code>Collection</code>. | |
| 107 | + * | |
| 108 | + * @return the <code>Collection</code> (never null) | |
| 109 | + */ | |
| 110 | + public Collection<?> getCollection() { | |
| 111 | + return coll; | |
| 112 | + } | |
| 113 | + | |
| 114 | + /** | |
| 115 | + * Returns a copy of this object. Note that only a reference to the | |
| 116 | + * <code>Collection</code> is copied, and not the contents. | |
| 117 | + * | |
| 118 | + * @return the copy | |
| 119 | + */ | |
| 120 | + public Object clone() { | |
| 121 | + try { | |
| 122 | + return super.clone(); | |
| 123 | + } catch (CloneNotSupportedException e) { | |
| 124 | + /* Cannot happen */ | |
| 125 | + throw new InternalError(e.toString()); | |
| 126 | + } | |
| 127 | + } | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Returns a formatted string describing the parameters. | |
| 131 | + * | |
| 132 | + * @return a formatted string describing the parameters | |
| 133 | + */ | |
| 134 | + public String toString() { | |
| 135 | + StringBuffer sb = new StringBuffer(); | |
| 136 | + sb.append("CollectionCertStoreParameters: [\n"); | |
| 137 | + sb.append(" collection: " + coll + "\n"); | |
| 138 | + sb.append("]"); | |
| 139 | + return sb.toString(); | |
| 140 | + } | |
| 141 | +} | |
Binary file not shown.
| @@ -0,0 +1,101 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.io.OutputStream; | |
| 30 | +import java.io.Serializable; | |
| 31 | + | |
| 32 | +/** | |
| 33 | + * This interface represents an X.509 extension. | |
| 34 | + * | |
| 35 | + * <p> | |
| 36 | + * Extensions provide a means of associating additional attributes with users | |
| 37 | + * or public keys and for managing a certification hierarchy. The extension | |
| 38 | + * format also allows communities to define private extensions to carry | |
| 39 | + * information unique to those communities. | |
| 40 | + * | |
| 41 | + * <p> | |
| 42 | + * Each extension contains an object identifier, a criticality setting | |
| 43 | + * indicating whether it is a critical or a non-critical extension, and | |
| 44 | + * and an ASN.1 DER-encoded value. Its ASN.1 definition is: | |
| 45 | + * | |
| 46 | + * <pre> | |
| 47 | + * | |
| 48 | + * Extension ::= SEQUENCE { | |
| 49 | + * extnId OBJECT IDENTIFIER, | |
| 50 | + * critical BOOLEAN DEFAULT FALSE, | |
| 51 | + * extnValue OCTET STRING | |
| 52 | + * -- contains a DER encoding of a value | |
| 53 | + * -- of the type registered for use with | |
| 54 | + * -- the extnId object identifier value | |
| 55 | + * } | |
| 56 | + * | |
| 57 | + * </pre> | |
| 58 | + * | |
| 59 | + * <p> | |
| 60 | + * This interface is designed to provide access to a single extension, | |
| 61 | + * unlike {@link java.security.cert.X509Extension} which is more suitable | |
| 62 | + * for accessing a set of extensions. | |
| 63 | + * | |
| 64 | + * @since 1.7 | |
| 65 | + */ | |
| 66 | +public interface Extension { | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Gets the extensions's object identifier. | |
| 70 | + * | |
| 71 | + * @return the object identifier as a String | |
| 72 | + */ | |
| 73 | + String getId(); | |
| 74 | + | |
| 75 | + /** | |
| 76 | + * Gets the extension's criticality setting. | |
| 77 | + * | |
| 78 | + * @return true if this is a critical extension. | |
| 79 | + */ | |
| 80 | + boolean isCritical(); | |
| 81 | + | |
| 82 | + /** | |
| 83 | + * Gets the extensions's DER-encoded value. Note, this is the bytes | |
| 84 | + * that are encoded as an OCTET STRING. It does not include the OCTET | |
| 85 | + * STRING tag and length. | |
| 86 | + * | |
| 87 | + * @return a copy of the extension's value, or <code>null</code> if no | |
| 88 | + * extension value is present. | |
| 89 | + */ | |
| 90 | + byte[] getValue(); | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * Generates the extension's DER encoding and writes it to the output | |
| 94 | + * stream. | |
| 95 | + * | |
| 96 | + * @param out the output stream | |
| 97 | + * @exception IOException on encoding or output error. | |
| 98 | + * @exception NullPointerException if <code>out</code> is <code>null</code>. | |
| 99 | + */ | |
| 100 | + void encode(OutputStream out) throws IOException; | |
| 101 | +} | |
Binary file not shown.
| @@ -0,0 +1,149 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * Parameters used as input for the LDAP <code>CertStore</code> algorithm. | |
| 30 | + * <p> | |
| 31 | + * This class is used to provide necessary configuration parameters (server | |
| 32 | + * name and port number) to implementations of the LDAP <code>CertStore</code> | |
| 33 | + * algorithm. | |
| 34 | + * <p> | |
| 35 | + * <b>Concurrent Access</b> | |
| 36 | + * <p> | |
| 37 | + * Unless otherwise specified, the methods defined in this class are not | |
| 38 | + * thread-safe. Multiple threads that need to access a single | |
| 39 | + * object concurrently should synchronize amongst themselves and | |
| 40 | + * provide the necessary locking. Multiple threads each manipulating | |
| 41 | + * separate objects need not synchronize. | |
| 42 | + * | |
| 43 | + * @since 1.4 | |
| 44 | + * @author Steve Hanna | |
| 45 | + * @see CertStore | |
| 46 | + */ | |
| 47 | +public class LDAPCertStoreParameters implements CertStoreParameters { | |
| 48 | + | |
| 49 | + private static final int LDAP_DEFAULT_PORT = 389; | |
| 50 | + | |
| 51 | + /** | |
| 52 | + * the port number of the LDAP server | |
| 53 | + */ | |
| 54 | + private int port; | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * the DNS name of the LDAP server | |
| 58 | + */ | |
| 59 | + private String serverName; | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Creates an instance of <code>LDAPCertStoreParameters</code> with the | |
| 63 | + * specified parameter values. | |
| 64 | + * | |
| 65 | + * @param serverName the DNS name of the LDAP server | |
| 66 | + * @param port the port number of the LDAP server | |
| 67 | + * @exception NullPointerException if <code>serverName</code> is | |
| 68 | + * <code>null</code> | |
| 69 | + */ | |
| 70 | + public LDAPCertStoreParameters(String serverName, int port) { | |
| 71 | + if (serverName == null) | |
| 72 | + throw new NullPointerException(); | |
| 73 | + this.serverName = serverName; | |
| 74 | + this.port = port; | |
| 75 | + } | |
| 76 | + | |
| 77 | + /** | |
| 78 | + * Creates an instance of <code>LDAPCertStoreParameters</code> with the | |
| 79 | + * specified server name and a default port of 389. | |
| 80 | + * | |
| 81 | + * @param serverName the DNS name of the LDAP server | |
| 82 | + * @exception NullPointerException if <code>serverName</code> is | |
| 83 | + * <code>null</code> | |
| 84 | + */ | |
| 85 | + public LDAPCertStoreParameters(String serverName) { | |
| 86 | + this(serverName, LDAP_DEFAULT_PORT); | |
| 87 | + } | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * Creates an instance of <code>LDAPCertStoreParameters</code> with the | |
| 91 | + * default parameter values (server name "localhost", port 389). | |
| 92 | + */ | |
| 93 | + public LDAPCertStoreParameters() { | |
| 94 | + this("localhost", LDAP_DEFAULT_PORT); | |
| 95 | + } | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * Returns the DNS name of the LDAP server. | |
| 99 | + * | |
| 100 | + * @return the name (not <code>null</code>) | |
| 101 | + */ | |
| 102 | + public String getServerName() { | |
| 103 | + return serverName; | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * Returns the port number of the LDAP server. | |
| 108 | + * | |
| 109 | + * @return the port number | |
| 110 | + */ | |
| 111 | + public int getPort() { | |
| 112 | + return port; | |
| 113 | + } | |
| 114 | + | |
| 115 | + /** | |
| 116 | + * Returns a copy of this object. Changes to the copy will not affect | |
| 117 | + * the original and vice versa. | |
| 118 | + * <p> | |
| 119 | + * Note: this method currently performs a shallow copy of the object | |
| 120 | + * (simply calls <code>Object.clone()</code>). This may be changed in a | |
| 121 | + * future revision to perform a deep copy if new parameters are added | |
| 122 | + * that should not be shared. | |
| 123 | + * | |
| 124 | + * @return the copy | |
| 125 | + */ | |
| 126 | + public Object clone() { | |
| 127 | + try { | |
| 128 | + return super.clone(); | |
| 129 | + } catch (CloneNotSupportedException e) { | |
| 130 | + /* Cannot happen */ | |
| 131 | + throw new InternalError(e.toString()); | |
| 132 | + } | |
| 133 | + } | |
| 134 | + | |
| 135 | + /** | |
| 136 | + * Returns a formatted string describing the parameters. | |
| 137 | + * | |
| 138 | + * @return a formatted string describing the parameters | |
| 139 | + */ | |
| 140 | + public String toString() { | |
| 141 | + StringBuffer sb = new StringBuffer(); | |
| 142 | + sb.append("LDAPCertStoreParameters: [\n"); | |
| 143 | + | |
| 144 | + sb.append(" serverName: " + serverName + "\n"); | |
| 145 | + sb.append(" port: " + port + "\n"); | |
| 146 | + sb.append("]"); | |
| 147 | + return sb.toString(); | |
| 148 | + } | |
| 149 | +} | |
Binary file not shown.
| @@ -0,0 +1,199 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.KeyStore; | |
| 29 | +import java.security.KeyStoreException; | |
| 30 | +import java.security.InvalidAlgorithmParameterException; | |
| 31 | +import java.security.InvalidParameterException; | |
| 32 | +import java.util.Set; | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * Parameters used as input for the PKIX <code>CertPathBuilder</code> | |
| 36 | + * algorithm. | |
| 37 | + * <p> | |
| 38 | + * A PKIX <code>CertPathBuilder</code> uses these parameters to {@link | |
| 39 | + * CertPathBuilder#build build} a <code>CertPath</code> which has been | |
| 40 | + * validated according to the PKIX certification path validation algorithm. | |
| 41 | + * | |
| 42 | + * <p>To instantiate a <code>PKIXBuilderParameters</code> object, an | |
| 43 | + * application must specify one or more <i>most-trusted CAs</i> as defined by | |
| 44 | + * the PKIX certification path validation algorithm. The most-trusted CA | |
| 45 | + * can be specified using one of two constructors. An application | |
| 46 | + * can call {@link #PKIXBuilderParameters(Set, CertSelector) | |
| 47 | + * PKIXBuilderParameters(Set, CertSelector)}, specifying a | |
| 48 | + * <code>Set</code> of <code>TrustAnchor</code> objects, each of which | |
| 49 | + * identifies a most-trusted CA. Alternatively, an application can call | |
| 50 | + * {@link #PKIXBuilderParameters(KeyStore, CertSelector) | |
| 51 | + * PKIXBuilderParameters(KeyStore, CertSelector)}, specifying a | |
| 52 | + * <code>KeyStore</code> instance containing trusted certificate entries, each | |
| 53 | + * of which will be considered as a most-trusted CA. | |
| 54 | + * | |
| 55 | + * <p>In addition, an application must specify constraints on the target | |
| 56 | + * certificate that the <code>CertPathBuilder</code> will attempt | |
| 57 | + * to build a path to. The constraints are specified as a | |
| 58 | + * <code>CertSelector</code> object. These constraints should provide the | |
| 59 | + * <code>CertPathBuilder</code> with enough search criteria to find the target | |
| 60 | + * certificate. Minimal criteria for an <code>X509Certificate</code> usually | |
| 61 | + * include the subject name and/or one or more subject alternative names. | |
| 62 | + * If enough criteria is not specified, the <code>CertPathBuilder</code> | |
| 63 | + * may throw a <code>CertPathBuilderException</code>. | |
| 64 | + * <p> | |
| 65 | + * <b>Concurrent Access</b> | |
| 66 | + * <p> | |
| 67 | + * Unless otherwise specified, the methods defined in this class are not | |
| 68 | + * thread-safe. Multiple threads that need to access a single | |
| 69 | + * object concurrently should synchronize amongst themselves and | |
| 70 | + * provide the necessary locking. Multiple threads each manipulating | |
| 71 | + * separate objects need not synchronize. | |
| 72 | + * | |
| 73 | + * @see CertPathBuilder | |
| 74 | + * | |
| 75 | + * @since 1.4 | |
| 76 | + * @author Sean Mullan | |
| 77 | + */ | |
| 78 | +public class PKIXBuilderParameters extends PKIXParameters { | |
| 79 | + | |
| 80 | + private int maxPathLength = 5; | |
| 81 | + | |
| 82 | + /** | |
| 83 | + * Creates an instance of <code>PKIXBuilderParameters</code> with | |
| 84 | + * the specified <code>Set</code> of most-trusted CAs. | |
| 85 | + * Each element of the set is a {@link TrustAnchor TrustAnchor}. | |
| 86 | + * | |
| 87 | + * <p>Note that the <code>Set</code> is copied to protect against | |
| 88 | + * subsequent modifications. | |
| 89 | + * | |
| 90 | + * @param trustAnchors a <code>Set</code> of <code>TrustAnchor</code>s | |
| 91 | + * @param targetConstraints a <code>CertSelector</code> specifying the | |
| 92 | + * constraints on the target certificate | |
| 93 | + * @throws InvalidAlgorithmParameterException if <code>trustAnchors</code> | |
| 94 | + * is empty <code>(trustAnchors.isEmpty() == true)</code> | |
| 95 | + * @throws NullPointerException if <code>trustAnchors</code> is | |
| 96 | + * <code>null</code> | |
| 97 | + * @throws ClassCastException if any of the elements of | |
| 98 | + * <code>trustAnchors</code> are not of type | |
| 99 | + * <code>java.security.cert.TrustAnchor</code> | |
| 100 | + */ | |
| 101 | + public PKIXBuilderParameters(Set<TrustAnchor> trustAnchors, CertSelector | |
| 102 | + targetConstraints) throws InvalidAlgorithmParameterException | |
| 103 | + { | |
| 104 | + super(trustAnchors); | |
| 105 | + setTargetCertConstraints(targetConstraints); | |
| 106 | + } | |
| 107 | + | |
| 108 | + /** | |
| 109 | + * Creates an instance of <code>PKIXBuilderParameters</code> that | |
| 110 | + * populates the set of most-trusted CAs from the trusted | |
| 111 | + * certificate entries contained in the specified <code>KeyStore</code>. | |
| 112 | + * Only keystore entries that contain trusted <code>X509Certificate</code>s | |
| 113 | + * are considered; all other certificate types are ignored. | |
| 114 | + * | |
| 115 | + * @param keystore a <code>KeyStore</code> from which the set of | |
| 116 | + * most-trusted CAs will be populated | |
| 117 | + * @param targetConstraints a <code>CertSelector</code> specifying the | |
| 118 | + * constraints on the target certificate | |
| 119 | + * @throws KeyStoreException if <code>keystore</code> has not been | |
| 120 | + * initialized | |
| 121 | + * @throws InvalidAlgorithmParameterException if <code>keystore</code> does | |
| 122 | + * not contain at least one trusted certificate entry | |
| 123 | + * @throws NullPointerException if <code>keystore</code> is | |
| 124 | + * <code>null</code> | |
| 125 | + */ | |
| 126 | + public PKIXBuilderParameters(KeyStore keystore, | |
| 127 | + CertSelector targetConstraints) | |
| 128 | + throws KeyStoreException, InvalidAlgorithmParameterException | |
| 129 | + { | |
| 130 | + super(keystore); | |
| 131 | + setTargetCertConstraints(targetConstraints); | |
| 132 | + } | |
| 133 | + | |
| 134 | + /** | |
| 135 | + * Sets the value of the maximum number of non-self-issued intermediate | |
| 136 | + * certificates that may exist in a certification path. A certificate | |
| 137 | + * is self-issued if the DNs that appear in the subject and issuer | |
| 138 | + * fields are identical and are not empty. Note that the last certificate | |
| 139 | + * in a certification path is not an intermediate certificate, and is not | |
| 140 | + * included in this limit. Usually the last certificate is an end entity | |
| 141 | + * certificate, but it can be a CA certificate. A PKIX | |
| 142 | + * <code>CertPathBuilder</code> instance must not build | |
| 143 | + * paths longer than the length specified. | |
| 144 | + * | |
| 145 | + * <p> A value of 0 implies that the path can only contain | |
| 146 | + * a single certificate. A value of -1 implies that the | |
| 147 | + * path length is unconstrained (i.e. there is no maximum). | |
| 148 | + * The default maximum path length, if not specified, is 5. | |
| 149 | + * Setting a value less than -1 will cause an exception to be thrown. | |
| 150 | + * | |
| 151 | + * <p> If any of the CA certificates contain the | |
| 152 | + * <code>BasicConstraintsExtension</code>, the value of the | |
| 153 | + * <code>pathLenConstraint</code> field of the extension overrides | |
| 154 | + * the maximum path length parameter whenever the result is a | |
| 155 | + * certification path of smaller length. | |
| 156 | + * | |
| 157 | + * @param maxPathLength the maximum number of non-self-issued intermediate | |
| 158 | + * certificates that may exist in a certification path | |
| 159 | + * @throws InvalidParameterException if <code>maxPathLength</code> is set | |
| 160 | + * to a value less than -1 | |
| 161 | + * | |
| 162 | + * @see #getMaxPathLength | |
| 163 | + */ | |
| 164 | + public void setMaxPathLength(int maxPathLength) { | |
| 165 | + if (maxPathLength < -1) { | |
| 166 | + throw new InvalidParameterException("the maximum path " | |
| 167 | + + "length parameter can not be less than -1"); | |
| 168 | + } | |
| 169 | + this.maxPathLength = maxPathLength; | |
| 170 | + } | |
| 171 | + | |
| 172 | + /** | |
| 173 | + * Returns the value of the maximum number of intermediate non-self-issued | |
| 174 | + * certificates that may exist in a certification path. See | |
| 175 | + * the {@link #setMaxPathLength} method for more details. | |
| 176 | + * | |
| 177 | + * @return the maximum number of non-self-issued intermediate certificates | |
| 178 | + * that may exist in a certification path, or -1 if there is no limit | |
| 179 | + * | |
| 180 | + * @see #setMaxPathLength | |
| 181 | + */ | |
| 182 | + public int getMaxPathLength() { | |
| 183 | + return maxPathLength; | |
| 184 | + } | |
| 185 | + | |
| 186 | + /** | |
| 187 | + * Returns a formatted string describing the parameters. | |
| 188 | + * | |
| 189 | + * @return a formatted string describing the parameters | |
| 190 | + */ | |
| 191 | + public String toString() { | |
| 192 | + StringBuffer sb = new StringBuffer(); | |
| 193 | + sb.append("[\n"); | |
| 194 | + sb.append(super.toString()); | |
| 195 | + sb.append(" Maximum Path Length: " + maxPathLength + "\n"); | |
| 196 | + sb.append("]\n"); | |
| 197 | + return sb.toString(); | |
| 198 | + } | |
| 199 | +} | |
Binary file not shown.
| @@ -0,0 +1,119 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.PublicKey; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * This class represents the successful result of the PKIX certification | |
| 32 | + * path builder algorithm. All certification paths that are built and | |
| 33 | + * returned using this algorithm are also validated according to the PKIX | |
| 34 | + * certification path validation algorithm. | |
| 35 | + * | |
| 36 | + * <p>Instances of <code>PKIXCertPathBuilderResult</code> are returned by | |
| 37 | + * the <code>build</code> method of <code>CertPathBuilder</code> | |
| 38 | + * objects implementing the PKIX algorithm. | |
| 39 | + * | |
| 40 | + * <p>All <code>PKIXCertPathBuilderResult</code> objects contain the | |
| 41 | + * certification path constructed by the build algorithm, the | |
| 42 | + * valid policy tree and subject public key resulting from the build | |
| 43 | + * algorithm, and a <code>TrustAnchor</code> describing the certification | |
| 44 | + * authority (CA) that served as a trust anchor for the certification path. | |
| 45 | + * <p> | |
| 46 | + * <b>Concurrent Access</b> | |
| 47 | + * <p> | |
| 48 | + * Unless otherwise specified, the methods defined in this class are not | |
| 49 | + * thread-safe. Multiple threads that need to access a single | |
| 50 | + * object concurrently should synchronize amongst themselves and | |
| 51 | + * provide the necessary locking. Multiple threads each manipulating | |
| 52 | + * separate objects need not synchronize. | |
| 53 | + * | |
| 54 | + * @see CertPathBuilderResult | |
| 55 | + * | |
| 56 | + * @since 1.4 | |
| 57 | + * @author Anne Anderson | |
| 58 | + */ | |
| 59 | +public class PKIXCertPathBuilderResult extends PKIXCertPathValidatorResult | |
| 60 | + implements CertPathBuilderResult { | |
| 61 | + | |
| 62 | + private CertPath certPath; | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Creates an instance of <code>PKIXCertPathBuilderResult</code> | |
| 66 | + * containing the specified parameters. | |
| 67 | + * | |
| 68 | + * @param certPath the validated <code>CertPath</code> | |
| 69 | + * @param trustAnchor a <code>TrustAnchor</code> describing the CA that | |
| 70 | + * served as a trust anchor for the certification path | |
| 71 | + * @param policyTree the immutable valid policy tree, or <code>null</code> | |
| 72 | + * if there are no valid policies | |
| 73 | + * @param subjectPublicKey the public key of the subject | |
| 74 | + * @throws NullPointerException if the <code>certPath</code>, | |
| 75 | + * <code>trustAnchor</code> or <code>subjectPublicKey</code> parameters | |
| 76 | + * are <code>null</code> | |
| 77 | + */ | |
| 78 | + public PKIXCertPathBuilderResult(CertPath certPath, | |
| 79 | + TrustAnchor trustAnchor, PolicyNode policyTree, | |
| 80 | + PublicKey subjectPublicKey) | |
| 81 | + { | |
| 82 | + super(trustAnchor, policyTree, subjectPublicKey); | |
| 83 | + if (certPath == null) | |
| 84 | + throw new NullPointerException("certPath must be non-null"); | |
| 85 | + this.certPath = certPath; | |
| 86 | + } | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * Returns the built and validated certification path. The | |
| 90 | + * <code>CertPath</code> object does not include the trust anchor. | |
| 91 | + * Instead, use the {@link #getTrustAnchor() getTrustAnchor()} method to | |
| 92 | + * obtain the <code>TrustAnchor</code> that served as the trust anchor | |
| 93 | + * for the certification path. | |
| 94 | + * | |
| 95 | + * @return the built and validated <code>CertPath</code> (never | |
| 96 | + * <code>null</code>) | |
| 97 | + */ | |
| 98 | + public CertPath getCertPath() { | |
| 99 | + return certPath; | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Return a printable representation of this | |
| 104 | + * <code>PKIXCertPathBuilderResult</code>. | |
| 105 | + * | |
| 106 | + * @return a <code>String</code> describing the contents of this | |
| 107 | + * <code>PKIXCertPathBuilderResult</code> | |
| 108 | + */ | |
| 109 | + public String toString() { | |
| 110 | + StringBuffer sb = new StringBuffer(); | |
| 111 | + sb.append("PKIXCertPathBuilderResult: [\n"); | |
| 112 | + sb.append(" Certification Path: " + certPath + "\n"); | |
| 113 | + sb.append(" Trust Anchor: " + getTrustAnchor().toString() + "\n"); | |
| 114 | + sb.append(" Policy Tree: " + String.valueOf(getPolicyTree()) + "\n"); | |
| 115 | + sb.append(" Subject Public Key: " + getPublicKey() + "\n"); | |
| 116 | + sb.append("]"); | |
| 117 | + return sb.toString(); | |
| 118 | + } | |
| 119 | +} | |
Binary file not shown.
| @@ -0,0 +1,181 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.util.Collection; | |
| 29 | +import java.util.Set; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An abstract class that performs one or more checks on an | |
| 33 | + * <code>X509Certificate</code>. | |
| 34 | + * | |
| 35 | + * <p>A concrete implementation of the <code>PKIXCertPathChecker</code> class | |
| 36 | + * can be created to extend the PKIX certification path validation algorithm. | |
| 37 | + * For example, an implementation may check for and process a critical private | |
| 38 | + * extension of each certificate in a certification path. | |
| 39 | + * | |
| 40 | + * <p>Instances of <code>PKIXCertPathChecker</code> are passed as parameters | |
| 41 | + * using the {@link PKIXParameters#setCertPathCheckers setCertPathCheckers} | |
| 42 | + * or {@link PKIXParameters#addCertPathChecker addCertPathChecker} methods | |
| 43 | + * of the <code>PKIXParameters</code> and <code>PKIXBuilderParameters</code> | |
| 44 | + * class. Each of the <code>PKIXCertPathChecker</code>s {@link #check check} | |
| 45 | + * methods will be called, in turn, for each certificate processed by a PKIX | |
| 46 | + * <code>CertPathValidator</code> or <code>CertPathBuilder</code> | |
| 47 | + * implementation. | |
| 48 | + * | |
| 49 | + * <p>A <code>PKIXCertPathChecker</code> may be called multiple times on | |
| 50 | + * successive certificates in a certification path. Concrete subclasses | |
| 51 | + * are expected to maintain any internal state that may be necessary to | |
| 52 | + * check successive certificates. The {@link #init init} method is used | |
| 53 | + * to initialize the internal state of the checker so that the certificates | |
| 54 | + * of a new certification path may be checked. A stateful implementation | |
| 55 | + * <b>must</b> override the {@link #clone clone} method if necessary in | |
| 56 | + * order to allow a PKIX <code>CertPathBuilder</code> to efficiently | |
| 57 | + * backtrack and try other paths. In these situations, the | |
| 58 | + * <code>CertPathBuilder</code> is able to restore prior path validation | |
| 59 | + * states by restoring the cloned <code>PKIXCertPathChecker</code>s. | |
| 60 | + * | |
| 61 | + * <p>The order in which the certificates are presented to the | |
| 62 | + * <code>PKIXCertPathChecker</code> may be either in the forward direction | |
| 63 | + * (from target to most-trusted CA) or in the reverse direction (from | |
| 64 | + * most-trusted CA to target). A <code>PKIXCertPathChecker</code> implementation | |
| 65 | + * <b>must</b> support reverse checking (the ability to perform its checks when | |
| 66 | + * it is presented with certificates in the reverse direction) and <b>may</b> | |
| 67 | + * support forward checking (the ability to perform its checks when it is | |
| 68 | + * presented with certificates in the forward direction). The | |
| 69 | + * {@link #isForwardCheckingSupported isForwardCheckingSupported} method | |
| 70 | + * indicates whether forward checking is supported. | |
| 71 | + * <p> | |
| 72 | + * Additional input parameters required for executing the check may be | |
| 73 | + * specified through constructors of concrete implementations of this class. | |
| 74 | + * <p> | |
| 75 | + * <b>Concurrent Access</b> | |
| 76 | + * <p> | |
| 77 | + * Unless otherwise specified, the methods defined in this class are not | |
| 78 | + * thread-safe. Multiple threads that need to access a single | |
| 79 | + * object concurrently should synchronize amongst themselves and | |
| 80 | + * provide the necessary locking. Multiple threads each manipulating | |
| 81 | + * separate objects need not synchronize. | |
| 82 | + * | |
| 83 | + * @see PKIXParameters | |
| 84 | + * @see PKIXBuilderParameters | |
| 85 | + * | |
| 86 | + * @since 1.4 | |
| 87 | + * @author Yassir Elley | |
| 88 | + * @author Sean Mullan | |
| 89 | + */ | |
| 90 | +public abstract class PKIXCertPathChecker implements Cloneable { | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * Default constructor. | |
| 94 | + */ | |
| 95 | + protected PKIXCertPathChecker() {} | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * Initializes the internal state of this <code>PKIXCertPathChecker</code>. | |
| 99 | + * <p> | |
| 100 | + * The <code>forward</code> flag specifies the order that | |
| 101 | + * certificates will be passed to the {@link #check check} method | |
| 102 | + * (forward or reverse). A <code>PKIXCertPathChecker</code> <b>must</b> | |
| 103 | + * support reverse checking and <b>may</b> support forward checking. | |
| 104 | + * | |
| 105 | + * @param forward the order that certificates are presented to | |
| 106 | + * the <code>check</code> method. If <code>true</code>, certificates | |
| 107 | + * are presented from target to most-trusted CA (forward); if | |
| 108 | + * <code>false</code>, from most-trusted CA to target (reverse). | |
| 109 | + * @throws CertPathValidatorException if this | |
| 110 | + * <code>PKIXCertPathChecker</code> is unable to check certificates in | |
| 111 | + * the specified order; it should never be thrown if the forward flag | |
| 112 | + * is false since reverse checking must be supported | |
| 113 | + */ | |
| 114 | + public abstract void init(boolean forward) | |
| 115 | + throws CertPathValidatorException; | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * Indicates if forward checking is supported. Forward checking refers | |
| 119 | + * to the ability of the <code>PKIXCertPathChecker</code> to perform | |
| 120 | + * its checks when certificates are presented to the <code>check</code> | |
| 121 | + * method in the forward direction (from target to most-trusted CA). | |
| 122 | + * | |
| 123 | + * @return <code>true</code> if forward checking is supported, | |
| 124 | + * <code>false</code> otherwise | |
| 125 | + */ | |
| 126 | + public abstract boolean isForwardCheckingSupported(); | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Returns an immutable <code>Set</code> of X.509 certificate extensions | |
| 130 | + * that this <code>PKIXCertPathChecker</code> supports (i.e. recognizes, is | |
| 131 | + * able to process), or <code>null</code> if no extensions are supported. | |
| 132 | + * <p> | |
| 133 | + * Each element of the set is a <code>String</code> representing the | |
| 134 | + * Object Identifier (OID) of the X.509 extension that is supported. | |
| 135 | + * The OID is represented by a set of nonnegative integers separated by | |
| 136 | + * periods. | |
| 137 | + * <p> | |
| 138 | + * All X.509 certificate extensions that a <code>PKIXCertPathChecker</code> | |
| 139 | + * might possibly be able to process should be included in the set. | |
| 140 | + * | |
| 141 | + * @return an immutable <code>Set</code> of X.509 extension OIDs (in | |
| 142 | + * <code>String</code> format) supported by this | |
| 143 | + * <code>PKIXCertPathChecker</code>, or <code>null</code> if no | |
| 144 | + * extensions are supported | |
| 145 | + */ | |
| 146 | + public abstract Set<String> getSupportedExtensions(); | |
| 147 | + | |
| 148 | + /** | |
| 149 | + * Performs the check(s) on the specified certificate using its internal | |
| 150 | + * state and removes any critical extensions that it processes from the | |
| 151 | + * specified collection of OID strings that represent the unresolved | |
| 152 | + * critical extensions. The certificates are presented in the order | |
| 153 | + * specified by the <code>init</code> method. | |
| 154 | + * | |
| 155 | + * @param cert the <code>Certificate</code> to be checked | |
| 156 | + * @param unresolvedCritExts a <code>Collection</code> of OID strings | |
| 157 | + * representing the current set of unresolved critical extensions | |
| 158 | + * @exception CertPathValidatorException if the specified certificate does | |
| 159 | + * not pass the check | |
| 160 | + */ | |
| 161 | + public abstract void check(Certificate cert, | |
| 162 | + Collection<String> unresolvedCritExts) | |
| 163 | + throws CertPathValidatorException; | |
| 164 | + | |
| 165 | + /** | |
| 166 | + * Returns a clone of this object. Calls the <code>Object.clone()</code> | |
| 167 | + * method. | |
| 168 | + * All subclasses which maintain state must support and | |
| 169 | + * override this method, if necessary. | |
| 170 | + * | |
| 171 | + * @return a copy of this <code>PKIXCertPathChecker</code> | |
| 172 | + */ | |
| 173 | + public Object clone() { | |
| 174 | + try { | |
| 175 | + return super.clone(); | |
| 176 | + } catch (CloneNotSupportedException e) { | |
| 177 | + /* Cannot happen */ | |
| 178 | + throw new InternalError(e.toString()); | |
| 179 | + } | |
| 180 | + } | |
| 181 | +} | |
Binary file not shown.
| @@ -0,0 +1,159 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.PublicKey; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * This class represents the successful result of the PKIX certification | |
| 32 | + * path validation algorithm. | |
| 33 | + * | |
| 34 | + * <p>Instances of <code>PKIXCertPathValidatorResult</code> are returned by the | |
| 35 | + * {@link CertPathValidator#validate validate} method of | |
| 36 | + * <code>CertPathValidator</code> objects implementing the PKIX algorithm. | |
| 37 | + * | |
| 38 | + * <p> All <code>PKIXCertPathValidatorResult</code> objects contain the | |
| 39 | + * valid policy tree and subject public key resulting from the | |
| 40 | + * validation algorithm, as well as a <code>TrustAnchor</code> describing | |
| 41 | + * the certification authority (CA) that served as a trust anchor for the | |
| 42 | + * certification path. | |
| 43 | + * <p> | |
| 44 | + * <b>Concurrent Access</b> | |
| 45 | + * <p> | |
| 46 | + * Unless otherwise specified, the methods defined in this class are not | |
| 47 | + * thread-safe. Multiple threads that need to access a single | |
| 48 | + * object concurrently should synchronize amongst themselves and | |
| 49 | + * provide the necessary locking. Multiple threads each manipulating | |
| 50 | + * separate objects need not synchronize. | |
| 51 | + * | |
| 52 | + * @see CertPathValidatorResult | |
| 53 | + * | |
| 54 | + * @since 1.4 | |
| 55 | + * @author Yassir Elley | |
| 56 | + * @author Sean Mullan | |
| 57 | + */ | |
| 58 | +public class PKIXCertPathValidatorResult implements CertPathValidatorResult { | |
| 59 | + | |
| 60 | + private TrustAnchor trustAnchor; | |
| 61 | + private PolicyNode policyTree; | |
| 62 | + private PublicKey subjectPublicKey; | |
| 63 | + | |
| 64 | + /** | |
| 65 | + * Creates an instance of <code>PKIXCertPathValidatorResult</code> | |
| 66 | + * containing the specified parameters. | |
| 67 | + * | |
| 68 | + * @param trustAnchor a <code>TrustAnchor</code> describing the CA that | |
| 69 | + * served as a trust anchor for the certification path | |
| 70 | + * @param policyTree the immutable valid policy tree, or <code>null</code> | |
| 71 | + * if there are no valid policies | |
| 72 | + * @param subjectPublicKey the public key of the subject | |
| 73 | + * @throws NullPointerException if the <code>subjectPublicKey</code> or | |
| 74 | + * <code>trustAnchor</code> parameters are <code>null</code> | |
| 75 | + */ | |
| 76 | + public PKIXCertPathValidatorResult(TrustAnchor trustAnchor, | |
| 77 | + PolicyNode policyTree, PublicKey subjectPublicKey) | |
| 78 | + { | |
| 79 | + if (subjectPublicKey == null) | |
| 80 | + throw new NullPointerException("subjectPublicKey must be non-null"); | |
| 81 | + if (trustAnchor == null) | |
| 82 | + throw new NullPointerException("trustAnchor must be non-null"); | |
| 83 | + this.trustAnchor = trustAnchor; | |
| 84 | + this.policyTree = policyTree; | |
| 85 | + this.subjectPublicKey = subjectPublicKey; | |
| 86 | + } | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * Returns the <code>TrustAnchor</code> describing the CA that served | |
| 90 | + * as a trust anchor for the certification path. | |
| 91 | + * | |
| 92 | + * @return the <code>TrustAnchor</code> (never <code>null</code>) | |
| 93 | + */ | |
| 94 | + public TrustAnchor getTrustAnchor() { | |
| 95 | + return trustAnchor; | |
| 96 | + } | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Returns the root node of the valid policy tree resulting from the | |
| 100 | + * PKIX certification path validation algorithm. The | |
| 101 | + * <code>PolicyNode</code> object that is returned and any objects that | |
| 102 | + * it returns through public methods are immutable. | |
| 103 | + * | |
| 104 | + * <p>Most applications will not need to examine the valid policy tree. | |
| 105 | + * They can achieve their policy processing goals by setting the | |
| 106 | + * policy-related parameters in <code>PKIXParameters</code>. However, more | |
| 107 | + * sophisticated applications, especially those that process policy | |
| 108 | + * qualifiers, may need to traverse the valid policy tree using the | |
| 109 | + * {@link PolicyNode#getParent PolicyNode.getParent} and | |
| 110 | + * {@link PolicyNode#getChildren PolicyNode.getChildren} methods. | |
| 111 | + * | |
| 112 | + * @return the root node of the valid policy tree, or <code>null</code> | |
| 113 | + * if there are no valid policies | |
| 114 | + */ | |
| 115 | + public PolicyNode getPolicyTree() { | |
| 116 | + return policyTree; | |
| 117 | + } | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * Returns the public key of the subject (target) of the certification | |
| 121 | + * path, including any inherited public key parameters if applicable. | |
| 122 | + * | |
| 123 | + * @return the public key of the subject (never <code>null</code>) | |
| 124 | + */ | |
| 125 | + public PublicKey getPublicKey() { | |
| 126 | + return subjectPublicKey; | |
| 127 | + } | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Returns a copy of this object. | |
| 131 | + * | |
| 132 | + * @return the copy | |
| 133 | + */ | |
| 134 | + public Object clone() { | |
| 135 | + try { | |
| 136 | + return super.clone(); | |
| 137 | + } catch (CloneNotSupportedException e) { | |
| 138 | + /* Cannot happen */ | |
| 139 | + throw new InternalError(e.toString()); | |
| 140 | + } | |
| 141 | + } | |
| 142 | + | |
| 143 | + /** | |
| 144 | + * Return a printable representation of this | |
| 145 | + * <code>PKIXCertPathValidatorResult</code>. | |
| 146 | + * | |
| 147 | + * @return a <code>String</code> describing the contents of this | |
| 148 | + * <code>PKIXCertPathValidatorResult</code> | |
| 149 | + */ | |
| 150 | + public String toString() { | |
| 151 | + StringBuffer sb = new StringBuffer(); | |
| 152 | + sb.append("PKIXCertPathValidatorResult: [\n"); | |
| 153 | + sb.append(" Trust Anchor: " + trustAnchor.toString() + "\n"); | |
| 154 | + sb.append(" Policy Tree: " + String.valueOf(policyTree) + "\n"); | |
| 155 | + sb.append(" Subject Public Key: " + subjectPublicKey + "\n"); | |
| 156 | + sb.append("]"); | |
| 157 | + return sb.toString(); | |
| 158 | + } | |
| 159 | +} | |
Binary file not shown.
| @@ -0,0 +1,736 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.InvalidAlgorithmParameterException; | |
| 29 | +import java.security.KeyStore; | |
| 30 | +import java.security.KeyStoreException; | |
| 31 | +import java.util.ArrayList; | |
| 32 | +import java.util.Collections; | |
| 33 | +import java.util.Date; | |
| 34 | +import java.util.Enumeration; | |
| 35 | +import java.util.HashSet; | |
| 36 | +import java.util.Iterator; | |
| 37 | +import java.util.List; | |
| 38 | +import java.util.Set; | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * Parameters used as input for the PKIX <code>CertPathValidator</code> | |
| 42 | + * algorithm. | |
| 43 | + * <p> | |
| 44 | + * A PKIX <code>CertPathValidator</code> uses these parameters to | |
| 45 | + * validate a <code>CertPath</code> according to the PKIX certification path | |
| 46 | + * validation algorithm. | |
| 47 | + * | |
| 48 | + * <p>To instantiate a <code>PKIXParameters</code> object, an | |
| 49 | + * application must specify one or more <i>most-trusted CAs</i> as defined by | |
| 50 | + * the PKIX certification path validation algorithm. The most-trusted CAs | |
| 51 | + * can be specified using one of two constructors. An application | |
| 52 | + * can call {@link #PKIXParameters(Set) PKIXParameters(Set)}, | |
| 53 | + * specifying a <code>Set</code> of <code>TrustAnchor</code> objects, each | |
| 54 | + * of which identify a most-trusted CA. Alternatively, an application can call | |
| 55 | + * {@link #PKIXParameters(KeyStore) PKIXParameters(KeyStore)}, specifying a | |
| 56 | + * <code>KeyStore</code> instance containing trusted certificate entries, each | |
| 57 | + * of which will be considered as a most-trusted CA. | |
| 58 | + * <p> | |
| 59 | + * Once a <code>PKIXParameters</code> object has been created, other parameters | |
| 60 | + * can be specified (by calling {@link #setInitialPolicies setInitialPolicies} | |
| 61 | + * or {@link #setDate setDate}, for instance) and then the | |
| 62 | + * <code>PKIXParameters</code> is passed along with the <code>CertPath</code> | |
| 63 | + * to be validated to {@link CertPathValidator#validate | |
| 64 | + * CertPathValidator.validate}. | |
| 65 | + * <p> | |
| 66 | + * Any parameter that is not set (or is set to <code>null</code>) will | |
| 67 | + * be set to the default value for that parameter. The default value for the | |
| 68 | + * <code>date</code> parameter is <code>null</code>, which indicates | |
| 69 | + * the current time when the path is validated. The default for the | |
| 70 | + * remaining parameters is the least constrained. | |
| 71 | + * <p> | |
| 72 | + * <b>Concurrent Access</b> | |
| 73 | + * <p> | |
| 74 | + * Unless otherwise specified, the methods defined in this class are not | |
| 75 | + * thread-safe. Multiple threads that need to access a single | |
| 76 | + * object concurrently should synchronize amongst themselves and | |
| 77 | + * provide the necessary locking. Multiple threads each manipulating | |
| 78 | + * separate objects need not synchronize. | |
| 79 | + * | |
| 80 | + * @see CertPathValidator | |
| 81 | + * | |
| 82 | + * @since 1.4 | |
| 83 | + * @author Sean Mullan | |
| 84 | + * @author Yassir Elley | |
| 85 | + */ | |
| 86 | +public class PKIXParameters implements CertPathParameters { | |
| 87 | + | |
| 88 | + private Set<TrustAnchor> unmodTrustAnchors; | |
| 89 | + private Date date; | |
| 90 | + private List<PKIXCertPathChecker> certPathCheckers; | |
| 91 | + private String sigProvider; | |
| 92 | + private boolean revocationEnabled = true; | |
| 93 | + private Set<String> unmodInitialPolicies; | |
| 94 | + private boolean explicitPolicyRequired = false; | |
| 95 | + private boolean policyMappingInhibited = false; | |
| 96 | + private boolean anyPolicyInhibited = false; | |
| 97 | + private boolean policyQualifiersRejected = true; | |
| 98 | + private List<CertStore> certStores; | |
| 99 | + private CertSelector certSelector; | |
| 100 | + | |
| 101 | + /** | |
| 102 | + * Creates an instance of <code>PKIXParameters</code> with the specified | |
| 103 | + * <code>Set</code> of most-trusted CAs. Each element of the | |
| 104 | + * set is a {@link TrustAnchor TrustAnchor}. | |
| 105 | + * <p> | |
| 106 | + * Note that the <code>Set</code> is copied to protect against | |
| 107 | + * subsequent modifications. | |
| 108 | + * | |
| 109 | + * @param trustAnchors a <code>Set</code> of <code>TrustAnchor</code>s | |
| 110 | + * @throws InvalidAlgorithmParameterException if the specified | |
| 111 | + * <code>Set</code> is empty <code>(trustAnchors.isEmpty() == true)</code> | |
| 112 | + * @throws NullPointerException if the specified <code>Set</code> is | |
| 113 | + * <code>null</code> | |
| 114 | + * @throws ClassCastException if any of the elements in the <code>Set</code> | |
| 115 | + * are not of type <code>java.security.cert.TrustAnchor</code> | |
| 116 | + */ | |
| 117 | + public PKIXParameters(Set<TrustAnchor> trustAnchors) | |
| 118 | + throws InvalidAlgorithmParameterException | |
| 119 | + { | |
| 120 | + setTrustAnchors(trustAnchors); | |
| 121 | + | |
| 122 | + this.unmodInitialPolicies = Collections.<String>emptySet(); | |
| 123 | + this.certPathCheckers = new ArrayList<PKIXCertPathChecker>(); | |
| 124 | + this.certStores = new ArrayList<CertStore>(); | |
| 125 | + } | |
| 126 | + | |
| 127 | + /** | |
| 128 | + * Creates an instance of <code>PKIXParameters</code> that | |
| 129 | + * populates the set of most-trusted CAs from the trusted | |
| 130 | + * certificate entries contained in the specified <code>KeyStore</code>. | |
| 131 | + * Only keystore entries that contain trusted <code>X509Certificates</code> | |
| 132 | + * are considered; all other certificate types are ignored. | |
| 133 | + * | |
| 134 | + * @param keystore a <code>KeyStore</code> from which the set of | |
| 135 | + * most-trusted CAs will be populated | |
| 136 | + * @throws KeyStoreException if the keystore has not been initialized | |
| 137 | + * @throws InvalidAlgorithmParameterException if the keystore does | |
| 138 | + * not contain at least one trusted certificate entry | |
| 139 | + * @throws NullPointerException if the keystore is <code>null</code> | |
| 140 | + */ | |
| 141 | + public PKIXParameters(KeyStore keystore) | |
| 142 | + throws KeyStoreException, InvalidAlgorithmParameterException | |
| 143 | + { | |
| 144 | + if (keystore == null) | |
| 145 | + throw new NullPointerException("the keystore parameter must be " + | |
| 146 | + "non-null"); | |
| 147 | + Set<TrustAnchor> hashSet = new HashSet<TrustAnchor>(); | |
| 148 | + Enumeration<String> aliases = keystore.aliases(); | |
| 149 | + while (aliases.hasMoreElements()) { | |
| 150 | + String alias = aliases.nextElement(); | |
| 151 | + if (keystore.isCertificateEntry(alias)) { | |
| 152 | + Certificate cert = keystore.getCertificate(alias); | |
| 153 | + if (cert instanceof X509Certificate) | |
| 154 | + hashSet.add(new TrustAnchor((X509Certificate)cert, null)); | |
| 155 | + } | |
| 156 | + } | |
| 157 | + setTrustAnchors(hashSet); | |
| 158 | + this.unmodInitialPolicies = Collections.<String>emptySet(); | |
| 159 | + this.certPathCheckers = new ArrayList<PKIXCertPathChecker>(); | |
| 160 | + this.certStores = new ArrayList<CertStore>(); | |
| 161 | + } | |
| 162 | + | |
| 163 | + /** | |
| 164 | + * Returns an immutable <code>Set</code> of the most-trusted | |
| 165 | + * CAs. | |
| 166 | + * | |
| 167 | + * @return an immutable <code>Set</code> of <code>TrustAnchor</code>s | |
| 168 | + * (never <code>null</code>) | |
| 169 | + * | |
| 170 | + * @see #setTrustAnchors | |
| 171 | + */ | |
| 172 | + public Set<TrustAnchor> getTrustAnchors() { | |
| 173 | + return this.unmodTrustAnchors; | |
| 174 | + } | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Sets the <code>Set</code> of most-trusted CAs. | |
| 178 | + * <p> | |
| 179 | + * Note that the <code>Set</code> is copied to protect against | |
| 180 | + * subsequent modifications. | |
| 181 | + * | |
| 182 | + * @param trustAnchors a <code>Set</code> of <code>TrustAnchor</code>s | |
| 183 | + * @throws InvalidAlgorithmParameterException if the specified | |
| 184 | + * <code>Set</code> is empty <code>(trustAnchors.isEmpty() == true)</code> | |
| 185 | + * @throws NullPointerException if the specified <code>Set</code> is | |
| 186 | + * <code>null</code> | |
| 187 | + * @throws ClassCastException if any of the elements in the set | |
| 188 | + * are not of type <code>java.security.cert.TrustAnchor</code> | |
| 189 | + * | |
| 190 | + * @see #getTrustAnchors | |
| 191 | + */ | |
| 192 | + public void setTrustAnchors(Set<TrustAnchor> trustAnchors) | |
| 193 | + throws InvalidAlgorithmParameterException | |
| 194 | + { | |
| 195 | + if (trustAnchors == null) { | |
| 196 | + throw new NullPointerException("the trustAnchors parameters must" + | |
| 197 | + " be non-null"); | |
| 198 | + } | |
| 199 | + if (trustAnchors.isEmpty()) { | |
| 200 | + throw new InvalidAlgorithmParameterException("the trustAnchors " + | |
| 201 | + "parameter must be non-empty"); | |
| 202 | + } | |
| 203 | + for (Iterator<TrustAnchor> i = trustAnchors.iterator(); i.hasNext(); ) { | |
| 204 | + if (!(i.next() instanceof TrustAnchor)) { | |
| 205 | + throw new ClassCastException("all elements of set must be " | |
| 206 | + + "of type java.security.cert.TrustAnchor"); | |
| 207 | + } | |
| 208 | + } | |
| 209 | + this.unmodTrustAnchors = Collections.unmodifiableSet | |
| 210 | + (new HashSet<TrustAnchor>(trustAnchors)); | |
| 211 | + } | |
| 212 | + | |
| 213 | + /** | |
| 214 | + * Returns an immutable <code>Set</code> of initial | |
| 215 | + * policy identifiers (OID strings), indicating that any one of these | |
| 216 | + * policies would be acceptable to the certificate user for the purposes of | |
| 217 | + * certification path processing. The default return value is an empty | |
| 218 | + * <code>Set</code>, which is interpreted as meaning that any policy would | |
| 219 | + * be acceptable. | |
| 220 | + * | |
| 221 | + * @return an immutable <code>Set</code> of initial policy OIDs in | |
| 222 | + * <code>String</code> format, or an empty <code>Set</code> (implying any | |
| 223 | + * policy is acceptable). Never returns <code>null</code>. | |
| 224 | + * | |
| 225 | + * @see #setInitialPolicies | |
| 226 | + */ | |
| 227 | + public Set<String> getInitialPolicies() { | |
| 228 | + return this.unmodInitialPolicies; | |
| 229 | + } | |
| 230 | + | |
| 231 | + /** | |
| 232 | + * Sets the <code>Set</code> of initial policy identifiers | |
| 233 | + * (OID strings), indicating that any one of these | |
| 234 | + * policies would be acceptable to the certificate user for the purposes of | |
| 235 | + * certification path processing. By default, any policy is acceptable | |
| 236 | + * (i.e. all policies), so a user that wants to allow any policy as | |
| 237 | + * acceptable does not need to call this method, or can call it | |
| 238 | + * with an empty <code>Set</code> (or <code>null</code>). | |
| 239 | + * <p> | |
| 240 | + * Note that the <code>Set</code> is copied to protect against | |
| 241 | + * subsequent modifications. | |
| 242 | + * | |
| 243 | + * @param initialPolicies a <code>Set</code> of initial policy | |
| 244 | + * OIDs in <code>String</code> format (or <code>null</code>) | |
| 245 | + * @throws ClassCastException if any of the elements in the set are | |
| 246 | + * not of type <code>String</code> | |
| 247 | + * | |
| 248 | + * @see #getInitialPolicies | |
| 249 | + */ | |
| 250 | + public void setInitialPolicies(Set<String> initialPolicies) { | |
| 251 | + if (initialPolicies != null) { | |
| 252 | + for (Iterator<String> i = initialPolicies.iterator(); | |
| 253 | + i.hasNext();) { | |
| 254 | + if (!(i.next() instanceof String)) | |
| 255 | + throw new ClassCastException("all elements of set must be " | |
| 256 | + + "of type java.lang.String"); | |
| 257 | + } | |
| 258 | + this.unmodInitialPolicies = | |
| 259 | + Collections.unmodifiableSet(new HashSet<String>(initialPolicies)); | |
| 260 | + } else | |
| 261 | + this.unmodInitialPolicies = Collections.<String>emptySet(); | |
| 262 | + } | |
| 263 | + | |
| 264 | + /** | |
| 265 | + * Sets the list of <code>CertStore</code>s to be used in finding | |
| 266 | + * certificates and CRLs. May be <code>null</code>, in which case | |
| 267 | + * no <code>CertStore</code>s will be used. The first | |
| 268 | + * <code>CertStore</code>s in the list may be preferred to those that | |
| 269 | + * appear later. | |
| 270 | + * <p> | |
| 271 | + * Note that the <code>List</code> is copied to protect against | |
| 272 | + * subsequent modifications. | |
| 273 | + * | |
| 274 | + * @param stores a <code>List</code> of <code>CertStore</code>s (or | |
| 275 | + * <code>null</code>) | |
| 276 | + * @throws ClassCastException if any of the elements in the list are | |
| 277 | + * not of type <code>java.security.cert.CertStore</code> | |
| 278 | + * | |
| 279 | + * @see #getCertStores | |
| 280 | + */ | |
| 281 | + public void setCertStores(List<CertStore> stores) { | |
| 282 | + if (stores == null) { | |
| 283 | + this.certStores = new ArrayList<CertStore>(); | |
| 284 | + } else { | |
| 285 | + for (Iterator<CertStore> i = stores.iterator(); i.hasNext();) { | |
| 286 | + if (!(i.next() instanceof CertStore)) { | |
| 287 | + throw new ClassCastException("all elements of list must be " | |
| 288 | + + "of type java.security.cert.CertStore"); | |
| 289 | + } | |
| 290 | + } | |
| 291 | + this.certStores = new ArrayList<CertStore>(stores); | |
| 292 | + } | |
| 293 | + } | |
| 294 | + | |
| 295 | + /** | |
| 296 | + * Adds a <code>CertStore</code> to the end of the list of | |
| 297 | + * <code>CertStore</code>s used in finding certificates and CRLs. | |
| 298 | + * | |
| 299 | + * @param store the <code>CertStore</code> to add. If <code>null</code>, | |
| 300 | + * the store is ignored (not added to list). | |
| 301 | + */ | |
| 302 | + public void addCertStore(CertStore store) { | |
| 303 | + if (store != null) { | |
| 304 | + this.certStores.add(store); | |
| 305 | + } | |
| 306 | + } | |
| 307 | + | |
| 308 | + /** | |
| 309 | + * Returns an immutable <code>List</code> of <code>CertStore</code>s that | |
| 310 | + * are used to find certificates and CRLs. | |
| 311 | + * | |
| 312 | + * @return an immutable <code>List</code> of <code>CertStore</code>s | |
| 313 | + * (may be empty, but never <code>null</code>) | |
| 314 | + * | |
| 315 | + * @see #setCertStores | |
| 316 | + */ | |
| 317 | + public List<CertStore> getCertStores() { | |
| 318 | + return Collections.unmodifiableList | |
| 319 | + (new ArrayList<CertStore>(this.certStores)); | |
| 320 | + } | |
| 321 | + | |
| 322 | + /** | |
| 323 | + * Sets the RevocationEnabled flag. If this flag is true, the default | |
| 324 | + * revocation checking mechanism of the underlying PKIX service provider | |
| 325 | + * will be used. If this flag is false, the default revocation checking | |
| 326 | + * mechanism will be disabled (not used). | |
| 327 | + * <p> | |
| 328 | + * When a <code>PKIXParameters</code> object is created, this flag is set | |
| 329 | + * to true. This setting reflects the most common strategy for checking | |
| 330 | + * revocation, since each service provider must support revocation | |
| 331 | + * checking to be PKIX compliant. Sophisticated applications should set | |
| 332 | + * this flag to false when it is not practical to use a PKIX service | |
| 333 | + * provider's default revocation checking mechanism or when an alternative | |
| 334 | + * revocation checking mechanism is to be substituted (by also calling the | |
| 335 | + * {@link #addCertPathChecker addCertPathChecker} or {@link | |
| 336 | + * #setCertPathCheckers setCertPathCheckers} methods). | |
| 337 | + * | |
| 338 | + * @param val the new value of the RevocationEnabled flag | |
| 339 | + */ | |
| 340 | + public void setRevocationEnabled(boolean val) { | |
| 341 | + revocationEnabled = val; | |
| 342 | + } | |
| 343 | + | |
| 344 | + /** | |
| 345 | + * Checks the RevocationEnabled flag. If this flag is true, the default | |
| 346 | + * revocation checking mechanism of the underlying PKIX service provider | |
| 347 | + * will be used. If this flag is false, the default revocation checking | |
| 348 | + * mechanism will be disabled (not used). See the {@link | |
| 349 | + * #setRevocationEnabled setRevocationEnabled} method for more details on | |
| 350 | + * setting the value of this flag. | |
| 351 | + * | |
| 352 | + * @return the current value of the RevocationEnabled flag | |
| 353 | + */ | |
| 354 | + public boolean isRevocationEnabled() { | |
| 355 | + return revocationEnabled; | |
| 356 | + } | |
| 357 | + | |
| 358 | + /** | |
| 359 | + * Sets the ExplicitPolicyRequired flag. If this flag is true, an | |
| 360 | + * acceptable policy needs to be explicitly identified in every certificate. | |
| 361 | + * By default, the ExplicitPolicyRequired flag is false. | |
| 362 | + * | |
| 363 | + * @param val <code>true</code> if explicit policy is to be required, | |
| 364 | + * <code>false</code> otherwise | |
| 365 | + */ | |
| 366 | + public void setExplicitPolicyRequired(boolean val) { | |
| 367 | + explicitPolicyRequired = val; | |
| 368 | + } | |
| 369 | + | |
| 370 | + /** | |
| 371 | + * Checks if explicit policy is required. If this flag is true, an | |
| 372 | + * acceptable policy needs to be explicitly identified in every certificate. | |
| 373 | + * By default, the ExplicitPolicyRequired flag is false. | |
| 374 | + * | |
| 375 | + * @return <code>true</code> if explicit policy is required, | |
| 376 | + * <code>false</code> otherwise | |
| 377 | + */ | |
| 378 | + public boolean isExplicitPolicyRequired() { | |
| 379 | + return explicitPolicyRequired; | |
| 380 | + } | |
| 381 | + | |
| 382 | + /** | |
| 383 | + * Sets the PolicyMappingInhibited flag. If this flag is true, policy | |
| 384 | + * mapping is inhibited. By default, policy mapping is not inhibited (the | |
| 385 | + * flag is false). | |
| 386 | + * | |
| 387 | + * @param val <code>true</code> if policy mapping is to be inhibited, | |
| 388 | + * <code>false</code> otherwise | |
| 389 | + */ | |
| 390 | + public void setPolicyMappingInhibited(boolean val) { | |
| 391 | + policyMappingInhibited = val; | |
| 392 | + } | |
| 393 | + | |
| 394 | + /** | |
| 395 | + * Checks if policy mapping is inhibited. If this flag is true, policy | |
| 396 | + * mapping is inhibited. By default, policy mapping is not inhibited (the | |
| 397 | + * flag is false). | |
| 398 | + * | |
| 399 | + * @return true if policy mapping is inhibited, false otherwise | |
| 400 | + */ | |
| 401 | + public boolean isPolicyMappingInhibited() { | |
| 402 | + return policyMappingInhibited; | |
| 403 | + } | |
| 404 | + | |
| 405 | + /** | |
| 406 | + * Sets state to determine if the any policy OID should be processed | |
| 407 | + * if it is included in a certificate. By default, the any policy OID | |
| 408 | + * is not inhibited ({@link #isAnyPolicyInhibited isAnyPolicyInhibited()} | |
| 409 | + * returns <code>false</code>). | |
| 410 | + * | |
| 411 | + * @param val <code>true</code> if the any policy OID is to be | |
| 412 | + * inhibited, <code>false</code> otherwise | |
| 413 | + */ | |
| 414 | + public void setAnyPolicyInhibited(boolean val) { | |
| 415 | + anyPolicyInhibited = val; | |
| 416 | + } | |
| 417 | + | |
| 418 | + /** | |
| 419 | + * Checks whether the any policy OID should be processed if it | |
| 420 | + * is included in a certificate. | |
| 421 | + * | |
| 422 | + * @return <code>true</code> if the any policy OID is inhibited, | |
| 423 | + * <code>false</code> otherwise | |
| 424 | + */ | |
| 425 | + public boolean isAnyPolicyInhibited() { | |
| 426 | + return anyPolicyInhibited; | |
| 427 | + } | |
| 428 | + | |
| 429 | + /** | |
| 430 | + * Sets the PolicyQualifiersRejected flag. If this flag is true, | |
| 431 | + * certificates that include policy qualifiers in a certificate | |
| 432 | + * policies extension that is marked critical are rejected. | |
| 433 | + * If the flag is false, certificates are not rejected on this basis. | |
| 434 | + * | |
| 435 | + * <p> When a <code>PKIXParameters</code> object is created, this flag is | |
| 436 | + * set to true. This setting reflects the most common (and simplest) | |
| 437 | + * strategy for processing policy qualifiers. Applications that want to use | |
| 438 | + * a more sophisticated policy must set this flag to false. | |
| 439 | + * <p> | |
| 440 | + * Note that the PKIX certification path validation algorithm specifies | |
| 441 | + * that any policy qualifier in a certificate policies extension that is | |
| 442 | + * marked critical must be processed and validated. Otherwise the | |
| 443 | + * certification path must be rejected. If the policyQualifiersRejected flag | |
| 444 | + * is set to false, it is up to the application to validate all policy | |
| 445 | + * qualifiers in this manner in order to be PKIX compliant. | |
| 446 | + * | |
| 447 | + * @param qualifiersRejected the new value of the PolicyQualifiersRejected | |
| 448 | + * flag | |
| 449 | + * @see #getPolicyQualifiersRejected | |
| 450 | + * @see PolicyQualifierInfo | |
| 451 | + */ | |
| 452 | + public void setPolicyQualifiersRejected(boolean qualifiersRejected) { | |
| 453 | + policyQualifiersRejected = qualifiersRejected; | |
| 454 | + } | |
| 455 | + | |
| 456 | + /** | |
| 457 | + * Gets the PolicyQualifiersRejected flag. If this flag is true, | |
| 458 | + * certificates that include policy qualifiers in a certificate policies | |
| 459 | + * extension that is marked critical are rejected. | |
| 460 | + * If the flag is false, certificates are not rejected on this basis. | |
| 461 | + * | |
| 462 | + * <p> When a <code>PKIXParameters</code> object is created, this flag is | |
| 463 | + * set to true. This setting reflects the most common (and simplest) | |
| 464 | + * strategy for processing policy qualifiers. Applications that want to use | |
| 465 | + * a more sophisticated policy must set this flag to false. | |
| 466 | + * | |
| 467 | + * @return the current value of the PolicyQualifiersRejected flag | |
| 468 | + * @see #setPolicyQualifiersRejected | |
| 469 | + */ | |
| 470 | + public boolean getPolicyQualifiersRejected() { | |
| 471 | + return policyQualifiersRejected; | |
| 472 | + } | |
| 473 | + | |
| 474 | + /** | |
| 475 | + * Returns the time for which the validity of the certification path | |
| 476 | + * should be determined. If <code>null</code>, the current time is used. | |
| 477 | + * <p> | |
| 478 | + * Note that the <code>Date</code> returned is copied to protect against | |
| 479 | + * subsequent modifications. | |
| 480 | + * | |
| 481 | + * @return the <code>Date</code>, or <code>null</code> if not set | |
| 482 | + * @see #setDate | |
| 483 | + */ | |
| 484 | + public Date getDate() { | |
| 485 | + if (date == null) | |
| 486 | + return null; | |
| 487 | + else | |
| 488 | + return (Date) this.date.clone(); | |
| 489 | + } | |
| 490 | + | |
| 491 | + /** | |
| 492 | + * Sets the time for which the validity of the certification path | |
| 493 | + * should be determined. If <code>null</code>, the current time is used. | |
| 494 | + * <p> | |
| 495 | + * Note that the <code>Date</code> supplied here is copied to protect | |
| 496 | + * against subsequent modifications. | |
| 497 | + * | |
| 498 | + * @param date the <code>Date</code>, or <code>null</code> for the | |
| 499 | + * current time | |
| 500 | + * @see #getDate | |
| 501 | + */ | |
| 502 | + public void setDate(Date date) { | |
| 503 | + if (date != null) | |
| 504 | + this.date = (Date) date.clone(); | |
| 505 | + else | |
| 506 | + date = null; | |
| 507 | + } | |
| 508 | + | |
| 509 | + /** | |
| 510 | + * Sets a <code>List</code> of additional certification path checkers. If | |
| 511 | + * the specified <code>List</code> contains an object that is not a | |
| 512 | + * <code>PKIXCertPathChecker</code>, it is ignored. | |
| 513 | + * <p> | |
| 514 | + * Each <code>PKIXCertPathChecker</code> specified implements | |
| 515 | + * additional checks on a certificate. Typically, these are checks to | |
| 516 | + * process and verify private extensions contained in certificates. | |
| 517 | + * Each <code>PKIXCertPathChecker</code> should be instantiated with any | |
| 518 | + * initialization parameters needed to execute the check. | |
| 519 | + * <p> | |
| 520 | + * This method allows sophisticated applications to extend a PKIX | |
| 521 | + * <code>CertPathValidator</code> or <code>CertPathBuilder</code>. | |
| 522 | + * Each of the specified <code>PKIXCertPathChecker</code>s will be called, | |
| 523 | + * in turn, by a PKIX <code>CertPathValidator</code> or | |
| 524 | + * <code>CertPathBuilder</code> for each certificate processed or | |
| 525 | + * validated. | |
| 526 | + * <p> | |
| 527 | + * Regardless of whether these additional <code>PKIXCertPathChecker</code>s | |
| 528 | + * are set, a PKIX <code>CertPathValidator</code> or | |
| 529 | + * <code>CertPathBuilder</code> must perform all of the required PKIX | |
| 530 | + * checks on each certificate. The one exception to this rule is if the | |
| 531 | + * RevocationEnabled flag is set to false (see the {@link | |
| 532 | + * #setRevocationEnabled setRevocationEnabled} method). | |
| 533 | + * <p> | |
| 534 | + * Note that the <code>List</code> supplied here is copied and each | |
| 535 | + * <code>PKIXCertPathChecker</code> in the list is cloned to protect | |
| 536 | + * against subsequent modifications. | |
| 537 | + * | |
| 538 | + * @param checkers a <code>List</code> of <code>PKIXCertPathChecker</code>s. | |
| 539 | + * May be <code>null</code>, in which case no additional checkers will be | |
| 540 | + * used. | |
| 541 | + * @throws ClassCastException if any of the elements in the list | |
| 542 | + * are not of type <code>java.security.cert.PKIXCertPathChecker</code> | |
| 543 | + * @see #getCertPathCheckers | |
| 544 | + */ | |
| 545 | + public void setCertPathCheckers(List<PKIXCertPathChecker> checkers) { | |
| 546 | + if (checkers != null) { | |
| 547 | + List<PKIXCertPathChecker> tmpList = | |
| 548 | + new ArrayList<PKIXCertPathChecker>(); | |
| 549 | + for (PKIXCertPathChecker checker : checkers) { | |
| 550 | + tmpList.add((PKIXCertPathChecker)checker.clone()); | |
| 551 | + } | |
| 552 | + this.certPathCheckers = tmpList; | |
| 553 | + } else { | |
| 554 | + this.certPathCheckers = new ArrayList<PKIXCertPathChecker>(); | |
| 555 | + } | |
| 556 | + } | |
| 557 | + | |
| 558 | + /** | |
| 559 | + * Returns the <code>List</code> of certification path checkers. | |
| 560 | + * The returned <code>List</code> is immutable, and each | |
| 561 | + * <code>PKIXCertPathChecker</code> in the <code>List</code> is cloned | |
| 562 | + * to protect against subsequent modifications. | |
| 563 | + * | |
| 564 | + * @return an immutable <code>List</code> of | |
| 565 | + * <code>PKIXCertPathChecker</code>s (may be empty, but not | |
| 566 | + * <code>null</code>) | |
| 567 | + * @see #setCertPathCheckers | |
| 568 | + */ | |
| 569 | + public List<PKIXCertPathChecker> getCertPathCheckers() { | |
| 570 | + List<PKIXCertPathChecker> tmpList = new ArrayList<PKIXCertPathChecker>(); | |
| 571 | + for (PKIXCertPathChecker ck : certPathCheckers) { | |
| 572 | + tmpList.add((PKIXCertPathChecker)ck.clone()); | |
| 573 | + } | |
| 574 | + return Collections.unmodifiableList(tmpList); | |
| 575 | + } | |
| 576 | + | |
| 577 | + /** | |
| 578 | + * Adds a <code>PKIXCertPathChecker</code> to the list of certification | |
| 579 | + * path checkers. See the {@link #setCertPathCheckers setCertPathCheckers} | |
| 580 | + * method for more details. | |
| 581 | + * <p> | |
| 582 | + * Note that the <code>PKIXCertPathChecker</code> is cloned to protect | |
| 583 | + * against subsequent modifications. | |
| 584 | + * | |
| 585 | + * @param checker a <code>PKIXCertPathChecker</code> to add to the list of | |
| 586 | + * checks. If <code>null</code>, the checker is ignored (not added to list). | |
| 587 | + */ | |
| 588 | + public void addCertPathChecker(PKIXCertPathChecker checker) { | |
| 589 | + if (checker != null) { | |
| 590 | + certPathCheckers.add((PKIXCertPathChecker)checker.clone()); | |
| 591 | + } | |
| 592 | + } | |
| 593 | + | |
| 594 | + /** | |
| 595 | + * Returns the signature provider's name, or <code>null</code> | |
| 596 | + * if not set. | |
| 597 | + * | |
| 598 | + * @return the signature provider's name (or <code>null</code>) | |
| 599 | + * @see #setSigProvider | |
| 600 | + */ | |
| 601 | + public String getSigProvider() { | |
| 602 | + return this.sigProvider; | |
| 603 | + } | |
| 604 | + | |
| 605 | + /** | |
| 606 | + * Sets the signature provider's name. The specified provider will be | |
| 607 | + * preferred when creating {@link java.security.Signature Signature} | |
| 608 | + * objects. If <code>null</code> or not set, the first provider found | |
| 609 | + * supporting the algorithm will be used. | |
| 610 | + * | |
| 611 | + * @param sigProvider the signature provider's name (or <code>null</code>) | |
| 612 | + * @see #getSigProvider | |
| 613 | + */ | |
| 614 | + public void setSigProvider(String sigProvider) { | |
| 615 | + this.sigProvider = sigProvider; | |
| 616 | + } | |
| 617 | + | |
| 618 | + /** | |
| 619 | + * Returns the required constraints on the target certificate. | |
| 620 | + * The constraints are returned as an instance of <code>CertSelector</code>. | |
| 621 | + * If <code>null</code>, no constraints are defined. | |
| 622 | + * | |
| 623 | + * <p>Note that the <code>CertSelector</code> returned is cloned | |
| 624 | + * to protect against subsequent modifications. | |
| 625 | + * | |
| 626 | + * @return a <code>CertSelector</code> specifying the constraints | |
| 627 | + * on the target certificate (or <code>null</code>) | |
| 628 | + * @see #setTargetCertConstraints | |
| 629 | + */ | |
| 630 | + public CertSelector getTargetCertConstraints() { | |
| 631 | + if (certSelector != null) { | |
| 632 | + return (CertSelector) certSelector.clone(); | |
| 633 | + } else { | |
| 634 | + return null; | |
| 635 | + } | |
| 636 | + } | |
| 637 | + | |
| 638 | + /** | |
| 639 | + * Sets the required constraints on the target certificate. | |
| 640 | + * The constraints are specified as an instance of | |
| 641 | + * <code>CertSelector</code>. If <code>null</code>, no constraints are | |
| 642 | + * defined. | |
| 643 | + * | |
| 644 | + * <p>Note that the <code>CertSelector</code> specified is cloned | |
| 645 | + * to protect against subsequent modifications. | |
| 646 | + * | |
| 647 | + * @param selector a <code>CertSelector</code> specifying the constraints | |
| 648 | + * on the target certificate (or <code>null</code>) | |
| 649 | + * @see #getTargetCertConstraints | |
| 650 | + */ | |
| 651 | + public void setTargetCertConstraints(CertSelector selector) { | |
| 652 | + if (selector != null) | |
| 653 | + certSelector = (CertSelector) selector.clone(); | |
| 654 | + else | |
| 655 | + certSelector = null; | |
| 656 | + } | |
| 657 | + | |
| 658 | + /** | |
| 659 | + * Makes a copy of this <code>PKIXParameters</code> object. Changes | |
| 660 | + * to the copy will not affect the original and vice versa. | |
| 661 | + * | |
| 662 | + * @return a copy of this <code>PKIXParameters</code> object | |
| 663 | + */ | |
| 664 | + public Object clone() { | |
| 665 | + try { | |
| 666 | + PKIXParameters copy = (PKIXParameters)super.clone(); | |
| 667 | + | |
| 668 | + // must clone these because addCertStore, et al. modify them | |
| 669 | + if (certStores != null) { | |
| 670 | + copy.certStores = new ArrayList<CertStore>(certStores); | |
| 671 | + } | |
| 672 | + if (certPathCheckers != null) { | |
| 673 | + copy.certPathCheckers = | |
| 674 | + new ArrayList<PKIXCertPathChecker>(certPathCheckers.size()); | |
| 675 | + for (PKIXCertPathChecker checker : certPathCheckers) { | |
| 676 | + copy.certPathCheckers.add( | |
| 677 | + (PKIXCertPathChecker)checker.clone()); | |
| 678 | + } | |
| 679 | + } | |
| 680 | + | |
| 681 | + // other class fields are immutable to public, don't bother | |
| 682 | + // to clone the read-only fields. | |
| 683 | + return copy; | |
| 684 | + } catch (CloneNotSupportedException e) { | |
| 685 | + /* Cannot happen */ | |
| 686 | + throw new InternalError(e.toString()); | |
| 687 | + } | |
| 688 | + } | |
| 689 | + | |
| 690 | + /** | |
| 691 | + * Returns a formatted string describing the parameters. | |
| 692 | + * | |
| 693 | + * @return a formatted string describing the parameters. | |
| 694 | + */ | |
| 695 | + public String toString() { | |
| 696 | + StringBuffer sb = new StringBuffer(); | |
| 697 | + sb.append("[\n"); | |
| 698 | + | |
| 699 | + /* start with trusted anchor info */ | |
| 700 | + if (unmodTrustAnchors != null) { | |
| 701 | + sb.append(" Trust Anchors: " + unmodTrustAnchors.toString() | |
| 702 | + + "\n"); | |
| 703 | + } | |
| 704 | + | |
| 705 | + /* now, append initial state information */ | |
| 706 | + if (unmodInitialPolicies != null) { | |
| 707 | + if (unmodInitialPolicies.isEmpty()) { | |
| 708 | + sb.append(" Initial Policy OIDs: any\n"); | |
| 709 | + } else { | |
| 710 | + sb.append(" Initial Policy OIDs: [" | |
| 711 | + + unmodInitialPolicies.toString() + "]\n"); | |
| 712 | + } | |
| 713 | + } | |
| 714 | + | |
| 715 | + /* now, append constraints on all certificates in the path */ | |
| 716 | + sb.append(" Validity Date: " + String.valueOf(date) + "\n"); | |
| 717 | + sb.append(" Signature Provider: " + String.valueOf(sigProvider) + "\n"); | |
| 718 | + sb.append(" Default Revocation Enabled: " + revocationEnabled + "\n"); | |
| 719 | + sb.append(" Explicit Policy Required: " + explicitPolicyRequired + "\n"); | |
| 720 | + sb.append(" Policy Mapping Inhibited: " + policyMappingInhibited + "\n"); | |
| 721 | + sb.append(" Any Policy Inhibited: " + anyPolicyInhibited + "\n"); | |
| 722 | + sb.append(" Policy Qualifiers Rejected: " + policyQualifiersRejected + "\n"); | |
| 723 | + | |
| 724 | + /* now, append target cert requirements */ | |
| 725 | + sb.append(" Target Cert Constraints: " + String.valueOf(certSelector) + "\n"); | |
| 726 | + | |
| 727 | + /* finally, append miscellaneous parameters */ | |
| 728 | + if (certPathCheckers != null) | |
| 729 | + sb.append(" Certification Path Checkers: [" | |
| 730 | + + certPathCheckers.toString() + "]\n"); | |
| 731 | + if (certStores != null) | |
| 732 | + sb.append(" CertStores: [" + certStores.toString() + "]\n"); | |
| 733 | + sb.append("]"); | |
| 734 | + return sb.toString(); | |
| 735 | + } | |
| 736 | +} | |
Binary file not shown.
| @@ -0,0 +1,77 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +/** | |
| 29 | + * The <code>PKIXReason</code> enumerates the potential PKIX-specific reasons | |
| 30 | + * that an X.509 certification path may be invalid according to the PKIX | |
| 31 | + * (RFC 3280) standard. These reasons are in addition to those of the | |
| 32 | + * <code>CertPathValidatorException.BasicReason</code> enumeration. | |
| 33 | + * | |
| 34 | + * @since 1.7 | |
| 35 | + */ | |
| 36 | +public enum PKIXReason implements CertPathValidatorException.Reason { | |
| 37 | + /** | |
| 38 | + * The certificate does not chain correctly. | |
| 39 | + */ | |
| 40 | + NAME_CHAINING, | |
| 41 | + | |
| 42 | + /** | |
| 43 | + * The certificate's key usage is invalid. | |
| 44 | + */ | |
| 45 | + INVALID_KEY_USAGE, | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * The policy constraints have been violated. | |
| 49 | + */ | |
| 50 | + INVALID_POLICY, | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * No acceptable trust anchor found. | |
| 54 | + */ | |
| 55 | + NO_TRUST_ANCHOR, | |
| 56 | + | |
| 57 | + /** | |
| 58 | + * The certificate contains one or more unrecognized critical | |
| 59 | + * extensions. | |
| 60 | + */ | |
| 61 | + UNRECOGNIZED_CRIT_EXT, | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * The certificate is not a CA certificate. | |
| 65 | + */ | |
| 66 | + NOT_CA_CERT, | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * The path length constraint has been violated. | |
| 70 | + */ | |
| 71 | + PATH_TOO_LONG, | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * The name constraints have been violated. | |
| 75 | + */ | |
| 76 | + INVALID_NAME | |
| 77 | +} | |
Binary file not shown.
| @@ -0,0 +1,133 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.util.Iterator; | |
| 29 | +import java.util.Set; | |
| 30 | + | |
| 31 | +/** | |
| 32 | + * An immutable valid policy tree node as defined by the PKIX certification | |
| 33 | + * path validation algorithm. | |
| 34 | + * | |
| 35 | + * <p>One of the outputs of the PKIX certification path validation | |
| 36 | + * algorithm is a valid policy tree, which includes the policies that | |
| 37 | + * were determined to be valid, how this determination was reached, | |
| 38 | + * and any policy qualifiers encountered. This tree is of depth | |
| 39 | + * <i>n</i>, where <i>n</i> is the length of the certification | |
| 40 | + * path that has been validated. | |
| 41 | + * | |
| 42 | + * <p>Most applications will not need to examine the valid policy tree. | |
| 43 | + * They can achieve their policy processing goals by setting the | |
| 44 | + * policy-related parameters in <code>PKIXParameters</code>. However, | |
| 45 | + * the valid policy tree is available for more sophisticated applications, | |
| 46 | + * especially those that process policy qualifiers. | |
| 47 | + * | |
| 48 | + * <p>{@link PKIXCertPathValidatorResult#getPolicyTree() | |
| 49 | + * PKIXCertPathValidatorResult.getPolicyTree} returns the root node of the | |
| 50 | + * valid policy tree. The tree can be traversed using the | |
| 51 | + * {@link #getChildren getChildren} and {@link #getParent getParent} methods. | |
| 52 | + * Data about a particular node can be retrieved using other methods of | |
| 53 | + * <code>PolicyNode</code>. | |
| 54 | + * | |
| 55 | + * <p><b>Concurrent Access</b> | |
| 56 | + * <p>All <code>PolicyNode</code> objects must be immutable and | |
| 57 | + * thread-safe. Multiple threads may concurrently invoke the methods defined | |
| 58 | + * in this class on a single <code>PolicyNode</code> object (or more than one) | |
| 59 | + * with no ill effects. This stipulation applies to all public fields and | |
| 60 | + * methods of this class and any added or overridden by subclasses. | |
| 61 | + * | |
| 62 | + * @since 1.4 | |
| 63 | + * @author Sean Mullan | |
| 64 | + */ | |
| 65 | +public interface PolicyNode { | |
| 66 | + | |
| 67 | + /** | |
| 68 | + * Returns the parent of this node, or <code>null</code> if this is the | |
| 69 | + * root node. | |
| 70 | + * | |
| 71 | + * @return the parent of this node, or <code>null</code> if this is the | |
| 72 | + * root node | |
| 73 | + */ | |
| 74 | + PolicyNode getParent(); | |
| 75 | + | |
| 76 | + /** | |
| 77 | + * Returns an iterator over the children of this node. Any attempts to | |
| 78 | + * modify the children of this node through the | |
| 79 | + * <code>Iterator</code>'s remove method must throw an | |
| 80 | + * <code>UnsupportedOperationException</code>. | |
| 81 | + * | |
| 82 | + * @return an iterator over the children of this node | |
| 83 | + */ | |
| 84 | + Iterator<? extends PolicyNode> getChildren(); | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * Returns the depth of this node in the valid policy tree. | |
| 88 | + * | |
| 89 | + * @return the depth of this node (0 for the root node, 1 for its | |
| 90 | + * children, and so on) | |
| 91 | + */ | |
| 92 | + int getDepth(); | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * Returns the valid policy represented by this node. | |
| 96 | + * | |
| 97 | + * @return the <code>String</code> OID of the valid policy | |
| 98 | + * represented by this node. For the root node, this method always returns | |
| 99 | + * the special anyPolicy OID: "2.5.29.32.0". | |
| 100 | + */ | |
| 101 | + String getValidPolicy(); | |
| 102 | + | |
| 103 | + /** | |
| 104 | + * Returns the set of policy qualifiers associated with the | |
| 105 | + * valid policy represented by this node. | |
| 106 | + * | |
| 107 | + * @return an immutable <code>Set</code> of | |
| 108 | + * <code>PolicyQualifierInfo</code>s. For the root node, this | |
| 109 | + * is always an empty <code>Set</code>. | |
| 110 | + */ | |
| 111 | + Set<? extends PolicyQualifierInfo> getPolicyQualifiers(); | |
| 112 | + | |
| 113 | + /** | |
| 114 | + * Returns the set of expected policies that would satisfy this | |
| 115 | + * node's valid policy in the next certificate to be processed. | |
| 116 | + * | |
| 117 | + * @return an immutable <code>Set</code> of expected policy | |
| 118 | + * <code>String</code> OIDs. For the root node, this method | |
| 119 | + * always returns a <code>Set</code> with one element, the | |
| 120 | + * special anyPolicy OID: "2.5.29.32.0". | |
| 121 | + */ | |
| 122 | + Set<String> getExpectedPolicies(); | |
| 123 | + | |
| 124 | + /** | |
| 125 | + * Returns the criticality indicator of the certificate policy extension | |
| 126 | + * in the most recently processed certificate. | |
| 127 | + * | |
| 128 | + * @return <code>true</code> if extension marked critical, | |
| 129 | + * <code>false</code> otherwise. For the root node, <code>false</code> | |
| 130 | + * is always returned. | |
| 131 | + */ | |
| 132 | + boolean isCritical(); | |
| 133 | +} | |
Binary file not shown.
| @@ -0,0 +1,173 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | + | |
| 30 | +import sun.misc.HexDumpEncoder; | |
| 31 | +import sun.security.util.DerValue; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * An immutable policy qualifier represented by the ASN.1 PolicyQualifierInfo | |
| 35 | + * structure. | |
| 36 | + * | |
| 37 | + * <p>The ASN.1 definition is as follows: | |
| 38 | + * <p><pre> | |
| 39 | + * PolicyQualifierInfo ::= SEQUENCE { | |
| 40 | + * policyQualifierId PolicyQualifierId, | |
| 41 | + * qualifier ANY DEFINED BY policyQualifierId } | |
| 42 | + * </pre> | |
| 43 | + * <p> | |
| 44 | + * A certificate policies extension, if present in an X.509 version 3 | |
| 45 | + * certificate, contains a sequence of one or more policy information terms, | |
| 46 | + * each of which consists of an object identifier (OID) and optional | |
| 47 | + * qualifiers. In an end-entity certificate, these policy information terms | |
| 48 | + * indicate the policy under which the certificate has been issued and the | |
| 49 | + * purposes for which the certificate may be used. In a CA certificate, these | |
| 50 | + * policy information terms limit the set of policies for certification paths | |
| 51 | + * which include this certificate. | |
| 52 | + * <p> | |
| 53 | + * A <code>Set</code> of <code>PolicyQualifierInfo</code> objects are returned | |
| 54 | + * by the {@link PolicyNode#getPolicyQualifiers PolicyNode.getPolicyQualifiers} | |
| 55 | + * method. This allows applications with specific policy requirements to | |
| 56 | + * process and validate each policy qualifier. Applications that need to | |
| 57 | + * process policy qualifiers should explicitly set the | |
| 58 | + * <code>policyQualifiersRejected</code> flag to false (by calling the | |
| 59 | + * {@link PKIXParameters#setPolicyQualifiersRejected | |
| 60 | + * PKIXParameters.setPolicyQualifiersRejected} method) before validating | |
| 61 | + * a certification path. | |
| 62 | + * | |
| 63 | + * <p>Note that the PKIX certification path validation algorithm specifies | |
| 64 | + * that any policy qualifier in a certificate policies extension that is | |
| 65 | + * marked critical must be processed and validated. Otherwise the | |
| 66 | + * certification path must be rejected. If the | |
| 67 | + * <code>policyQualifiersRejected</code> flag is set to false, it is up to | |
| 68 | + * the application to validate all policy qualifiers in this manner in order | |
| 69 | + * to be PKIX compliant. | |
| 70 | + * | |
| 71 | + * <p><b>Concurrent Access</b> | |
| 72 | + * | |
| 73 | + * <p>All <code>PolicyQualifierInfo</code> objects must be immutable and | |
| 74 | + * thread-safe. That is, multiple threads may concurrently invoke the | |
| 75 | + * methods defined in this class on a single <code>PolicyQualifierInfo</code> | |
| 76 | + * object (or more than one) with no ill effects. Requiring | |
| 77 | + * <code>PolicyQualifierInfo</code> objects to be immutable and thread-safe | |
| 78 | + * allows them to be passed around to various pieces of code without | |
| 79 | + * worrying about coordinating access. | |
| 80 | + * | |
| 81 | + * @author seth proctor | |
| 82 | + * @author Sean Mullan | |
| 83 | + * @since 1.4 | |
| 84 | + */ | |
| 85 | +public class PolicyQualifierInfo { | |
| 86 | + | |
| 87 | + private byte [] mEncoded; | |
| 88 | + private String mId; | |
| 89 | + private byte [] mData; | |
| 90 | + private String pqiString; | |
| 91 | + | |
| 92 | + /** | |
| 93 | + * Creates an instance of <code>PolicyQualifierInfo</code> from the | |
| 94 | + * encoded bytes. The encoded byte array is copied on construction. | |
| 95 | + * | |
| 96 | + * @param encoded a byte array containing the qualifier in DER encoding | |
| 97 | + * @exception IOException thrown if the byte array does not represent a | |
| 98 | + * valid and parsable policy qualifier | |
| 99 | + */ | |
| 100 | + public PolicyQualifierInfo(byte[] encoded) throws IOException { | |
| 101 | + mEncoded = encoded.clone(); | |
| 102 | + | |
| 103 | + DerValue val = new DerValue(mEncoded); | |
| 104 | + if (val.tag != DerValue.tag_Sequence) | |
| 105 | + throw new IOException("Invalid encoding for PolicyQualifierInfo"); | |
| 106 | + | |
| 107 | + mId = (val.data.getDerValue()).getOID().toString(); | |
| 108 | + byte [] tmp = val.data.toByteArray(); | |
| 109 | + if (tmp == null) { | |
| 110 | + mData = null; | |
| 111 | + } else { | |
| 112 | + mData = new byte[tmp.length]; | |
| 113 | + System.arraycopy(tmp, 0, mData, 0, tmp.length); | |
| 114 | + } | |
| 115 | + } | |
| 116 | + | |
| 117 | + /** | |
| 118 | + * Returns the <code>policyQualifierId</code> field of this | |
| 119 | + * <code>PolicyQualifierInfo</code>. The <code>policyQualifierId</code> | |
| 120 | + * is an Object Identifier (OID) represented by a set of nonnegative | |
| 121 | + * integers separated by periods. | |
| 122 | + * | |
| 123 | + * @return the OID (never <code>null</code>) | |
| 124 | + */ | |
| 125 | + public final String getPolicyQualifierId() { | |
| 126 | + return mId; | |
| 127 | + } | |
| 128 | + | |
| 129 | + /** | |
| 130 | + * Returns the ASN.1 DER encoded form of this | |
| 131 | + * <code>PolicyQualifierInfo</code>. | |
| 132 | + * | |
| 133 | + * @return the ASN.1 DER encoded bytes (never <code>null</code>). | |
| 134 | + * Note that a copy is returned, so the data is cloned each time | |
| 135 | + * this method is called. | |
| 136 | + */ | |
| 137 | + public final byte[] getEncoded() { | |
| 138 | + return mEncoded.clone(); | |
| 139 | + } | |
| 140 | + | |
| 141 | + /** | |
| 142 | + * Returns the ASN.1 DER encoded form of the <code>qualifier</code> | |
| 143 | + * field of this <code>PolicyQualifierInfo</code>. | |
| 144 | + * | |
| 145 | + * @return the ASN.1 DER encoded bytes of the <code>qualifier</code> | |
| 146 | + * field. Note that a copy is returned, so the data is cloned each | |
| 147 | + * time this method is called. | |
| 148 | + */ | |
| 149 | + public final byte[] getPolicyQualifier() { | |
| 150 | + return (mData == null ? null : mData.clone()); | |
| 151 | + } | |
| 152 | + | |
| 153 | + /** | |
| 154 | + * Return a printable representation of this | |
| 155 | + * <code>PolicyQualifierInfo</code>. | |
| 156 | + * | |
| 157 | + * @return a <code>String</code> describing the contents of this | |
| 158 | + * <code>PolicyQualifierInfo</code> | |
| 159 | + */ | |
| 160 | + public String toString() { | |
| 161 | + if (pqiString != null) | |
| 162 | + return pqiString; | |
| 163 | + HexDumpEncoder enc = new HexDumpEncoder(); | |
| 164 | + StringBuffer sb = new StringBuffer(); | |
| 165 | + sb.append("PolicyQualifierInfo: [\n"); | |
| 166 | + sb.append(" qualifierID: " + mId + "\n"); | |
| 167 | + sb.append(" qualifier: " + | |
| 168 | + (mData == null ? "null" : enc.encodeBuffer(mData)) + "\n"); | |
| 169 | + sb.append("]"); | |
| 170 | + pqiString = sb.toString(); | |
| 171 | + return pqiString; | |
| 172 | + } | |
| 173 | +} | |
Binary file not shown.
| @@ -0,0 +1,334 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.security.PublicKey; | |
| 30 | + | |
| 31 | +import javax.security.auth.x500.X500Principal; | |
| 32 | + | |
| 33 | +import sun.security.x509.NameConstraintsExtension; | |
| 34 | +import sun.security.x509.X500Name; | |
| 35 | + | |
| 36 | +/** | |
| 37 | + * A trust anchor or most-trusted Certification Authority (CA). | |
| 38 | + * <p> | |
| 39 | + * This class represents a "most-trusted CA", which is used as a trust anchor | |
| 40 | + * for validating X.509 certification paths. A most-trusted CA includes the | |
| 41 | + * public key of the CA, the CA's name, and any constraints upon the set of | |
| 42 | + * paths which may be validated using this key. These parameters can be | |
| 43 | + * specified in the form of a trusted <code>X509Certificate</code> or as | |
| 44 | + * individual parameters. | |
| 45 | + * <p> | |
| 46 | + * <b>Concurrent Access</b> | |
| 47 | + * <p> | |
| 48 | + * <p>All <code>TrustAnchor</code> objects must be immutable and | |
| 49 | + * thread-safe. That is, multiple threads may concurrently invoke the | |
| 50 | + * methods defined in this class on a single <code>TrustAnchor</code> | |
| 51 | + * object (or more than one) with no ill effects. Requiring | |
| 52 | + * <code>TrustAnchor</code> objects to be immutable and thread-safe | |
| 53 | + * allows them to be passed around to various pieces of code without | |
| 54 | + * worrying about coordinating access. This stipulation applies to all | |
| 55 | + * public fields and methods of this class and any added or overridden | |
| 56 | + * by subclasses. | |
| 57 | + * | |
| 58 | + * @see PKIXParameters#PKIXParameters(Set) | |
| 59 | + * @see PKIXBuilderParameters#PKIXBuilderParameters(Set, CertSelector) | |
| 60 | + * | |
| 61 | + * @since 1.4 | |
| 62 | + * @author Sean Mullan | |
| 63 | + */ | |
| 64 | +public class TrustAnchor { | |
| 65 | + | |
| 66 | + private final PublicKey pubKey; | |
| 67 | + private final String caName; | |
| 68 | + private final X500Principal caPrincipal; | |
| 69 | + private final X509Certificate trustedCert; | |
| 70 | + private byte[] ncBytes; | |
| 71 | + private NameConstraintsExtension nc; | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Creates an instance of <code>TrustAnchor</code> with the specified | |
| 75 | + * <code>X509Certificate</code> and optional name constraints, which | |
| 76 | + * are intended to be used as additional constraints when validating | |
| 77 | + * an X.509 certification path. | |
| 78 | + * <p> | |
| 79 | + * The name constraints are specified as a byte array. This byte array | |
| 80 | + * should contain the DER encoded form of the name constraints, as they | |
| 81 | + * would appear in the NameConstraints structure defined in | |
| 82 | + * <a href="http://www.ietf.org/rfc/rfc3280">RFC 3280</a> | |
| 83 | + * and X.509. The ASN.1 definition of this structure appears below. | |
| 84 | + * | |
| 85 | + * <pre><code> | |
| 86 | + * NameConstraints ::= SEQUENCE { | |
| 87 | + * permittedSubtrees [0] GeneralSubtrees OPTIONAL, | |
| 88 | + * excludedSubtrees [1] GeneralSubtrees OPTIONAL } | |
| 89 | + * | |
| 90 | + * GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree | |
| 91 | + * | |
| 92 | + * GeneralSubtree ::= SEQUENCE { | |
| 93 | + * base GeneralName, | |
| 94 | + * minimum [0] BaseDistance DEFAULT 0, | |
| 95 | + * maximum [1] BaseDistance OPTIONAL } | |
| 96 | + * | |
| 97 | + * BaseDistance ::= INTEGER (0..MAX) | |
| 98 | + * | |
| 99 | + * GeneralName ::= CHOICE { | |
| 100 | + * otherName [0] OtherName, | |
| 101 | + * rfc822Name [1] IA5String, | |
| 102 | + * dNSName [2] IA5String, | |
| 103 | + * x400Address [3] ORAddress, | |
| 104 | + * directoryName [4] Name, | |
| 105 | + * ediPartyName [5] EDIPartyName, | |
| 106 | + * uniformResourceIdentifier [6] IA5String, | |
| 107 | + * iPAddress [7] OCTET STRING, | |
| 108 | + * registeredID [8] OBJECT IDENTIFIER} | |
| 109 | + * </code></pre> | |
| 110 | + * <p> | |
| 111 | + * Note that the name constraints byte array supplied is cloned to protect | |
| 112 | + * against subsequent modifications. | |
| 113 | + * | |
| 114 | + * @param trustedCert a trusted <code>X509Certificate</code> | |
| 115 | + * @param nameConstraints a byte array containing the ASN.1 DER encoding of | |
| 116 | + * a NameConstraints extension to be used for checking name constraints. | |
| 117 | + * Only the value of the extension is included, not the OID or criticality | |
| 118 | + * flag. Specify <code>null</code> to omit the parameter. | |
| 119 | + * @throws IllegalArgumentException if the name constraints cannot be | |
| 120 | + * decoded | |
| 121 | + * @throws NullPointerException if the specified | |
| 122 | + * <code>X509Certificate</code> is <code>null</code> | |
| 123 | + */ | |
| 124 | + public TrustAnchor(X509Certificate trustedCert, byte[] nameConstraints) | |
| 125 | + { | |
| 126 | + if (trustedCert == null) | |
| 127 | + throw new NullPointerException("the trustedCert parameter must " + | |
| 128 | + "be non-null"); | |
| 129 | + this.trustedCert = trustedCert; | |
| 130 | + this.pubKey = null; | |
| 131 | + this.caName = null; | |
| 132 | + this.caPrincipal = null; | |
| 133 | + setNameConstraints(nameConstraints); | |
| 134 | + } | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Creates an instance of <code>TrustAnchor</code> where the | |
| 138 | + * most-trusted CA is specified as an X500Principal and public key. | |
| 139 | + * Name constraints are an optional parameter, and are intended to be used | |
| 140 | + * as additional constraints when validating an X.509 certification path. | |
| 141 | + * <p> | |
| 142 | + * The name constraints are specified as a byte array. This byte array | |
| 143 | + * contains the DER encoded form of the name constraints, as they | |
| 144 | + * would appear in the NameConstraints structure defined in RFC 3280 | |
| 145 | + * and X.509. The ASN.1 notation for this structure is supplied in the | |
| 146 | + * documentation for | |
| 147 | + * {@link #TrustAnchor(X509Certificate, byte[]) | |
| 148 | + * TrustAnchor(X509Certificate trustedCert, byte[] nameConstraints) }. | |
| 149 | + * <p> | |
| 150 | + * Note that the name constraints byte array supplied here is cloned to | |
| 151 | + * protect against subsequent modifications. | |
| 152 | + * | |
| 153 | + * @param caPrincipal the name of the most-trusted CA as X500Principal | |
| 154 | + * @param pubKey the public key of the most-trusted CA | |
| 155 | + * @param nameConstraints a byte array containing the ASN.1 DER encoding of | |
| 156 | + * a NameConstraints extension to be used for checking name constraints. | |
| 157 | + * Only the value of the extension is included, not the OID or criticality | |
| 158 | + * flag. Specify <code>null</code> to omit the parameter. | |
| 159 | + * @throws NullPointerException if the specified <code>caPrincipal</code> or | |
| 160 | + * <code>pubKey</code> parameter is <code>null</code> | |
| 161 | + * @since 1.5 | |
| 162 | + */ | |
| 163 | + public TrustAnchor(X500Principal caPrincipal, PublicKey pubKey, | |
| 164 | + byte[] nameConstraints) { | |
| 165 | + if ((caPrincipal == null) || (pubKey == null)) { | |
| 166 | + throw new NullPointerException(); | |
| 167 | + } | |
| 168 | + this.trustedCert = null; | |
| 169 | + this.caPrincipal = caPrincipal; | |
| 170 | + this.caName = caPrincipal.getName(); | |
| 171 | + this.pubKey = pubKey; | |
| 172 | + setNameConstraints(nameConstraints); | |
| 173 | + } | |
| 174 | + | |
| 175 | + /** | |
| 176 | + * Creates an instance of <code>TrustAnchor</code> where the | |
| 177 | + * most-trusted CA is specified as a distinguished name and public key. | |
| 178 | + * Name constraints are an optional parameter, and are intended to be used | |
| 179 | + * as additional constraints when validating an X.509 certification path. | |
| 180 | + * <p> | |
| 181 | + * The name constraints are specified as a byte array. This byte array | |
| 182 | + * contains the DER encoded form of the name constraints, as they | |
| 183 | + * would appear in the NameConstraints structure defined in RFC 3280 | |
| 184 | + * and X.509. The ASN.1 notation for this structure is supplied in the | |
| 185 | + * documentation for | |
| 186 | + * {@link #TrustAnchor(X509Certificate, byte[]) | |
| 187 | + * TrustAnchor(X509Certificate trustedCert, byte[] nameConstraints) }. | |
| 188 | + * <p> | |
| 189 | + * Note that the name constraints byte array supplied here is cloned to | |
| 190 | + * protect against subsequent modifications. | |
| 191 | + * | |
| 192 | + * @param caName the X.500 distinguished name of the most-trusted CA in | |
| 193 | + * <a href="http://www.ietf.org/rfc/rfc2253.txt">RFC 2253</a> | |
| 194 | + * <code>String</code> format | |
| 195 | + * @param pubKey the public key of the most-trusted CA | |
| 196 | + * @param nameConstraints a byte array containing the ASN.1 DER encoding of | |
| 197 | + * a NameConstraints extension to be used for checking name constraints. | |
| 198 | + * Only the value of the extension is included, not the OID or criticality | |
| 199 | + * flag. Specify <code>null</code> to omit the parameter. | |
| 200 | + * @throws IllegalArgumentException if the specified <code> | |
| 201 | + * caName</code> parameter is empty <code>(caName.length() == 0)</code> | |
| 202 | + * or incorrectly formatted or the name constraints cannot be decoded | |
| 203 | + * @throws NullPointerException if the specified <code>caName</code> or | |
| 204 | + * <code>pubKey</code> parameter is <code>null</code> | |
| 205 | + */ | |
| 206 | + public TrustAnchor(String caName, PublicKey pubKey, byte[] nameConstraints) | |
| 207 | + { | |
| 208 | + if (pubKey == null) | |
| 209 | + throw new NullPointerException("the pubKey parameter must be " + | |
| 210 | + "non-null"); | |
| 211 | + if (caName == null) | |
| 212 | + throw new NullPointerException("the caName parameter must be " + | |
| 213 | + "non-null"); | |
| 214 | + if (caName.length() == 0) | |
| 215 | + throw new IllegalArgumentException("the caName " + | |
| 216 | + "parameter must be a non-empty String"); | |
| 217 | + // check if caName is formatted correctly | |
| 218 | + this.caPrincipal = new X500Principal(caName); | |
| 219 | + this.pubKey = pubKey; | |
| 220 | + this.caName = caName; | |
| 221 | + this.trustedCert = null; | |
| 222 | + setNameConstraints(nameConstraints); | |
| 223 | + } | |
| 224 | + | |
| 225 | + /** | |
| 226 | + * Returns the most-trusted CA certificate. | |
| 227 | + * | |
| 228 | + * @return a trusted <code>X509Certificate</code> or <code>null</code> | |
| 229 | + * if the trust anchor was not specified as a trusted certificate | |
| 230 | + */ | |
| 231 | + public final X509Certificate getTrustedCert() { | |
| 232 | + return this.trustedCert; | |
| 233 | + } | |
| 234 | + | |
| 235 | + /** | |
| 236 | + * Returns the name of the most-trusted CA as an X500Principal. | |
| 237 | + * | |
| 238 | + * @return the X.500 distinguished name of the most-trusted CA, or | |
| 239 | + * <code>null</code> if the trust anchor was not specified as a trusted | |
| 240 | + * public key and name or X500Principal pair | |
| 241 | + * @since 1.5 | |
| 242 | + */ | |
| 243 | + public final X500Principal getCA() { | |
| 244 | + return this.caPrincipal; | |
| 245 | + } | |
| 246 | + | |
| 247 | + /** | |
| 248 | + * Returns the name of the most-trusted CA in RFC 2253 <code>String</code> | |
| 249 | + * format. | |
| 250 | + * | |
| 251 | + * @return the X.500 distinguished name of the most-trusted CA, or | |
| 252 | + * <code>null</code> if the trust anchor was not specified as a trusted | |
| 253 | + * public key and name or X500Principal pair | |
| 254 | + */ | |
| 255 | + public final String getCAName() { | |
| 256 | + return this.caName; | |
| 257 | + } | |
| 258 | + | |
| 259 | + /** | |
| 260 | + * Returns the public key of the most-trusted CA. | |
| 261 | + * | |
| 262 | + * @return the public key of the most-trusted CA, or <code>null</code> | |
| 263 | + * if the trust anchor was not specified as a trusted public key and name | |
| 264 | + * or X500Principal pair | |
| 265 | + */ | |
| 266 | + public final PublicKey getCAPublicKey() { | |
| 267 | + return this.pubKey; | |
| 268 | + } | |
| 269 | + | |
| 270 | + /** | |
| 271 | + * Decode the name constraints and clone them if not null. | |
| 272 | + */ | |
| 273 | + private void setNameConstraints(byte[] bytes) { | |
| 274 | + if (bytes == null) { | |
| 275 | + ncBytes = null; | |
| 276 | + nc = null; | |
| 277 | + } else { | |
| 278 | + ncBytes = bytes.clone(); | |
| 279 | + // validate DER encoding | |
| 280 | + try { | |
| 281 | + nc = new NameConstraintsExtension(Boolean.FALSE, bytes); | |
| 282 | + } catch (IOException ioe) { | |
| 283 | + IllegalArgumentException iae = | |
| 284 | + new IllegalArgumentException(ioe.getMessage()); | |
| 285 | + iae.initCause(ioe); | |
| 286 | + throw iae; | |
| 287 | + } | |
| 288 | + } | |
| 289 | + } | |
| 290 | + | |
| 291 | + /** | |
| 292 | + * Returns the name constraints parameter. The specified name constraints | |
| 293 | + * are associated with this trust anchor and are intended to be used | |
| 294 | + * as additional constraints when validating an X.509 certification path. | |
| 295 | + * <p> | |
| 296 | + * The name constraints are returned as a byte array. This byte array | |
| 297 | + * contains the DER encoded form of the name constraints, as they | |
| 298 | + * would appear in the NameConstraints structure defined in RFC 3280 | |
| 299 | + * and X.509. The ASN.1 notation for this structure is supplied in the | |
| 300 | + * documentation for | |
| 301 | + * {@link #TrustAnchor(X509Certificate, byte[]) | |
| 302 | + * TrustAnchor(X509Certificate trustedCert, byte[] nameConstraints) }. | |
| 303 | + * <p> | |
| 304 | + * Note that the byte array returned is cloned to protect against | |
| 305 | + * subsequent modifications. | |
| 306 | + * | |
| 307 | + * @return a byte array containing the ASN.1 DER encoding of | |
| 308 | + * a NameConstraints extension used for checking name constraints, | |
| 309 | + * or <code>null</code> if not set. | |
| 310 | + */ | |
| 311 | + public final byte [] getNameConstraints() { | |
| 312 | + return ncBytes == null ? null : ncBytes.clone(); | |
| 313 | + } | |
| 314 | + | |
| 315 | + /** | |
| 316 | + * Returns a formatted string describing the <code>TrustAnchor</code>. | |
| 317 | + * | |
| 318 | + * @return a formatted string describing the <code>TrustAnchor</code> | |
| 319 | + */ | |
| 320 | + public String toString() { | |
| 321 | + StringBuffer sb = new StringBuffer(); | |
| 322 | + sb.append("[\n"); | |
| 323 | + if (pubKey != null) { | |
| 324 | + sb.append(" Trusted CA Public Key: " + pubKey.toString() + "\n"); | |
| 325 | + sb.append(" Trusted CA Issuer Name: " | |
| 326 | + + String.valueOf(caName) + "\n"); | |
| 327 | + } else { | |
| 328 | + sb.append(" Trusted CA cert: " + trustedCert.toString() + "\n"); | |
| 329 | + } | |
| 330 | + if (nc != null) | |
| 331 | + sb.append(" Name Constraints: " + nc.toString() + "\n"); | |
| 332 | + return sb.toString(); | |
| 333 | + } | |
| 334 | +} | |
Binary file not shown.
| @@ -0,0 +1,443 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.security.NoSuchAlgorithmException; | |
| 29 | +import java.security.NoSuchProviderException; | |
| 30 | +import java.security.InvalidKeyException; | |
| 31 | +import java.security.SignatureException; | |
| 32 | +import java.security.Principal; | |
| 33 | +import java.security.PublicKey; | |
| 34 | +import javax.security.auth.x500.X500Principal; | |
| 35 | + | |
| 36 | +import java.math.BigInteger; | |
| 37 | +import java.util.Date; | |
| 38 | +import java.util.Set; | |
| 39 | +import java.util.Arrays; | |
| 40 | + | |
| 41 | +import sun.security.x509.X509CRLImpl; | |
| 42 | + | |
| 43 | +/** | |
| 44 | + * <p> | |
| 45 | + * Abstract class for an X.509 Certificate Revocation List (CRL). | |
| 46 | + * A CRL is a time-stamped list identifying revoked certificates. | |
| 47 | + * It is signed by a Certificate Authority (CA) and made freely | |
| 48 | + * available in a public repository. | |
| 49 | + * | |
| 50 | + * <p>Each revoked certificate is | |
| 51 | + * identified in a CRL by its certificate serial number. When a | |
| 52 | + * certificate-using system uses a certificate (e.g., for verifying a | |
| 53 | + * remote user's digital signature), that system not only checks the | |
| 54 | + * certificate signature and validity but also acquires a suitably- | |
| 55 | + * recent CRL and checks that the certificate serial number is not on | |
| 56 | + * that CRL. The meaning of "suitably-recent" may vary with local | |
| 57 | + * policy, but it usually means the most recently-issued CRL. A CA | |
| 58 | + * issues a new CRL on a regular periodic basis (e.g., hourly, daily, or | |
| 59 | + * weekly). Entries are added to CRLs as revocations occur, and an | |
| 60 | + * entry may be removed when the certificate expiration date is reached. | |
| 61 | + * <p> | |
| 62 | + * The X.509 v2 CRL format is described below in ASN.1: | |
| 63 | + * <pre> | |
| 64 | + * CertificateList ::= SEQUENCE { | |
| 65 | + * tbsCertList TBSCertList, | |
| 66 | + * signatureAlgorithm AlgorithmIdentifier, | |
| 67 | + * signature BIT STRING } | |
| 68 | + * </pre> | |
| 69 | + * <p> | |
| 70 | + * More information can be found in | |
| 71 | + * <a href="http://www.ietf.org/rfc/rfc3280.txt">RFC 3280: Internet X.509 | |
| 72 | + * Public Key Infrastructure Certificate and CRL Profile</a>. | |
| 73 | + * <p> | |
| 74 | + * The ASN.1 definition of <code>tbsCertList</code> is: | |
| 75 | + * <pre> | |
| 76 | + * TBSCertList ::= SEQUENCE { | |
| 77 | + * version Version OPTIONAL, | |
| 78 | + * -- if present, must be v2 | |
| 79 | + * signature AlgorithmIdentifier, | |
| 80 | + * issuer Name, | |
| 81 | + * thisUpdate ChoiceOfTime, | |
| 82 | + * nextUpdate ChoiceOfTime OPTIONAL, | |
| 83 | + * revokedCertificates SEQUENCE OF SEQUENCE { | |
| 84 | + * userCertificate CertificateSerialNumber, | |
| 85 | + * revocationDate ChoiceOfTime, | |
| 86 | + * crlEntryExtensions Extensions OPTIONAL | |
| 87 | + * -- if present, must be v2 | |
| 88 | + * } OPTIONAL, | |
| 89 | + * crlExtensions [0] EXPLICIT Extensions OPTIONAL | |
| 90 | + * -- if present, must be v2 | |
| 91 | + * } | |
| 92 | + * </pre> | |
| 93 | + * <p> | |
| 94 | + * CRLs are instantiated using a certificate factory. The following is an | |
| 95 | + * example of how to instantiate an X.509 CRL: | |
| 96 | + * <pre><code> | |
| 97 | + * InputStream inStream = null; | |
| 98 | + * try { | |
| 99 | + * inStream = new FileInputStream("fileName-of-crl"); | |
| 100 | + * CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |
| 101 | + * X509CRL crl = (X509CRL)cf.generateCRL(inStream); | |
| 102 | + * } finally { | |
| 103 | + * if (inStream != null) { | |
| 104 | + * inStream.close(); | |
| 105 | + * } | |
| 106 | + * } | |
| 107 | + * </code></pre> | |
| 108 | + * | |
| 109 | + * @author Hemma Prafullchandra | |
| 110 | + * | |
| 111 | + * | |
| 112 | + * @see CRL | |
| 113 | + * @see CertificateFactory | |
| 114 | + * @see X509Extension | |
| 115 | + */ | |
| 116 | + | |
| 117 | +public abstract class X509CRL extends CRL implements X509Extension { | |
| 118 | + | |
| 119 | + private transient X500Principal issuerPrincipal; | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * Constructor for X.509 CRLs. | |
| 123 | + */ | |
| 124 | + protected X509CRL() { | |
| 125 | + super("X.509"); | |
| 126 | + } | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Compares this CRL for equality with the given | |
| 130 | + * object. If the <code>other</code> object is an | |
| 131 | + * <code>instanceof</code> <code>X509CRL</code>, then | |
| 132 | + * its encoded form is retrieved and compared with the | |
| 133 | + * encoded form of this CRL. | |
| 134 | + * | |
| 135 | + * @param other the object to test for equality with this CRL. | |
| 136 | + * | |
| 137 | + * @return true iff the encoded forms of the two CRLs | |
| 138 | + * match, false otherwise. | |
| 139 | + */ | |
| 140 | + public boolean equals(Object other) { | |
| 141 | + if (this == other) { | |
| 142 | + return true; | |
| 143 | + } | |
| 144 | + if (!(other instanceof X509CRL)) { | |
| 145 | + return false; | |
| 146 | + } | |
| 147 | + try { | |
| 148 | + byte[] thisCRL = X509CRLImpl.getEncodedInternal(this); | |
| 149 | + byte[] otherCRL = X509CRLImpl.getEncodedInternal((X509CRL)other); | |
| 150 | + | |
| 151 | + return Arrays.equals(thisCRL, otherCRL); | |
| 152 | + } catch (CRLException e) { | |
| 153 | + return false; | |
| 154 | + } | |
| 155 | + } | |
| 156 | + | |
| 157 | + /** | |
| 158 | + * Returns a hashcode value for this CRL from its | |
| 159 | + * encoded form. | |
| 160 | + * | |
| 161 | + * @return the hashcode value. | |
| 162 | + */ | |
| 163 | + public int hashCode() { | |
| 164 | + int retval = 0; | |
| 165 | + try { | |
| 166 | + byte[] crlData = X509CRLImpl.getEncodedInternal(this); | |
| 167 | + for (int i = 1; i < crlData.length; i++) { | |
| 168 | + retval += crlData[i] * i; | |
| 169 | + } | |
| 170 | + return retval; | |
| 171 | + } catch (CRLException e) { | |
| 172 | + return retval; | |
| 173 | + } | |
| 174 | + } | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Returns the ASN.1 DER-encoded form of this CRL. | |
| 178 | + * | |
| 179 | + * @return the encoded form of this certificate | |
| 180 | + * @exception CRLException if an encoding error occurs. | |
| 181 | + */ | |
| 182 | + public abstract byte[] getEncoded() | |
| 183 | + throws CRLException; | |
| 184 | + | |
| 185 | + /** | |
| 186 | + * Verifies that this CRL was signed using the | |
| 187 | + * private key that corresponds to the given public key. | |
| 188 | + * | |
| 189 | + * @param key the PublicKey used to carry out the verification. | |
| 190 | + * | |
| 191 | + * @exception NoSuchAlgorithmException on unsupported signature | |
| 192 | + * algorithms. | |
| 193 | + * @exception InvalidKeyException on incorrect key. | |
| 194 | + * @exception NoSuchProviderException if there's no default provider. | |
| 195 | + * @exception SignatureException on signature errors. | |
| 196 | + * @exception CRLException on encoding errors. | |
| 197 | + */ | |
| 198 | + public abstract void verify(PublicKey key) | |
| 199 | + throws CRLException, NoSuchAlgorithmException, | |
| 200 | + InvalidKeyException, NoSuchProviderException, | |
| 201 | + SignatureException; | |
| 202 | + | |
| 203 | + /** | |
| 204 | + * Verifies that this CRL was signed using the | |
| 205 | + * private key that corresponds to the given public key. | |
| 206 | + * This method uses the signature verification engine | |
| 207 | + * supplied by the given provider. | |
| 208 | + * | |
| 209 | + * @param key the PublicKey used to carry out the verification. | |
| 210 | + * @param sigProvider the name of the signature provider. | |
| 211 | + * | |
| 212 | + * @exception NoSuchAlgorithmException on unsupported signature | |
| 213 | + * algorithms. | |
| 214 | + * @exception InvalidKeyException on incorrect key. | |
| 215 | + * @exception NoSuchProviderException on incorrect provider. | |
| 216 | + * @exception SignatureException on signature errors. | |
| 217 | + * @exception CRLException on encoding errors. | |
| 218 | + */ | |
| 219 | + public abstract void verify(PublicKey key, String sigProvider) | |
| 220 | + throws CRLException, NoSuchAlgorithmException, | |
| 221 | + InvalidKeyException, NoSuchProviderException, | |
| 222 | + SignatureException; | |
| 223 | + | |
| 224 | + /** | |
| 225 | + * Gets the <code>version</code> (version number) value from the CRL. | |
| 226 | + * The ASN.1 definition for this is: | |
| 227 | + * <pre> | |
| 228 | + * version Version OPTIONAL, | |
| 229 | + * -- if present, must be v2<p> | |
| 230 | + * Version ::= INTEGER { v1(0), v2(1), v3(2) } | |
| 231 | + * -- v3 does not apply to CRLs but appears for consistency | |
| 232 | + * -- with definition of Version for certs | |
| 233 | + * </pre> | |
| 234 | + * | |
| 235 | + * @return the version number, i.e. 1 or 2. | |
| 236 | + */ | |
| 237 | + public abstract int getVersion(); | |
| 238 | + | |
| 239 | + /** | |
| 240 | + * <strong>Denigrated</strong>, replaced by {@linkplain | |
| 241 | + * #getIssuerX500Principal()}. This method returns the <code>issuer</code> | |
| 242 | + * as an implementation specific Principal object, which should not be | |
| 243 | + * relied upon by portable code. | |
| 244 | + * | |
| 245 | + * <p> | |
| 246 | + * Gets the <code>issuer</code> (issuer distinguished name) value from | |
| 247 | + * the CRL. The issuer name identifies the entity that signed (and | |
| 248 | + * issued) the CRL. | |
| 249 | + * | |
| 250 | + * <p>The issuer name field contains an | |
| 251 | + * X.500 distinguished name (DN). | |
| 252 | + * The ASN.1 definition for this is: | |
| 253 | + * <pre> | |
| 254 | + * issuer Name | |
| 255 | + * | |
| 256 | + * Name ::= CHOICE { RDNSequence } | |
| 257 | + * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName | |
| 258 | + * RelativeDistinguishedName ::= | |
| 259 | + * SET OF AttributeValueAssertion | |
| 260 | + * | |
| 261 | + * AttributeValueAssertion ::= SEQUENCE { | |
| 262 | + * AttributeType, | |
| 263 | + * AttributeValue } | |
| 264 | + * AttributeType ::= OBJECT IDENTIFIER | |
| 265 | + * AttributeValue ::= ANY | |
| 266 | + * </pre> | |
| 267 | + * The <code>Name</code> describes a hierarchical name composed of | |
| 268 | + * attributes, | |
| 269 | + * such as country name, and corresponding values, such as US. | |
| 270 | + * The type of the <code>AttributeValue</code> component is determined by | |
| 271 | + * the <code>AttributeType</code>; in general it will be a | |
| 272 | + * <code>directoryString</code>. A <code>directoryString</code> is usually | |
| 273 | + * one of <code>PrintableString</code>, | |
| 274 | + * <code>TeletexString</code> or <code>UniversalString</code>. | |
| 275 | + * | |
| 276 | + * @return a Principal whose name is the issuer distinguished name. | |
| 277 | + */ | |
| 278 | + public abstract Principal getIssuerDN(); | |
| 279 | + | |
| 280 | + /** | |
| 281 | + * Returns the issuer (issuer distinguished name) value from the | |
| 282 | + * CRL as an <code>X500Principal</code>. | |
| 283 | + * <p> | |
| 284 | + * It is recommended that subclasses override this method. | |
| 285 | + * | |
| 286 | + * @return an <code>X500Principal</code> representing the issuer | |
| 287 | + * distinguished name | |
| 288 | + * @since 1.4 | |
| 289 | + */ | |
| 290 | + public X500Principal getIssuerX500Principal() { | |
| 291 | + if (issuerPrincipal == null) { | |
| 292 | + issuerPrincipal = X509CRLImpl.getIssuerX500Principal(this); | |
| 293 | + } | |
| 294 | + return issuerPrincipal; | |
| 295 | + } | |
| 296 | + | |
| 297 | + /** | |
| 298 | + * Gets the <code>thisUpdate</code> date from the CRL. | |
| 299 | + * The ASN.1 definition for this is: | |
| 300 | + * <pre> | |
| 301 | + * thisUpdate ChoiceOfTime | |
| 302 | + * ChoiceOfTime ::= CHOICE { | |
| 303 | + * utcTime UTCTime, | |
| 304 | + * generalTime GeneralizedTime } | |
| 305 | + * </pre> | |
| 306 | + * | |
| 307 | + * @return the <code>thisUpdate</code> date from the CRL. | |
| 308 | + */ | |
| 309 | + public abstract Date getThisUpdate(); | |
| 310 | + | |
| 311 | + /** | |
| 312 | + * Gets the <code>nextUpdate</code> date from the CRL. | |
| 313 | + * | |
| 314 | + * @return the <code>nextUpdate</code> date from the CRL, or null if | |
| 315 | + * not present. | |
| 316 | + */ | |
| 317 | + public abstract Date getNextUpdate(); | |
| 318 | + | |
| 319 | + /** | |
| 320 | + * Gets the CRL entry, if any, with the given certificate serialNumber. | |
| 321 | + * | |
| 322 | + * @param serialNumber the serial number of the certificate for which a CRL entry | |
| 323 | + * is to be looked up | |
| 324 | + * @return the entry with the given serial number, or null if no such entry | |
| 325 | + * exists in this CRL. | |
| 326 | + * @see X509CRLEntry | |
| 327 | + */ | |
| 328 | + public abstract X509CRLEntry | |
| 329 | + getRevokedCertificate(BigInteger serialNumber); | |
| 330 | + | |
| 331 | + /** | |
| 332 | + * Get the CRL entry, if any, for the given certificate. | |
| 333 | + * | |
| 334 | + * <p>This method can be used to lookup CRL entries in indirect CRLs, | |
| 335 | + * that means CRLs that contain entries from issuers other than the CRL | |
| 336 | + * issuer. The default implementation will only return entries for | |
| 337 | + * certificates issued by the CRL issuer. Subclasses that wish to | |
| 338 | + * support indirect CRLs should override this method. | |
| 339 | + * | |
| 340 | + * @param certificate the certificate for which a CRL entry is to be looked | |
| 341 | + * up | |
| 342 | + * @return the entry for the given certificate, or null if no such entry | |
| 343 | + * exists in this CRL. | |
| 344 | + * @exception NullPointerException if certificate is null | |
| 345 | + * | |
| 346 | + * @since 1.5 | |
| 347 | + */ | |
| 348 | + public X509CRLEntry getRevokedCertificate(X509Certificate certificate) { | |
| 349 | + X500Principal certIssuer = certificate.getIssuerX500Principal(); | |
| 350 | + X500Principal crlIssuer = getIssuerX500Principal(); | |
| 351 | + if (certIssuer.equals(crlIssuer) == false) { | |
| 352 | + return null; | |
| 353 | + } | |
| 354 | + return getRevokedCertificate(certificate.getSerialNumber()); | |
| 355 | + } | |
| 356 | + | |
| 357 | + /** | |
| 358 | + * Gets all the entries from this CRL. | |
| 359 | + * This returns a Set of X509CRLEntry objects. | |
| 360 | + * | |
| 361 | + * @return all the entries or null if there are none present. | |
| 362 | + * @see X509CRLEntry | |
| 363 | + */ | |
| 364 | + public abstract Set<? extends X509CRLEntry> getRevokedCertificates(); | |
| 365 | + | |
| 366 | + /** | |
| 367 | + * Gets the DER-encoded CRL information, the | |
| 368 | + * <code>tbsCertList</code> from this CRL. | |
| 369 | + * This can be used to verify the signature independently. | |
| 370 | + * | |
| 371 | + * @return the DER-encoded CRL information. | |
| 372 | + * @exception CRLException if an encoding error occurs. | |
| 373 | + */ | |
| 374 | + public abstract byte[] getTBSCertList() throws CRLException; | |
| 375 | + | |
| 376 | + /** | |
| 377 | + * Gets the <code>signature</code> value (the raw signature bits) from | |
| 378 | + * the CRL. | |
| 379 | + * The ASN.1 definition for this is: | |
| 380 | + * <pre> | |
| 381 | + * signature BIT STRING | |
| 382 | + * </pre> | |
| 383 | + * | |
| 384 | + * @return the signature. | |
| 385 | + */ | |
| 386 | + public abstract byte[] getSignature(); | |
| 387 | + | |
| 388 | + /** | |
| 389 | + * Gets the signature algorithm name for the CRL | |
| 390 | + * signature algorithm. An example is the string "SHA256withRSA". | |
| 391 | + * The ASN.1 definition for this is: | |
| 392 | + * <pre> | |
| 393 | + * signatureAlgorithm AlgorithmIdentifier<p> | |
| 394 | + * AlgorithmIdentifier ::= SEQUENCE { | |
| 395 | + * algorithm OBJECT IDENTIFIER, | |
| 396 | + * parameters ANY DEFINED BY algorithm OPTIONAL } | |
| 397 | + * -- contains a value of the type | |
| 398 | + * -- registered for use with the | |
| 399 | + * -- algorithm object identifier value | |
| 400 | + * </pre> | |
| 401 | + * | |
| 402 | + * <p>The algorithm name is determined from the <code>algorithm</code> | |
| 403 | + * OID string. | |
| 404 | + * | |
| 405 | + * @return the signature algorithm name. | |
| 406 | + */ | |
| 407 | + public abstract String getSigAlgName(); | |
| 408 | + | |
| 409 | + /** | |
| 410 | + * Gets the signature algorithm OID string from the CRL. | |
| 411 | + * An OID is represented by a set of nonnegative whole numbers separated | |
| 412 | + * by periods. | |
| 413 | + * For example, the string "1.2.840.10040.4.3" identifies the SHA-1 | |
| 414 | + * with DSA signature algorithm defined in | |
| 415 | + * <a href="http://www.ietf.org/rfc/rfc3279.txt">RFC 3279: Algorithms and | |
| 416 | + * Identifiers for the Internet X.509 Public Key Infrastructure Certificate | |
| 417 | + * and CRL Profile</a>. | |
| 418 | + * | |
| 419 | + * <p>See {@link #getSigAlgName() getSigAlgName} for | |
| 420 | + * relevant ASN.1 definitions. | |
| 421 | + * | |
| 422 | + * @return the signature algorithm OID string. | |
| 423 | + */ | |
| 424 | + public abstract String getSigAlgOID(); | |
| 425 | + | |
| 426 | + /** | |
| 427 | + * Gets the DER-encoded signature algorithm parameters from this | |
| 428 | + * CRL's signature algorithm. In most cases, the signature | |
| 429 | + * algorithm parameters are null; the parameters are usually | |
| 430 | + * supplied with the public key. | |
| 431 | + * If access to individual parameter values is needed then use | |
| 432 | + * {@link java.security.AlgorithmParameters AlgorithmParameters} | |
| 433 | + * and instantiate with the name returned by | |
| 434 | + * {@link #getSigAlgName() getSigAlgName}. | |
| 435 | + * | |
| 436 | + * <p>See {@link #getSigAlgName() getSigAlgName} for | |
| 437 | + * relevant ASN.1 definitions. | |
| 438 | + * | |
| 439 | + * @return the DER-encoded signature algorithm parameters, or | |
| 440 | + * null if no parameters are present. | |
| 441 | + */ | |
| 442 | + public abstract byte[] getSigAlgParams(); | |
| 443 | +} | |
Binary file not shown.
| @@ -0,0 +1,191 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.math.BigInteger; | |
| 29 | +import java.util.Date; | |
| 30 | +import javax.security.auth.x500.X500Principal; | |
| 31 | + | |
| 32 | +import sun.security.x509.X509CRLEntryImpl; | |
| 33 | + | |
| 34 | +/** | |
| 35 | + * <p>Abstract class for a revoked certificate in a CRL (Certificate | |
| 36 | + * Revocation List). | |
| 37 | + * | |
| 38 | + * The ASN.1 definition for <em>revokedCertificates</em> is: | |
| 39 | + * <pre> | |
| 40 | + * revokedCertificates SEQUENCE OF SEQUENCE { | |
| 41 | + * userCertificate CertificateSerialNumber, | |
| 42 | + * revocationDate ChoiceOfTime, | |
| 43 | + * crlEntryExtensions Extensions OPTIONAL | |
| 44 | + * -- if present, must be v2 | |
| 45 | + * } OPTIONAL | |
| 46 | + *<p> | |
| 47 | + * CertificateSerialNumber ::= INTEGER | |
| 48 | + *<p> | |
| 49 | + * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension | |
| 50 | + *<p> | |
| 51 | + * Extension ::= SEQUENCE { | |
| 52 | + * extnId OBJECT IDENTIFIER, | |
| 53 | + * critical BOOLEAN DEFAULT FALSE, | |
| 54 | + * extnValue OCTET STRING | |
| 55 | + * -- contains a DER encoding of a value | |
| 56 | + * -- of the type registered for use with | |
| 57 | + * -- the extnId object identifier value | |
| 58 | + * } | |
| 59 | + * </pre> | |
| 60 | + * | |
| 61 | + * @see X509CRL | |
| 62 | + * @see X509Extension | |
| 63 | + * | |
| 64 | + * @author Hemma Prafullchandra | |
| 65 | + */ | |
| 66 | + | |
| 67 | +public abstract class X509CRLEntry implements X509Extension { | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * Compares this CRL entry for equality with the given | |
| 71 | + * object. If the <code>other</code> object is an | |
| 72 | + * <code>instanceof</code> <code>X509CRLEntry</code>, then | |
| 73 | + * its encoded form (the inner SEQUENCE) is retrieved and compared | |
| 74 | + * with the encoded form of this CRL entry. | |
| 75 | + * | |
| 76 | + * @param other the object to test for equality with this CRL entry. | |
| 77 | + * @return true iff the encoded forms of the two CRL entries | |
| 78 | + * match, false otherwise. | |
| 79 | + */ | |
| 80 | + public boolean equals(Object other) { | |
| 81 | + if (this == other) | |
| 82 | + return true; | |
| 83 | + if (!(other instanceof X509CRLEntry)) | |
| 84 | + return false; | |
| 85 | + try { | |
| 86 | + byte[] thisCRLEntry = this.getEncoded(); | |
| 87 | + byte[] otherCRLEntry = ((X509CRLEntry)other).getEncoded(); | |
| 88 | + | |
| 89 | + if (thisCRLEntry.length != otherCRLEntry.length) | |
| 90 | + return false; | |
| 91 | + for (int i = 0; i < thisCRLEntry.length; i++) | |
| 92 | + if (thisCRLEntry[i] != otherCRLEntry[i]) | |
| 93 | + return false; | |
| 94 | + } catch (CRLException ce) { | |
| 95 | + return false; | |
| 96 | + } | |
| 97 | + return true; | |
| 98 | + } | |
| 99 | + | |
| 100 | + /** | |
| 101 | + * Returns a hashcode value for this CRL entry from its | |
| 102 | + * encoded form. | |
| 103 | + * | |
| 104 | + * @return the hashcode value. | |
| 105 | + */ | |
| 106 | + public int hashCode() { | |
| 107 | + int retval = 0; | |
| 108 | + try { | |
| 109 | + byte[] entryData = this.getEncoded(); | |
| 110 | + for (int i = 1; i < entryData.length; i++) | |
| 111 | + retval += entryData[i] * i; | |
| 112 | + | |
| 113 | + } catch (CRLException ce) { | |
| 114 | + return(retval); | |
| 115 | + } | |
| 116 | + return(retval); | |
| 117 | + } | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * Returns the ASN.1 DER-encoded form of this CRL Entry, | |
| 121 | + * that is the inner SEQUENCE. | |
| 122 | + * | |
| 123 | + * @return the encoded form of this certificate | |
| 124 | + * @exception CRLException if an encoding error occurs. | |
| 125 | + */ | |
| 126 | + public abstract byte[] getEncoded() throws CRLException; | |
| 127 | + | |
| 128 | + /** | |
| 129 | + * Gets the serial number from this X509CRLEntry, | |
| 130 | + * the <em>userCertificate</em>. | |
| 131 | + * | |
| 132 | + * @return the serial number. | |
| 133 | + */ | |
| 134 | + public abstract BigInteger getSerialNumber(); | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Get the issuer of the X509Certificate described by this entry. If | |
| 138 | + * the certificate issuer is also the CRL issuer, this method returns | |
| 139 | + * null. | |
| 140 | + * | |
| 141 | + * <p>This method is used with indirect CRLs. The default implementation | |
| 142 | + * always returns null. Subclasses that wish to support indirect CRLs | |
| 143 | + * should override it. | |
| 144 | + * | |
| 145 | + * @return the issuer of the X509Certificate described by this entry | |
| 146 | + * or null if it is issued by the CRL issuer. | |
| 147 | + * | |
| 148 | + * @since 1.5 | |
| 149 | + */ | |
| 150 | + public X500Principal getCertificateIssuer() { | |
| 151 | + return null; | |
| 152 | + } | |
| 153 | + | |
| 154 | + /** | |
| 155 | + * Gets the revocation date from this X509CRLEntry, | |
| 156 | + * the <em>revocationDate</em>. | |
| 157 | + * | |
| 158 | + * @return the revocation date. | |
| 159 | + */ | |
| 160 | + public abstract Date getRevocationDate(); | |
| 161 | + | |
| 162 | + /** | |
| 163 | + * Returns true if this CRL entry has extensions. | |
| 164 | + * | |
| 165 | + * @return true if this entry has extensions, false otherwise. | |
| 166 | + */ | |
| 167 | + public abstract boolean hasExtensions(); | |
| 168 | + | |
| 169 | + /** | |
| 170 | + * Returns a string representation of this CRL entry. | |
| 171 | + * | |
| 172 | + * @return a string representation of this CRL entry. | |
| 173 | + */ | |
| 174 | + public abstract String toString(); | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Returns the reason the certificate has been revoked, as specified | |
| 178 | + * in the Reason Code extension of this CRL entry. | |
| 179 | + * | |
| 180 | + * @return the reason the certificate has been revoked, or | |
| 181 | + * <code>null</code> if this CRL entry does not have | |
| 182 | + * a Reason Code extension | |
| 183 | + * @since 1.7 | |
| 184 | + */ | |
| 185 | + public CRLReason getRevocationReason() { | |
| 186 | + if (!hasExtensions()) { | |
| 187 | + return null; | |
| 188 | + } | |
| 189 | + return X509CRLEntryImpl.getRevocationReason(this); | |
| 190 | + } | |
| 191 | +} | |
Binary file not shown.
| @@ -0,0 +1,714 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.math.BigInteger; | |
| 30 | +import java.util.*; | |
| 31 | + | |
| 32 | +import javax.security.auth.x500.X500Principal; | |
| 33 | + | |
| 34 | +import sun.security.util.Debug; | |
| 35 | +import sun.security.util.DerInputStream; | |
| 36 | +import sun.security.x509.CRLNumberExtension; | |
| 37 | +import sun.security.x509.X500Name; | |
| 38 | + | |
| 39 | +/** | |
| 40 | + * A <code>CRLSelector</code> that selects <code>X509CRLs</code> that | |
| 41 | + * match all specified criteria. This class is particularly useful when | |
| 42 | + * selecting CRLs from a <code>CertStore</code> to check revocation status | |
| 43 | + * of a particular certificate. | |
| 44 | + * <p> | |
| 45 | + * When first constructed, an <code>X509CRLSelector</code> has no criteria | |
| 46 | + * enabled and each of the <code>get</code> methods return a default | |
| 47 | + * value (<code>null</code>). Therefore, the {@link #match match} method | |
| 48 | + * would return <code>true</code> for any <code>X509CRL</code>. Typically, | |
| 49 | + * several criteria are enabled (by calling {@link #setIssuers setIssuers} | |
| 50 | + * or {@link #setDateAndTime setDateAndTime}, for instance) and then the | |
| 51 | + * <code>X509CRLSelector</code> is passed to | |
| 52 | + * {@link CertStore#getCRLs CertStore.getCRLs} or some similar | |
| 53 | + * method. | |
| 54 | + * <p> | |
| 55 | + * Please refer to <a href="http://www.ietf.org/rfc/rfc3280.txt">RFC 3280: | |
| 56 | + * Internet X.509 Public Key Infrastructure Certificate and CRL Profile</a> | |
| 57 | + * for definitions of the X.509 CRL fields and extensions mentioned below. | |
| 58 | + * <p> | |
| 59 | + * <b>Concurrent Access</b> | |
| 60 | + * <p> | |
| 61 | + * Unless otherwise specified, the methods defined in this class are not | |
| 62 | + * thread-safe. Multiple threads that need to access a single | |
| 63 | + * object concurrently should synchronize amongst themselves and | |
| 64 | + * provide the necessary locking. Multiple threads each manipulating | |
| 65 | + * separate objects need not synchronize. | |
| 66 | + * | |
| 67 | + * @see CRLSelector | |
| 68 | + * @see X509CRL | |
| 69 | + * | |
| 70 | + * @since 1.4 | |
| 71 | + * @author Steve Hanna | |
| 72 | + */ | |
| 73 | +public class X509CRLSelector implements CRLSelector { | |
| 74 | + | |
| 75 | + static { | |
| 76 | + CertPathHelperImpl.initialize(); | |
| 77 | + } | |
| 78 | + | |
| 79 | + private static final Debug debug = Debug.getInstance("certpath"); | |
| 80 | + private HashSet<Object> issuerNames; | |
| 81 | + private HashSet<X500Principal> issuerX500Principals; | |
| 82 | + private BigInteger minCRL; | |
| 83 | + private BigInteger maxCRL; | |
| 84 | + private Date dateAndTime; | |
| 85 | + private X509Certificate certChecking; | |
| 86 | + private long skew = 0; | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * Creates an <code>X509CRLSelector</code>. Initially, no criteria are set | |
| 90 | + * so any <code>X509CRL</code> will match. | |
| 91 | + */ | |
| 92 | + public X509CRLSelector() {} | |
| 93 | + | |
| 94 | + /** | |
| 95 | + * Sets the issuerNames criterion. The issuer distinguished name in the | |
| 96 | + * <code>X509CRL</code> must match at least one of the specified | |
| 97 | + * distinguished names. If <code>null</code>, any issuer distinguished name | |
| 98 | + * will do. | |
| 99 | + * <p> | |
| 100 | + * This method allows the caller to specify, with a single method call, | |
| 101 | + * the complete set of issuer names which <code>X509CRLs</code> may contain. | |
| 102 | + * The specified value replaces the previous value for the issuerNames | |
| 103 | + * criterion. | |
| 104 | + * <p> | |
| 105 | + * The <code>names</code> parameter (if not <code>null</code>) is a | |
| 106 | + * <code>Collection</code> of <code>X500Principal</code>s. | |
| 107 | + * <p> | |
| 108 | + * Note that the <code>names</code> parameter can contain duplicate | |
| 109 | + * distinguished names, but they may be removed from the | |
| 110 | + * <code>Collection</code> of names returned by the | |
| 111 | + * {@link #getIssuers getIssuers} method. | |
| 112 | + * <p> | |
| 113 | + * Note that a copy is performed on the <code>Collection</code> to | |
| 114 | + * protect against subsequent modifications. | |
| 115 | + * | |
| 116 | + * @param issuers a <code>Collection</code> of X500Principals | |
| 117 | + * (or <code>null</code>) | |
| 118 | + * @see #getIssuers | |
| 119 | + * @since 1.5 | |
| 120 | + */ | |
| 121 | + public void setIssuers(Collection<X500Principal> issuers) { | |
| 122 | + if ((issuers == null) || issuers.isEmpty()) { | |
| 123 | + issuerNames = null; | |
| 124 | + issuerX500Principals = null; | |
| 125 | + } else { | |
| 126 | + // clone | |
| 127 | + issuerX500Principals = new HashSet<X500Principal>(issuers); | |
| 128 | + issuerNames = new HashSet<Object>(); | |
| 129 | + for (X500Principal p : issuerX500Principals) { | |
| 130 | + issuerNames.add(p.getEncoded()); | |
| 131 | + } | |
| 132 | + } | |
| 133 | + } | |
| 134 | + | |
| 135 | + /** | |
| 136 | + * <strong>Note:</strong> use {@linkplain #setIssuers(Collection)} instead | |
| 137 | + * or only specify the byte array form of distinguished names when using | |
| 138 | + * this method. See {@link #addIssuerName(String)} for more information. | |
| 139 | + * <p> | |
| 140 | + * Sets the issuerNames criterion. The issuer distinguished name in the | |
| 141 | + * <code>X509CRL</code> must match at least one of the specified | |
| 142 | + * distinguished names. If <code>null</code>, any issuer distinguished name | |
| 143 | + * will do. | |
| 144 | + * <p> | |
| 145 | + * This method allows the caller to specify, with a single method call, | |
| 146 | + * the complete set of issuer names which <code>X509CRLs</code> may contain. | |
| 147 | + * The specified value replaces the previous value for the issuerNames | |
| 148 | + * criterion. | |
| 149 | + * <p> | |
| 150 | + * The <code>names</code> parameter (if not <code>null</code>) is a | |
| 151 | + * <code>Collection</code> of names. Each name is a <code>String</code> | |
| 152 | + * or a byte array representing a distinguished name (in | |
| 153 | + * <a href="http://www.ietf.org/rfc/rfc2253.txt">RFC 2253</a> or | |
| 154 | + * ASN.1 DER encoded form, respectively). If <code>null</code> is supplied | |
| 155 | + * as the value for this argument, no issuerNames check will be performed. | |
| 156 | + * <p> | |
| 157 | + * Note that the <code>names</code> parameter can contain duplicate | |
| 158 | + * distinguished names, but they may be removed from the | |
| 159 | + * <code>Collection</code> of names returned by the | |
| 160 | + * {@link #getIssuerNames getIssuerNames} method. | |
| 161 | + * <p> | |
| 162 | + * If a name is specified as a byte array, it should contain a single DER | |
| 163 | + * encoded distinguished name, as defined in X.501. The ASN.1 notation for | |
| 164 | + * this structure is as follows. | |
| 165 | + * <pre><code> | |
| 166 | + * Name ::= CHOICE { | |
| 167 | + * RDNSequence } | |
| 168 | + * | |
| 169 | + * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName | |
| 170 | + * | |
| 171 | + * RelativeDistinguishedName ::= | |
| 172 | + * SET SIZE (1 .. MAX) OF AttributeTypeAndValue | |
| 173 | + * | |
| 174 | + * AttributeTypeAndValue ::= SEQUENCE { | |
| 175 | + * type AttributeType, | |
| 176 | + * value AttributeValue } | |
| 177 | + * | |
| 178 | + * AttributeType ::= OBJECT IDENTIFIER | |
| 179 | + * | |
| 180 | + * AttributeValue ::= ANY DEFINED BY AttributeType | |
| 181 | + * .... | |
| 182 | + * DirectoryString ::= CHOICE { | |
| 183 | + * teletexString TeletexString (SIZE (1..MAX)), | |
| 184 | + * printableString PrintableString (SIZE (1..MAX)), | |
| 185 | + * universalString UniversalString (SIZE (1..MAX)), | |
| 186 | + * utf8String UTF8String (SIZE (1.. MAX)), | |
| 187 | + * bmpString BMPString (SIZE (1..MAX)) } | |
| 188 | + * </code></pre> | |
| 189 | + * <p> | |
| 190 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 191 | + * protect against subsequent modifications. | |
| 192 | + * | |
| 193 | + * @param names a <code>Collection</code> of names (or <code>null</code>) | |
| 194 | + * @throws IOException if a parsing error occurs | |
| 195 | + * @see #getIssuerNames | |
| 196 | + */ | |
| 197 | + public void setIssuerNames(Collection<?> names) throws IOException { | |
| 198 | + if (names == null || names.size() == 0) { | |
| 199 | + issuerNames = null; | |
| 200 | + issuerX500Principals = null; | |
| 201 | + } else { | |
| 202 | + HashSet<Object> tempNames = cloneAndCheckIssuerNames(names); | |
| 203 | + // Ensure that we either set both of these or neither | |
| 204 | + issuerX500Principals = parseIssuerNames(tempNames); | |
| 205 | + issuerNames = tempNames; | |
| 206 | + } | |
| 207 | + } | |
| 208 | + | |
| 209 | + /** | |
| 210 | + * Adds a name to the issuerNames criterion. The issuer distinguished | |
| 211 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 212 | + * distinguished names. | |
| 213 | + * <p> | |
| 214 | + * This method allows the caller to add a name to the set of issuer names | |
| 215 | + * which <code>X509CRLs</code> may contain. The specified name is added to | |
| 216 | + * any previous value for the issuerNames criterion. | |
| 217 | + * If the specified name is a duplicate, it may be ignored. | |
| 218 | + * | |
| 219 | + * @param issuer the issuer as X500Principal | |
| 220 | + * @since 1.5 | |
| 221 | + */ | |
| 222 | + public void addIssuer(X500Principal issuer) { | |
| 223 | + addIssuerNameInternal(issuer.getEncoded(), issuer); | |
| 224 | + } | |
| 225 | + | |
| 226 | + /** | |
| 227 | + * <strong>Denigrated</strong>, use | |
| 228 | + * {@linkplain #addIssuer(X500Principal)} or | |
| 229 | + * {@linkplain #addIssuerName(byte[])} instead. This method should not be | |
| 230 | + * relied on as it can fail to match some CRLs because of a loss of | |
| 231 | + * encoding information in the RFC 2253 String form of some distinguished | |
| 232 | + * names. | |
| 233 | + * <p> | |
| 234 | + * Adds a name to the issuerNames criterion. The issuer distinguished | |
| 235 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 236 | + * distinguished names. | |
| 237 | + * <p> | |
| 238 | + * This method allows the caller to add a name to the set of issuer names | |
| 239 | + * which <code>X509CRLs</code> may contain. The specified name is added to | |
| 240 | + * any previous value for the issuerNames criterion. | |
| 241 | + * If the specified name is a duplicate, it may be ignored. | |
| 242 | + * | |
| 243 | + * @param name the name in RFC 2253 form | |
| 244 | + * @throws IOException if a parsing error occurs | |
| 245 | + */ | |
| 246 | + public void addIssuerName(String name) throws IOException { | |
| 247 | + addIssuerNameInternal(name, new X500Name(name).asX500Principal()); | |
| 248 | + } | |
| 249 | + | |
| 250 | + /** | |
| 251 | + * Adds a name to the issuerNames criterion. The issuer distinguished | |
| 252 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 253 | + * distinguished names. | |
| 254 | + * <p> | |
| 255 | + * This method allows the caller to add a name to the set of issuer names | |
| 256 | + * which <code>X509CRLs</code> may contain. The specified name is added to | |
| 257 | + * any previous value for the issuerNames criterion. If the specified name | |
| 258 | + * is a duplicate, it may be ignored. | |
| 259 | + * If a name is specified as a byte array, it should contain a single DER | |
| 260 | + * encoded distinguished name, as defined in X.501. The ASN.1 notation for | |
| 261 | + * this structure is as follows. | |
| 262 | + * <p> | |
| 263 | + * The name is provided as a byte array. This byte array should contain | |
| 264 | + * a single DER encoded distinguished name, as defined in X.501. The ASN.1 | |
| 265 | + * notation for this structure appears in the documentation for | |
| 266 | + * {@link #setIssuerNames setIssuerNames(Collection names)}. | |
| 267 | + * <p> | |
| 268 | + * Note that the byte array supplied here is cloned to protect against | |
| 269 | + * subsequent modifications. | |
| 270 | + * | |
| 271 | + * @param name a byte array containing the name in ASN.1 DER encoded form | |
| 272 | + * @throws IOException if a parsing error occurs | |
| 273 | + */ | |
| 274 | + public void addIssuerName(byte[] name) throws IOException { | |
| 275 | + // clone because byte arrays are modifiable | |
| 276 | + addIssuerNameInternal(name.clone(), new X500Name(name).asX500Principal()); | |
| 277 | + } | |
| 278 | + | |
| 279 | + /** | |
| 280 | + * A private method that adds a name (String or byte array) to the | |
| 281 | + * issuerNames criterion. The issuer distinguished | |
| 282 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 283 | + * distinguished names. | |
| 284 | + * | |
| 285 | + * @param name the name in string or byte array form | |
| 286 | + * @param principal the name in X500Principal form | |
| 287 | + * @throws IOException if a parsing error occurs | |
| 288 | + */ | |
| 289 | + private void addIssuerNameInternal(Object name, X500Principal principal) { | |
| 290 | + if (issuerNames == null) { | |
| 291 | + issuerNames = new HashSet<Object>(); | |
| 292 | + } | |
| 293 | + if (issuerX500Principals == null) { | |
| 294 | + issuerX500Principals = new HashSet<X500Principal>(); | |
| 295 | + } | |
| 296 | + issuerNames.add(name); | |
| 297 | + issuerX500Principals.add(principal); | |
| 298 | + } | |
| 299 | + | |
| 300 | + /** | |
| 301 | + * Clone and check an argument of the form passed to | |
| 302 | + * setIssuerNames. Throw an IOException if the argument is malformed. | |
| 303 | + * | |
| 304 | + * @param names a <code>Collection</code> of names. Each entry is a | |
| 305 | + * String or a byte array (the name, in string or ASN.1 | |
| 306 | + * DER encoded form, respectively). <code>null</code> is | |
| 307 | + * not an acceptable value. | |
| 308 | + * @return a deep copy of the specified <code>Collection</code> | |
| 309 | + * @throws IOException if a parsing error occurs | |
| 310 | + */ | |
| 311 | + private static HashSet<Object> cloneAndCheckIssuerNames(Collection<?> names) | |
| 312 | + throws IOException | |
| 313 | + { | |
| 314 | + HashSet<Object> namesCopy = new HashSet<Object>(); | |
| 315 | + Iterator<?> i = names.iterator(); | |
| 316 | + while (i.hasNext()) { | |
| 317 | + Object nameObject = i.next(); | |
| 318 | + if (!(nameObject instanceof byte []) && | |
| 319 | + !(nameObject instanceof String)) | |
| 320 | + throw new IOException("name not byte array or String"); | |
| 321 | + if (nameObject instanceof byte []) | |
| 322 | + namesCopy.add(((byte []) nameObject).clone()); | |
| 323 | + else | |
| 324 | + namesCopy.add(nameObject); | |
| 325 | + } | |
| 326 | + return(namesCopy); | |
| 327 | + } | |
| 328 | + | |
| 329 | + /** | |
| 330 | + * Clone an argument of the form passed to setIssuerNames. | |
| 331 | + * Throw a RuntimeException if the argument is malformed. | |
| 332 | + * <p> | |
| 333 | + * This method wraps cloneAndCheckIssuerNames, changing any IOException | |
| 334 | + * into a RuntimeException. This method should be used when the object being | |
| 335 | + * cloned has already been checked, so there should never be any exceptions. | |
| 336 | + * | |
| 337 | + * @param names a <code>Collection</code> of names. Each entry is a | |
| 338 | + * String or a byte array (the name, in string or ASN.1 | |
| 339 | + * DER encoded form, respectively). <code>null</code> is | |
| 340 | + * not an acceptable value. | |
| 341 | + * @return a deep copy of the specified <code>Collection</code> | |
| 342 | + * @throws RuntimeException if a parsing error occurs | |
| 343 | + */ | |
| 344 | + private static HashSet<Object> cloneIssuerNames(Collection<Object> names) { | |
| 345 | + try { | |
| 346 | + return cloneAndCheckIssuerNames(names); | |
| 347 | + } catch (IOException ioe) { | |
| 348 | + throw new RuntimeException(ioe); | |
| 349 | + } | |
| 350 | + } | |
| 351 | + | |
| 352 | + /** | |
| 353 | + * Parse an argument of the form passed to setIssuerNames, | |
| 354 | + * returning a Collection of issuerX500Principals. | |
| 355 | + * Throw an IOException if the argument is malformed. | |
| 356 | + * | |
| 357 | + * @param names a <code>Collection</code> of names. Each entry is a | |
| 358 | + * String or a byte array (the name, in string or ASN.1 | |
| 359 | + * DER encoded form, respectively). <Code>Null</Code> is | |
| 360 | + * not an acceptable value. | |
| 361 | + * @return a HashSet of issuerX500Principals | |
| 362 | + * @throws IOException if a parsing error occurs | |
| 363 | + */ | |
| 364 | + private static HashSet<X500Principal> parseIssuerNames(Collection<Object> names) | |
| 365 | + throws IOException { | |
| 366 | + HashSet<X500Principal> x500Principals = new HashSet<X500Principal>(); | |
| 367 | + for (Iterator<Object> t = names.iterator(); t.hasNext(); ) { | |
| 368 | + Object nameObject = t.next(); | |
| 369 | + if (nameObject instanceof String) { | |
| 370 | + x500Principals.add(new X500Name((String)nameObject).asX500Principal()); | |
| 371 | + } else { | |
| 372 | + try { | |
| 373 | + x500Principals.add(new X500Principal((byte[])nameObject)); | |
| 374 | + } catch (IllegalArgumentException e) { | |
| 375 | + throw (IOException)new IOException("Invalid name").initCause(e); | |
| 376 | + } | |
| 377 | + } | |
| 378 | + } | |
| 379 | + return x500Principals; | |
| 380 | + } | |
| 381 | + | |
| 382 | + /** | |
| 383 | + * Sets the minCRLNumber criterion. The <code>X509CRL</code> must have a | |
| 384 | + * CRL number extension whose value is greater than or equal to the | |
| 385 | + * specified value. If <code>null</code>, no minCRLNumber check will be | |
| 386 | + * done. | |
| 387 | + * | |
| 388 | + * @param minCRL the minimum CRL number accepted (or <code>null</code>) | |
| 389 | + */ | |
| 390 | + public void setMinCRLNumber(BigInteger minCRL) { | |
| 391 | + this.minCRL = minCRL; | |
| 392 | + } | |
| 393 | + | |
| 394 | + /** | |
| 395 | + * Sets the maxCRLNumber criterion. The <code>X509CRL</code> must have a | |
| 396 | + * CRL number extension whose value is less than or equal to the | |
| 397 | + * specified value. If <code>null</code>, no maxCRLNumber check will be | |
| 398 | + * done. | |
| 399 | + * | |
| 400 | + * @param maxCRL the maximum CRL number accepted (or <code>null</code>) | |
| 401 | + */ | |
| 402 | + public void setMaxCRLNumber(BigInteger maxCRL) { | |
| 403 | + this.maxCRL = maxCRL; | |
| 404 | + } | |
| 405 | + | |
| 406 | + /** | |
| 407 | + * Sets the dateAndTime criterion. The specified date must be | |
| 408 | + * equal to or later than the value of the thisUpdate component | |
| 409 | + * of the <code>X509CRL</code> and earlier than the value of the | |
| 410 | + * nextUpdate component. There is no match if the <code>X509CRL</code> | |
| 411 | + * does not contain a nextUpdate component. | |
| 412 | + * If <code>null</code>, no dateAndTime check will be done. | |
| 413 | + * <p> | |
| 414 | + * Note that the <code>Date</code> supplied here is cloned to protect | |
| 415 | + * against subsequent modifications. | |
| 416 | + * | |
| 417 | + * @param dateAndTime the <code>Date</code> to match against | |
| 418 | + * (or <code>null</code>) | |
| 419 | + * @see #getDateAndTime | |
| 420 | + */ | |
| 421 | + public void setDateAndTime(Date dateAndTime) { | |
| 422 | + if (dateAndTime == null) | |
| 423 | + this.dateAndTime = null; | |
| 424 | + else | |
| 425 | + this.dateAndTime = new Date(dateAndTime.getTime()); | |
| 426 | + this.skew = 0; | |
| 427 | + } | |
| 428 | + | |
| 429 | + /** | |
| 430 | + * Sets the dateAndTime criterion and allows for the specified clock skew | |
| 431 | + * (in milliseconds) when checking against the validity period of the CRL. | |
| 432 | + */ | |
| 433 | + void setDateAndTime(Date dateAndTime, long skew) { | |
| 434 | + this.dateAndTime = | |
| 435 | + (dateAndTime == null ? null : new Date(dateAndTime.getTime())); | |
| 436 | + this.skew = skew; | |
| 437 | + } | |
| 438 | + | |
| 439 | + /** | |
| 440 | + * Sets the certificate being checked. This is not a criterion. Rather, | |
| 441 | + * it is optional information that may help a <code>CertStore</code> | |
| 442 | + * find CRLs that would be relevant when checking revocation for the | |
| 443 | + * specified certificate. If <code>null</code> is specified, then no | |
| 444 | + * such optional information is provided. | |
| 445 | + * | |
| 446 | + * @param cert the <code>X509Certificate</code> being checked | |
| 447 | + * (or <code>null</code>) | |
| 448 | + * @see #getCertificateChecking | |
| 449 | + */ | |
| 450 | + public void setCertificateChecking(X509Certificate cert) { | |
| 451 | + certChecking = cert; | |
| 452 | + } | |
| 453 | + | |
| 454 | + /** | |
| 455 | + * Returns the issuerNames criterion. The issuer distinguished | |
| 456 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 457 | + * distinguished names. If the value returned is <code>null</code>, any | |
| 458 | + * issuer distinguished name will do. | |
| 459 | + * <p> | |
| 460 | + * If the value returned is not <code>null</code>, it is a | |
| 461 | + * unmodifiable <code>Collection</code> of <code>X500Principal</code>s. | |
| 462 | + * | |
| 463 | + * @return an unmodifiable <code>Collection</code> of names | |
| 464 | + * (or <code>null</code>) | |
| 465 | + * @see #setIssuers | |
| 466 | + * @since 1.5 | |
| 467 | + */ | |
| 468 | + public Collection<X500Principal> getIssuers() { | |
| 469 | + if (issuerX500Principals == null) { | |
| 470 | + return null; | |
| 471 | + } | |
| 472 | + return Collections.unmodifiableCollection(issuerX500Principals); | |
| 473 | + } | |
| 474 | + | |
| 475 | + /** | |
| 476 | + * Returns a copy of the issuerNames criterion. The issuer distinguished | |
| 477 | + * name in the <code>X509CRL</code> must match at least one of the specified | |
| 478 | + * distinguished names. If the value returned is <code>null</code>, any | |
| 479 | + * issuer distinguished name will do. | |
| 480 | + * <p> | |
| 481 | + * If the value returned is not <code>null</code>, it is a | |
| 482 | + * <code>Collection</code> of names. Each name is a <code>String</code> | |
| 483 | + * or a byte array representing a distinguished name (in RFC 2253 or | |
| 484 | + * ASN.1 DER encoded form, respectively). Note that the | |
| 485 | + * <code>Collection</code> returned may contain duplicate names. | |
| 486 | + * <p> | |
| 487 | + * If a name is specified as a byte array, it should contain a single DER | |
| 488 | + * encoded distinguished name, as defined in X.501. The ASN.1 notation for | |
| 489 | + * this structure is given in the documentation for | |
| 490 | + * {@link #setIssuerNames setIssuerNames(Collection names)}. | |
| 491 | + * <p> | |
| 492 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 493 | + * protect against subsequent modifications. | |
| 494 | + * | |
| 495 | + * @return a <code>Collection</code> of names (or <code>null</code>) | |
| 496 | + * @see #setIssuerNames | |
| 497 | + */ | |
| 498 | + public Collection<Object> getIssuerNames() { | |
| 499 | + if (issuerNames == null) { | |
| 500 | + return null; | |
| 501 | + } | |
| 502 | + return cloneIssuerNames(issuerNames); | |
| 503 | + } | |
| 504 | + | |
| 505 | + /** | |
| 506 | + * Returns the minCRLNumber criterion. The <code>X509CRL</code> must have a | |
| 507 | + * CRL number extension whose value is greater than or equal to the | |
| 508 | + * specified value. If <code>null</code>, no minCRLNumber check will be done. | |
| 509 | + * | |
| 510 | + * @return the minimum CRL number accepted (or <code>null</code>) | |
| 511 | + */ | |
| 512 | + public BigInteger getMinCRL() { | |
| 513 | + return minCRL; | |
| 514 | + } | |
| 515 | + | |
| 516 | + /** | |
| 517 | + * Returns the maxCRLNumber criterion. The <code>X509CRL</code> must have a | |
| 518 | + * CRL number extension whose value is less than or equal to the | |
| 519 | + * specified value. If <code>null</code>, no maxCRLNumber check will be | |
| 520 | + * done. | |
| 521 | + * | |
| 522 | + * @return the maximum CRL number accepted (or <code>null</code>) | |
| 523 | + */ | |
| 524 | + public BigInteger getMaxCRL() { | |
| 525 | + return maxCRL; | |
| 526 | + } | |
| 527 | + | |
| 528 | + /** | |
| 529 | + * Returns the dateAndTime criterion. The specified date must be | |
| 530 | + * equal to or later than the value of the thisUpdate component | |
| 531 | + * of the <code>X509CRL</code> and earlier than the value of the | |
| 532 | + * nextUpdate component. There is no match if the | |
| 533 | + * <code>X509CRL</code> does not contain a nextUpdate component. | |
| 534 | + * If <code>null</code>, no dateAndTime check will be done. | |
| 535 | + * <p> | |
| 536 | + * Note that the <code>Date</code> returned is cloned to protect against | |
| 537 | + * subsequent modifications. | |
| 538 | + * | |
| 539 | + * @return the <code>Date</code> to match against (or <code>null</code>) | |
| 540 | + * @see #setDateAndTime | |
| 541 | + */ | |
| 542 | + public Date getDateAndTime() { | |
| 543 | + if (dateAndTime == null) | |
| 544 | + return null; | |
| 545 | + return (Date) dateAndTime.clone(); | |
| 546 | + } | |
| 547 | + | |
| 548 | + /** | |
| 549 | + * Returns the certificate being checked. This is not a criterion. Rather, | |
| 550 | + * it is optional information that may help a <code>CertStore</code> | |
| 551 | + * find CRLs that would be relevant when checking revocation for the | |
| 552 | + * specified certificate. If the value returned is <code>null</code>, then | |
| 553 | + * no such optional information is provided. | |
| 554 | + * | |
| 555 | + * @return the certificate being checked (or <code>null</code>) | |
| 556 | + * @see #setCertificateChecking | |
| 557 | + */ | |
| 558 | + public X509Certificate getCertificateChecking() { | |
| 559 | + return certChecking; | |
| 560 | + } | |
| 561 | + | |
| 562 | + /** | |
| 563 | + * Returns a printable representation of the <code>X509CRLSelector</code>. | |
| 564 | + * | |
| 565 | + * @return a <code>String</code> describing the contents of the | |
| 566 | + * <code>X509CRLSelector</code>. | |
| 567 | + */ | |
| 568 | + public String toString() { | |
| 569 | + StringBuffer sb = new StringBuffer(); | |
| 570 | + sb.append("X509CRLSelector: [\n"); | |
| 571 | + if (issuerNames != null) { | |
| 572 | + sb.append(" IssuerNames:\n"); | |
| 573 | + Iterator<Object> i = issuerNames.iterator(); | |
| 574 | + while (i.hasNext()) | |
| 575 | + sb.append(" " + i.next() + "\n"); | |
| 576 | + } | |
| 577 | + if (minCRL != null) | |
| 578 | + sb.append(" minCRLNumber: " + minCRL + "\n"); | |
| 579 | + if (maxCRL != null) | |
| 580 | + sb.append(" maxCRLNumber: " + maxCRL + "\n"); | |
| 581 | + if (dateAndTime != null) | |
| 582 | + sb.append(" dateAndTime: " + dateAndTime + "\n"); | |
| 583 | + if (certChecking != null) | |
| 584 | + sb.append(" Certificate being checked: " + certChecking + "\n"); | |
| 585 | + sb.append("]"); | |
| 586 | + return sb.toString(); | |
| 587 | + } | |
| 588 | + | |
| 589 | + /** | |
| 590 | + * Decides whether a <code>CRL</code> should be selected. | |
| 591 | + * | |
| 592 | + * @param crl the <code>CRL</code> to be checked | |
| 593 | + * @return <code>true</code> if the <code>CRL</code> should be selected, | |
| 594 | + * <code>false</code> otherwise | |
| 595 | + */ | |
| 596 | + public boolean match(CRL crl) { | |
| 597 | + if (!(crl instanceof X509CRL)) { | |
| 598 | + return false; | |
| 599 | + } | |
| 600 | + X509CRL xcrl = (X509CRL)crl; | |
| 601 | + | |
| 602 | + /* match on issuer name */ | |
| 603 | + if (issuerNames != null) { | |
| 604 | + X500Principal issuer = xcrl.getIssuerX500Principal(); | |
| 605 | + Iterator<X500Principal> i = issuerX500Principals.iterator(); | |
| 606 | + boolean found = false; | |
| 607 | + while (!found && i.hasNext()) { | |
| 608 | + if (i.next().equals(issuer)) { | |
| 609 | + found = true; | |
| 610 | + } | |
| 611 | + } | |
| 612 | + if (!found) { | |
| 613 | + if (debug != null) { | |
| 614 | + debug.println("X509CRLSelector.match: issuer DNs " | |
| 615 | + + "don't match"); | |
| 616 | + } | |
| 617 | + return false; | |
| 618 | + } | |
| 619 | + } | |
| 620 | + | |
| 621 | + if ((minCRL != null) || (maxCRL != null)) { | |
| 622 | + /* Get CRL number extension from CRL */ | |
| 623 | + byte[] crlNumExtVal = xcrl.getExtensionValue("2.5.29.20"); | |
| 624 | + if (crlNumExtVal == null) { | |
| 625 | + if (debug != null) { | |
| 626 | + debug.println("X509CRLSelector.match: no CRLNumber"); | |
| 627 | + } | |
| 628 | + } | |
| 629 | + BigInteger crlNum; | |
| 630 | + try { | |
| 631 | + DerInputStream in = new DerInputStream(crlNumExtVal); | |
| 632 | + byte[] encoded = in.getOctetString(); | |
| 633 | + CRLNumberExtension crlNumExt = | |
| 634 | + new CRLNumberExtension(Boolean.FALSE, encoded); | |
| 635 | + crlNum = (BigInteger)crlNumExt.get(CRLNumberExtension.NUMBER); | |
| 636 | + } catch (IOException ex) { | |
| 637 | + if (debug != null) { | |
| 638 | + debug.println("X509CRLSelector.match: exception in " | |
| 639 | + + "decoding CRL number"); | |
| 640 | + } | |
| 641 | + return false; | |
| 642 | + } | |
| 643 | + | |
| 644 | + /* match on minCRLNumber */ | |
| 645 | + if (minCRL != null) { | |
| 646 | + if (crlNum.compareTo(minCRL) < 0) { | |
| 647 | + if (debug != null) { | |
| 648 | + debug.println("X509CRLSelector.match: CRLNumber too small"); | |
| 649 | + } | |
| 650 | + return false; | |
| 651 | + } | |
| 652 | + } | |
| 653 | + | |
| 654 | + /* match on maxCRLNumber */ | |
| 655 | + if (maxCRL != null) { | |
| 656 | + if (crlNum.compareTo(maxCRL) > 0) { | |
| 657 | + if (debug != null) { | |
| 658 | + debug.println("X509CRLSelector.match: CRLNumber too large"); | |
| 659 | + } | |
| 660 | + return false; | |
| 661 | + } | |
| 662 | + } | |
| 663 | + } | |
| 664 | + | |
| 665 | + | |
| 666 | + /* match on dateAndTime */ | |
| 667 | + if (dateAndTime != null) { | |
| 668 | + Date crlThisUpdate = xcrl.getThisUpdate(); | |
| 669 | + Date nextUpdate = xcrl.getNextUpdate(); | |
| 670 | + if (nextUpdate == null) { | |
| 671 | + if (debug != null) { | |
| 672 | + debug.println("X509CRLSelector.match: nextUpdate null"); | |
| 673 | + } | |
| 674 | + return false; | |
| 675 | + } | |
| 676 | + Date nowPlusSkew = dateAndTime; | |
| 677 | + Date nowMinusSkew = dateAndTime; | |
| 678 | + if (skew > 0) { | |
| 679 | + nowPlusSkew = new Date(dateAndTime.getTime() + skew); | |
| 680 | + nowMinusSkew = new Date(dateAndTime.getTime() - skew); | |
| 681 | + } | |
| 682 | + if (nowMinusSkew.after(nextUpdate) | |
| 683 | + || nowPlusSkew.before(crlThisUpdate)) { | |
| 684 | + if (debug != null) { | |
| 685 | + debug.println("X509CRLSelector.match: update out of range"); | |
| 686 | + } | |
| 687 | + return false; | |
| 688 | + } | |
| 689 | + } | |
| 690 | + | |
| 691 | + return true; | |
| 692 | + } | |
| 693 | + | |
| 694 | + /** | |
| 695 | + * Returns a copy of this object. | |
| 696 | + * | |
| 697 | + * @return the copy | |
| 698 | + */ | |
| 699 | + public Object clone() { | |
| 700 | + try { | |
| 701 | + X509CRLSelector copy = (X509CRLSelector)super.clone(); | |
| 702 | + if (issuerNames != null) { | |
| 703 | + copy.issuerNames = | |
| 704 | + new HashSet<Object>(issuerNames); | |
| 705 | + copy.issuerX500Principals = | |
| 706 | + new HashSet<X500Principal>(issuerX500Principals); | |
| 707 | + } | |
| 708 | + return copy; | |
| 709 | + } catch (CloneNotSupportedException e) { | |
| 710 | + /* Cannot happen */ | |
| 711 | + throw new InternalError(e.toString()); | |
| 712 | + } | |
| 713 | + } | |
| 714 | +} | |
Binary file not shown.
| @@ -0,0 +1,2638 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.io.IOException; | |
| 29 | +import java.math.BigInteger; | |
| 30 | +import java.security.PublicKey; | |
| 31 | +import java.util.*; | |
| 32 | +import javax.security.auth.x500.X500Principal; | |
| 33 | + | |
| 34 | +import sun.misc.HexDumpEncoder; | |
| 35 | +import sun.security.util.Debug; | |
| 36 | +import sun.security.util.DerInputStream; | |
| 37 | +import sun.security.util.DerValue; | |
| 38 | +import sun.security.util.ObjectIdentifier; | |
| 39 | +import sun.security.x509.*; | |
| 40 | + | |
| 41 | +/** | |
| 42 | + * A <code>CertSelector</code> that selects <code>X509Certificates</code> that | |
| 43 | + * match all specified criteria. This class is particularly useful when | |
| 44 | + * selecting certificates from a <code>CertStore</code> to build a | |
| 45 | + * PKIX-compliant certification path. | |
| 46 | + * <p> | |
| 47 | + * When first constructed, an <code>X509CertSelector</code> has no criteria | |
| 48 | + * enabled and each of the <code>get</code> methods return a default value | |
| 49 | + * (<code>null</code>, or <code>-1</code> for the {@link #getBasicConstraints | |
| 50 | + * getBasicConstraints} method). Therefore, the {@link #match match} | |
| 51 | + * method would return <code>true</code> for any <code>X509Certificate</code>. | |
| 52 | + * Typically, several criteria are enabled (by calling | |
| 53 | + * {@link #setIssuer setIssuer} or | |
| 54 | + * {@link #setKeyUsage setKeyUsage}, for instance) and then the | |
| 55 | + * <code>X509CertSelector</code> is passed to | |
| 56 | + * {@link CertStore#getCertificates CertStore.getCertificates} or some similar | |
| 57 | + * method. | |
| 58 | + * <p> | |
| 59 | + * Several criteria can be enabled (by calling {@link #setIssuer setIssuer} | |
| 60 | + * and {@link #setSerialNumber setSerialNumber}, | |
| 61 | + * for example) such that the <code>match</code> method | |
| 62 | + * usually uniquely matches a single <code>X509Certificate</code>. We say | |
| 63 | + * usually, since it is possible for two issuing CAs to have the same | |
| 64 | + * distinguished name and each issue a certificate with the same serial | |
| 65 | + * number. Other unique combinations include the issuer, subject, | |
| 66 | + * subjectKeyIdentifier and/or the subjectPublicKey criteria. | |
| 67 | + * <p> | |
| 68 | + * Please refer to <a href="http://www.ietf.org/rfc/rfc3280.txt">RFC 3280: | |
| 69 | + * Internet X.509 Public Key Infrastructure Certificate and CRL Profile</a> for | |
| 70 | + * definitions of the X.509 certificate extensions mentioned below. | |
| 71 | + * <p> | |
| 72 | + * <b>Concurrent Access</b> | |
| 73 | + * <p> | |
| 74 | + * Unless otherwise specified, the methods defined in this class are not | |
| 75 | + * thread-safe. Multiple threads that need to access a single | |
| 76 | + * object concurrently should synchronize amongst themselves and | |
| 77 | + * provide the necessary locking. Multiple threads each manipulating | |
| 78 | + * separate objects need not synchronize. | |
| 79 | + * | |
| 80 | + * @see CertSelector | |
| 81 | + * @see X509Certificate | |
| 82 | + * | |
| 83 | + * @since 1.4 | |
| 84 | + * @author Steve Hanna | |
| 85 | + */ | |
| 86 | +public class X509CertSelector implements CertSelector { | |
| 87 | + | |
| 88 | + private static final Debug debug = Debug.getInstance("certpath"); | |
| 89 | + | |
| 90 | + private final static ObjectIdentifier ANY_EXTENDED_KEY_USAGE = | |
| 91 | + ObjectIdentifier.newInternal(new int[] {2, 5, 29, 37, 0}); | |
| 92 | + | |
| 93 | + static { | |
| 94 | + CertPathHelperImpl.initialize(); | |
| 95 | + } | |
| 96 | + | |
| 97 | + private BigInteger serialNumber; | |
| 98 | + private X500Principal issuer; | |
| 99 | + private X500Principal subject; | |
| 100 | + private byte[] subjectKeyID; | |
| 101 | + private byte[] authorityKeyID; | |
| 102 | + private Date certificateValid; | |
| 103 | + private Date privateKeyValid; | |
| 104 | + private ObjectIdentifier subjectPublicKeyAlgID; | |
| 105 | + private PublicKey subjectPublicKey; | |
| 106 | + private byte[] subjectPublicKeyBytes; | |
| 107 | + private boolean[] keyUsage; | |
| 108 | + private Set<String> keyPurposeSet; | |
| 109 | + private Set<ObjectIdentifier> keyPurposeOIDSet; | |
| 110 | + private Set<List<?>> subjectAlternativeNames; | |
| 111 | + private Set<GeneralNameInterface> subjectAlternativeGeneralNames; | |
| 112 | + private CertificatePolicySet policy; | |
| 113 | + private Set<String> policySet; | |
| 114 | + private Set<List<?>> pathToNames; | |
| 115 | + private Set<GeneralNameInterface> pathToGeneralNames; | |
| 116 | + private NameConstraintsExtension nc; | |
| 117 | + private byte[] ncBytes; | |
| 118 | + private int basicConstraints = -1; | |
| 119 | + private X509Certificate x509Cert; | |
| 120 | + private boolean matchAllSubjectAltNames = true; | |
| 121 | + | |
| 122 | + private static final Boolean FALSE = Boolean.FALSE; | |
| 123 | + | |
| 124 | + private static final int PRIVATE_KEY_USAGE_ID = 0; | |
| 125 | + private static final int SUBJECT_ALT_NAME_ID = 1; | |
| 126 | + private static final int NAME_CONSTRAINTS_ID = 2; | |
| 127 | + private static final int CERT_POLICIES_ID = 3; | |
| 128 | + private static final int EXTENDED_KEY_USAGE_ID = 4; | |
| 129 | + private static final int NUM_OF_EXTENSIONS = 5; | |
| 130 | + private static final String[] EXTENSION_OIDS = new String[NUM_OF_EXTENSIONS]; | |
| 131 | + | |
| 132 | + static { | |
| 133 | + EXTENSION_OIDS[PRIVATE_KEY_USAGE_ID] = "2.5.29.16"; | |
| 134 | + EXTENSION_OIDS[SUBJECT_ALT_NAME_ID] = "2.5.29.17"; | |
| 135 | + EXTENSION_OIDS[NAME_CONSTRAINTS_ID] = "2.5.29.30"; | |
| 136 | + EXTENSION_OIDS[CERT_POLICIES_ID] = "2.5.29.32"; | |
| 137 | + EXTENSION_OIDS[EXTENDED_KEY_USAGE_ID] = "2.5.29.37"; | |
| 138 | + }; | |
| 139 | + | |
| 140 | + /* Constants representing the GeneralName types */ | |
| 141 | + static final int NAME_ANY = 0; | |
| 142 | + static final int NAME_RFC822 = 1; | |
| 143 | + static final int NAME_DNS = 2; | |
| 144 | + static final int NAME_X400 = 3; | |
| 145 | + static final int NAME_DIRECTORY = 4; | |
| 146 | + static final int NAME_EDI = 5; | |
| 147 | + static final int NAME_URI = 6; | |
| 148 | + static final int NAME_IP = 7; | |
| 149 | + static final int NAME_OID = 8; | |
| 150 | + | |
| 151 | + /** | |
| 152 | + * Creates an <code>X509CertSelector</code>. Initially, no criteria are set | |
| 153 | + * so any <code>X509Certificate</code> will match. | |
| 154 | + */ | |
| 155 | + public X509CertSelector() { | |
| 156 | + // empty | |
| 157 | + } | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * Sets the certificateEquals criterion. The specified | |
| 161 | + * <code>X509Certificate</code> must be equal to the | |
| 162 | + * <code>X509Certificate</code> passed to the <code>match</code> method. | |
| 163 | + * If <code>null</code>, then this check is not applied. | |
| 164 | + * | |
| 165 | + * <p>This method is particularly useful when it is necessary to | |
| 166 | + * match a single certificate. Although other criteria can be specified | |
| 167 | + * in conjunction with the certificateEquals criterion, it is usually not | |
| 168 | + * practical or necessary. | |
| 169 | + * | |
| 170 | + * @param cert the <code>X509Certificate</code> to match (or | |
| 171 | + * <code>null</code>) | |
| 172 | + * @see #getCertificate | |
| 173 | + */ | |
| 174 | + public void setCertificate(X509Certificate cert) { | |
| 175 | + x509Cert = cert; | |
| 176 | + } | |
| 177 | + | |
| 178 | + /** | |
| 179 | + * Sets the serialNumber criterion. The specified serial number | |
| 180 | + * must match the certificate serial number in the | |
| 181 | + * <code>X509Certificate</code>. If <code>null</code>, any certificate | |
| 182 | + * serial number will do. | |
| 183 | + * | |
| 184 | + * @param serial the certificate serial number to match | |
| 185 | + * (or <code>null</code>) | |
| 186 | + * @see #getSerialNumber | |
| 187 | + */ | |
| 188 | + public void setSerialNumber(BigInteger serial) { | |
| 189 | + serialNumber = serial; | |
| 190 | + } | |
| 191 | + | |
| 192 | + /** | |
| 193 | + * Sets the issuer criterion. The specified distinguished name | |
| 194 | + * must match the issuer distinguished name in the | |
| 195 | + * <code>X509Certificate</code>. If <code>null</code>, any issuer | |
| 196 | + * distinguished name will do. | |
| 197 | + * | |
| 198 | + * @param issuer a distinguished name as X500Principal | |
| 199 | + * (or <code>null</code>) | |
| 200 | + * @since 1.5 | |
| 201 | + */ | |
| 202 | + public void setIssuer(X500Principal issuer) { | |
| 203 | + this.issuer = issuer; | |
| 204 | + } | |
| 205 | + | |
| 206 | + /** | |
| 207 | + * <strong>Denigrated</strong>, use {@linkplain #setIssuer(X500Principal)} | |
| 208 | + * or {@linkplain #setIssuer(byte[])} instead. This method should not be | |
| 209 | + * relied on as it can fail to match some certificates because of a loss of | |
| 210 | + * encoding information in the | |
| 211 | + * <a href="http://www.ietf.org/rfc/rfc2253.txt">RFC 2253</a> String form | |
| 212 | + * of some distinguished names. | |
| 213 | + * <p> | |
| 214 | + * Sets the issuer criterion. The specified distinguished name | |
| 215 | + * must match the issuer distinguished name in the | |
| 216 | + * <code>X509Certificate</code>. If <code>null</code>, any issuer | |
| 217 | + * distinguished name will do. | |
| 218 | + * <p> | |
| 219 | + * If <code>issuerDN</code> is not <code>null</code>, it should contain a | |
| 220 | + * distinguished name, in RFC 2253 format. | |
| 221 | + * | |
| 222 | + * @param issuerDN a distinguished name in RFC 2253 format | |
| 223 | + * (or <code>null</code>) | |
| 224 | + * @throws IOException if a parsing error occurs (incorrect form for DN) | |
| 225 | + */ | |
| 226 | + public void setIssuer(String issuerDN) throws IOException { | |
| 227 | + if (issuerDN == null) { | |
| 228 | + issuer = null; | |
| 229 | + } else { | |
| 230 | + issuer = new X500Name(issuerDN).asX500Principal(); | |
| 231 | + } | |
| 232 | + } | |
| 233 | + | |
| 234 | + /** | |
| 235 | + * Sets the issuer criterion. The specified distinguished name | |
| 236 | + * must match the issuer distinguished name in the | |
| 237 | + * <code>X509Certificate</code>. If <code>null</code> is specified, | |
| 238 | + * the issuer criterion is disabled and any issuer distinguished name will | |
| 239 | + * do. | |
| 240 | + * <p> | |
| 241 | + * If <code>issuerDN</code> is not <code>null</code>, it should contain a | |
| 242 | + * single DER encoded distinguished name, as defined in X.501. The ASN.1 | |
| 243 | + * notation for this structure is as follows. | |
| 244 | + * <pre><code> | |
| 245 | + * Name ::= CHOICE { | |
| 246 | + * RDNSequence } | |
| 247 | + * | |
| 248 | + * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName | |
| 249 | + * | |
| 250 | + * RelativeDistinguishedName ::= | |
| 251 | + * SET SIZE (1 .. MAX) OF AttributeTypeAndValue | |
| 252 | + * | |
| 253 | + * AttributeTypeAndValue ::= SEQUENCE { | |
| 254 | + * type AttributeType, | |
| 255 | + * value AttributeValue } | |
| 256 | + * | |
| 257 | + * AttributeType ::= OBJECT IDENTIFIER | |
| 258 | + * | |
| 259 | + * AttributeValue ::= ANY DEFINED BY AttributeType | |
| 260 | + * .... | |
| 261 | + * DirectoryString ::= CHOICE { | |
| 262 | + * teletexString TeletexString (SIZE (1..MAX)), | |
| 263 | + * printableString PrintableString (SIZE (1..MAX)), | |
| 264 | + * universalString UniversalString (SIZE (1..MAX)), | |
| 265 | + * utf8String UTF8String (SIZE (1.. MAX)), | |
| 266 | + * bmpString BMPString (SIZE (1..MAX)) } | |
| 267 | + * </code></pre> | |
| 268 | + * <p> | |
| 269 | + * Note that the byte array specified here is cloned to protect against | |
| 270 | + * subsequent modifications. | |
| 271 | + * | |
| 272 | + * @param issuerDN a byte array containing the distinguished name | |
| 273 | + * in ASN.1 DER encoded form (or <code>null</code>) | |
| 274 | + * @throws IOException if an encoding error occurs (incorrect form for DN) | |
| 275 | + */ | |
| 276 | + public void setIssuer(byte[] issuerDN) throws IOException { | |
| 277 | + try { | |
| 278 | + issuer = (issuerDN == null ? null : new X500Principal(issuerDN)); | |
| 279 | + } catch (IllegalArgumentException e) { | |
| 280 | + throw (IOException)new IOException("Invalid name").initCause(e); | |
| 281 | + } | |
| 282 | + } | |
| 283 | + | |
| 284 | + /** | |
| 285 | + * Sets the subject criterion. The specified distinguished name | |
| 286 | + * must match the subject distinguished name in the | |
| 287 | + * <code>X509Certificate</code>. If <code>null</code>, any subject | |
| 288 | + * distinguished name will do. | |
| 289 | + * | |
| 290 | + * @param subject a distinguished name as X500Principal | |
| 291 | + * (or <code>null</code>) | |
| 292 | + * @since 1.5 | |
| 293 | + */ | |
| 294 | + public void setSubject(X500Principal subject) { | |
| 295 | + this.subject = subject; | |
| 296 | + } | |
| 297 | + | |
| 298 | + /** | |
| 299 | + * <strong>Denigrated</strong>, use {@linkplain #setSubject(X500Principal)} | |
| 300 | + * or {@linkplain #setSubject(byte[])} instead. This method should not be | |
| 301 | + * relied on as it can fail to match some certificates because of a loss of | |
| 302 | + * encoding information in the RFC 2253 String form of some distinguished | |
| 303 | + * names. | |
| 304 | + * <p> | |
| 305 | + * Sets the subject criterion. The specified distinguished name | |
| 306 | + * must match the subject distinguished name in the | |
| 307 | + * <code>X509Certificate</code>. If <code>null</code>, any subject | |
| 308 | + * distinguished name will do. | |
| 309 | + * <p> | |
| 310 | + * If <code>subjectDN</code> is not <code>null</code>, it should contain a | |
| 311 | + * distinguished name, in RFC 2253 format. | |
| 312 | + * | |
| 313 | + * @param subjectDN a distinguished name in RFC 2253 format | |
| 314 | + * (or <code>null</code>) | |
| 315 | + * @throws IOException if a parsing error occurs (incorrect form for DN) | |
| 316 | + */ | |
| 317 | + public void setSubject(String subjectDN) throws IOException { | |
| 318 | + if (subjectDN == null) { | |
| 319 | + subject = null; | |
| 320 | + } else { | |
| 321 | + subject = new X500Name(subjectDN).asX500Principal(); | |
| 322 | + } | |
| 323 | + } | |
| 324 | + | |
| 325 | + /** | |
| 326 | + * Sets the subject criterion. The specified distinguished name | |
| 327 | + * must match the subject distinguished name in the | |
| 328 | + * <code>X509Certificate</code>. If <code>null</code>, any subject | |
| 329 | + * distinguished name will do. | |
| 330 | + * <p> | |
| 331 | + * If <code>subjectDN</code> is not <code>null</code>, it should contain a | |
| 332 | + * single DER encoded distinguished name, as defined in X.501. For the ASN.1 | |
| 333 | + * notation for this structure, see | |
| 334 | + * {@link #setIssuer(byte [] issuerDN) setIssuer(byte [] issuerDN)}. | |
| 335 | + * | |
| 336 | + * @param subjectDN a byte array containing the distinguished name in | |
| 337 | + * ASN.1 DER format (or <code>null</code>) | |
| 338 | + * @throws IOException if an encoding error occurs (incorrect form for DN) | |
| 339 | + */ | |
| 340 | + public void setSubject(byte[] subjectDN) throws IOException { | |
| 341 | + try { | |
| 342 | + subject = (subjectDN == null ? null : new X500Principal(subjectDN)); | |
| 343 | + } catch (IllegalArgumentException e) { | |
| 344 | + throw (IOException)new IOException("Invalid name").initCause(e); | |
| 345 | + } | |
| 346 | + } | |
| 347 | + | |
| 348 | + /** | |
| 349 | + * Sets the subjectKeyIdentifier criterion. The | |
| 350 | + * <code>X509Certificate</code> must contain a SubjectKeyIdentifier | |
| 351 | + * extension for which the contents of the extension | |
| 352 | + * matches the specified criterion value. | |
| 353 | + * If the criterion value is <code>null</code>, no | |
| 354 | + * subjectKeyIdentifier check will be done. | |
| 355 | + * <p> | |
| 356 | + * If <code>subjectKeyID</code> is not <code>null</code>, it | |
| 357 | + * should contain a single DER encoded value corresponding to the contents | |
| 358 | + * of the extension value (not including the object identifier, | |
| 359 | + * criticality setting, and encapsulating OCTET STRING) | |
| 360 | + * for a SubjectKeyIdentifier extension. | |
| 361 | + * The ASN.1 notation for this structure follows. | |
| 362 | + * <p> | |
| 363 | + * <pre><code> | |
| 364 | + * SubjectKeyIdentifier ::= KeyIdentifier | |
| 365 | + * | |
| 366 | + * KeyIdentifier ::= OCTET STRING | |
| 367 | + * </code></pre> | |
| 368 | + * <p> | |
| 369 | + * Since the format of subject key identifiers is not mandated by | |
| 370 | + * any standard, subject key identifiers are not parsed by the | |
| 371 | + * <code>X509CertSelector</code>. Instead, the values are compared using | |
| 372 | + * a byte-by-byte comparison. | |
| 373 | + * <p> | |
| 374 | + * Note that the byte array supplied here is cloned to protect against | |
| 375 | + * subsequent modifications. | |
| 376 | + * | |
| 377 | + * @param subjectKeyID the subject key identifier (or <code>null</code>) | |
| 378 | + * @see #getSubjectKeyIdentifier | |
| 379 | + */ | |
| 380 | + public void setSubjectKeyIdentifier(byte[] subjectKeyID) { | |
| 381 | + if (subjectKeyID == null) { | |
| 382 | + this.subjectKeyID = null; | |
| 383 | + } else { | |
| 384 | + this.subjectKeyID = subjectKeyID.clone(); | |
| 385 | + } | |
| 386 | + } | |
| 387 | + | |
| 388 | + /** | |
| 389 | + * Sets the authorityKeyIdentifier criterion. The | |
| 390 | + * <code>X509Certificate</code> must contain an | |
| 391 | + * AuthorityKeyIdentifier extension for which the contents of the | |
| 392 | + * extension value matches the specified criterion value. | |
| 393 | + * If the criterion value is <code>null</code>, no | |
| 394 | + * authorityKeyIdentifier check will be done. | |
| 395 | + * <p> | |
| 396 | + * If <code>authorityKeyID</code> is not <code>null</code>, it | |
| 397 | + * should contain a single DER encoded value corresponding to the contents | |
| 398 | + * of the extension value (not including the object identifier, | |
| 399 | + * criticality setting, and encapsulating OCTET STRING) | |
| 400 | + * for an AuthorityKeyIdentifier extension. | |
| 401 | + * The ASN.1 notation for this structure follows. | |
| 402 | + * <p> | |
| 403 | + * <pre><code> | |
| 404 | + * AuthorityKeyIdentifier ::= SEQUENCE { | |
| 405 | + * keyIdentifier [0] KeyIdentifier OPTIONAL, | |
| 406 | + * authorityCertIssuer [1] GeneralNames OPTIONAL, | |
| 407 | + * authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } | |
| 408 | + * | |
| 409 | + * KeyIdentifier ::= OCTET STRING | |
| 410 | + * </code></pre> | |
| 411 | + * <p> | |
| 412 | + * Authority key identifiers are not parsed by the | |
| 413 | + * <code>X509CertSelector</code>. Instead, the values are | |
| 414 | + * compared using a byte-by-byte comparison. | |
| 415 | + * <p> | |
| 416 | + * When the <code>keyIdentifier</code> field of | |
| 417 | + * <code>AuthorityKeyIdentifier</code> is populated, the value is | |
| 418 | + * usually taken from the <code>SubjectKeyIdentifier</code> extension | |
| 419 | + * in the issuer's certificate. Note, however, that the result of | |
| 420 | + * <code>X509Certificate.getExtensionValue(<SubjectKeyIdentifier Object | |
| 421 | + * Identifier>)</code> on the issuer's certificate may NOT be used | |
| 422 | + * directly as the input to <code>setAuthorityKeyIdentifier</code>. | |
| 423 | + * This is because the SubjectKeyIdentifier contains | |
| 424 | + * only a KeyIdentifier OCTET STRING, and not a SEQUENCE of | |
| 425 | + * KeyIdentifier, GeneralNames, and CertificateSerialNumber. | |
| 426 | + * In order to use the extension value of the issuer certificate's | |
| 427 | + * <code>SubjectKeyIdentifier</code> | |
| 428 | + * extension, it will be necessary to extract the value of the embedded | |
| 429 | + * <code>KeyIdentifier</code> OCTET STRING, then DER encode this OCTET | |
| 430 | + * STRING inside a SEQUENCE. | |
| 431 | + * For more details on SubjectKeyIdentifier, see | |
| 432 | + * {@link #setSubjectKeyIdentifier(byte[] subjectKeyID)}. | |
| 433 | + * <p> | |
| 434 | + * Note also that the byte array supplied here is cloned to protect against | |
| 435 | + * subsequent modifications. | |
| 436 | + * | |
| 437 | + * @param authorityKeyID the authority key identifier | |
| 438 | + * (or <code>null</code>) | |
| 439 | + * @see #getAuthorityKeyIdentifier | |
| 440 | + */ | |
| 441 | + public void setAuthorityKeyIdentifier(byte[] authorityKeyID) { | |
| 442 | + if (authorityKeyID == null) { | |
| 443 | + this.authorityKeyID = null; | |
| 444 | + } else { | |
| 445 | + this.authorityKeyID = authorityKeyID.clone(); | |
| 446 | + } | |
| 447 | + } | |
| 448 | + | |
| 449 | + /** | |
| 450 | + * Sets the certificateValid criterion. The specified date must fall | |
| 451 | + * within the certificate validity period for the | |
| 452 | + * <code>X509Certificate</code>. If <code>null</code>, no certificateValid | |
| 453 | + * check will be done. | |
| 454 | + * <p> | |
| 455 | + * Note that the <code>Date</code> supplied here is cloned to protect | |
| 456 | + * against subsequent modifications. | |
| 457 | + * | |
| 458 | + * @param certValid the <code>Date</code> to check (or <code>null</code>) | |
| 459 | + * @see #getCertificateValid | |
| 460 | + */ | |
| 461 | + public void setCertificateValid(Date certValid) { | |
| 462 | + if (certValid == null) { | |
| 463 | + certificateValid = null; | |
| 464 | + } else { | |
| 465 | + certificateValid = (Date)certValid.clone(); | |
| 466 | + } | |
| 467 | + } | |
| 468 | + | |
| 469 | + /** | |
| 470 | + * Sets the privateKeyValid criterion. The specified date must fall | |
| 471 | + * within the private key validity period for the | |
| 472 | + * <code>X509Certificate</code>. If <code>null</code>, no privateKeyValid | |
| 473 | + * check will be done. | |
| 474 | + * <p> | |
| 475 | + * Note that the <code>Date</code> supplied here is cloned to protect | |
| 476 | + * against subsequent modifications. | |
| 477 | + * | |
| 478 | + * @param privateKeyValid the <code>Date</code> to check (or | |
| 479 | + * <code>null</code>) | |
| 480 | + * @see #getPrivateKeyValid | |
| 481 | + */ | |
| 482 | + public void setPrivateKeyValid(Date privateKeyValid) { | |
| 483 | + if (privateKeyValid == null) { | |
| 484 | + this.privateKeyValid = null; | |
| 485 | + } else { | |
| 486 | + this.privateKeyValid = (Date)privateKeyValid.clone(); | |
| 487 | + } | |
| 488 | + } | |
| 489 | + | |
| 490 | + /** | |
| 491 | + * Sets the subjectPublicKeyAlgID criterion. The | |
| 492 | + * <code>X509Certificate</code> must contain a subject public key | |
| 493 | + * with the specified algorithm. If <code>null</code>, no | |
| 494 | + * subjectPublicKeyAlgID check will be done. | |
| 495 | + * | |
| 496 | + * @param oid The object identifier (OID) of the algorithm to check | |
| 497 | + * for (or <code>null</code>). An OID is represented by a | |
| 498 | + * set of nonnegative integers separated by periods. | |
| 499 | + * @throws IOException if the OID is invalid, such as | |
| 500 | + * the first component being not 0, 1 or 2 or the second component | |
| 501 | + * being greater than 39. | |
| 502 | + * | |
| 503 | + * @see #getSubjectPublicKeyAlgID | |
| 504 | + */ | |
| 505 | + public void setSubjectPublicKeyAlgID(String oid) throws IOException { | |
| 506 | + if (oid == null) { | |
| 507 | + subjectPublicKeyAlgID = null; | |
| 508 | + } else { | |
| 509 | + subjectPublicKeyAlgID = new ObjectIdentifier(oid); | |
| 510 | + } | |
| 511 | + } | |
| 512 | + | |
| 513 | + /** | |
| 514 | + * Sets the subjectPublicKey criterion. The | |
| 515 | + * <code>X509Certificate</code> must contain the specified subject public | |
| 516 | + * key. If <code>null</code>, no subjectPublicKey check will be done. | |
| 517 | + * | |
| 518 | + * @param key the subject public key to check for (or <code>null</code>) | |
| 519 | + * @see #getSubjectPublicKey | |
| 520 | + */ | |
| 521 | + public void setSubjectPublicKey(PublicKey key) { | |
| 522 | + if (key == null) { | |
| 523 | + subjectPublicKey = null; | |
| 524 | + subjectPublicKeyBytes = null; | |
| 525 | + } else { | |
| 526 | + subjectPublicKey = key; | |
| 527 | + subjectPublicKeyBytes = key.getEncoded(); | |
| 528 | + } | |
| 529 | + } | |
| 530 | + | |
| 531 | + /** | |
| 532 | + * Sets the subjectPublicKey criterion. The <code>X509Certificate</code> | |
| 533 | + * must contain the specified subject public key. If <code>null</code>, | |
| 534 | + * no subjectPublicKey check will be done. | |
| 535 | + * <p> | |
| 536 | + * Because this method allows the public key to be specified as a byte | |
| 537 | + * array, it may be used for unknown key types. | |
| 538 | + * <p> | |
| 539 | + * If <code>key</code> is not <code>null</code>, it should contain a | |
| 540 | + * single DER encoded SubjectPublicKeyInfo structure, as defined in X.509. | |
| 541 | + * The ASN.1 notation for this structure is as follows. | |
| 542 | + * <pre><code> | |
| 543 | + * SubjectPublicKeyInfo ::= SEQUENCE { | |
| 544 | + * algorithm AlgorithmIdentifier, | |
| 545 | + * subjectPublicKey BIT STRING } | |
| 546 | + * | |
| 547 | + * AlgorithmIdentifier ::= SEQUENCE { | |
| 548 | + * algorithm OBJECT IDENTIFIER, | |
| 549 | + * parameters ANY DEFINED BY algorithm OPTIONAL } | |
| 550 | + * -- contains a value of the type | |
| 551 | + * -- registered for use with the | |
| 552 | + * -- algorithm object identifier value | |
| 553 | + * </code></pre> | |
| 554 | + * <p> | |
| 555 | + * Note that the byte array supplied here is cloned to protect against | |
| 556 | + * subsequent modifications. | |
| 557 | + * | |
| 558 | + * @param key a byte array containing the subject public key in ASN.1 DER | |
| 559 | + * form (or <code>null</code>) | |
| 560 | + * @throws IOException if an encoding error occurs (incorrect form for | |
| 561 | + * subject public key) | |
| 562 | + * @see #getSubjectPublicKey | |
| 563 | + */ | |
| 564 | + public void setSubjectPublicKey(byte[] key) throws IOException { | |
| 565 | + if (key == null) { | |
| 566 | + subjectPublicKey = null; | |
| 567 | + subjectPublicKeyBytes = null; | |
| 568 | + } else { | |
| 569 | + subjectPublicKeyBytes = key.clone(); | |
| 570 | + subjectPublicKey = X509Key.parse(new DerValue(subjectPublicKeyBytes)); | |
| 571 | + } | |
| 572 | + } | |
| 573 | + | |
| 574 | + /** | |
| 575 | + * Sets the keyUsage criterion. The <code>X509Certificate</code> | |
| 576 | + * must allow the specified keyUsage values. If <code>null</code>, no | |
| 577 | + * keyUsage check will be done. Note that an <code>X509Certificate</code> | |
| 578 | + * that has no keyUsage extension implicitly allows all keyUsage values. | |
| 579 | + * <p> | |
| 580 | + * Note that the boolean array supplied here is cloned to protect against | |
| 581 | + * subsequent modifications. | |
| 582 | + * | |
| 583 | + * @param keyUsage a boolean array in the same format as the boolean | |
| 584 | + * array returned by | |
| 585 | + * {@link X509Certificate#getKeyUsage() X509Certificate.getKeyUsage()}. | |
| 586 | + * Or <code>null</code>. | |
| 587 | + * @see #getKeyUsage | |
| 588 | + */ | |
| 589 | + public void setKeyUsage(boolean[] keyUsage) { | |
| 590 | + if (keyUsage == null) { | |
| 591 | + this.keyUsage = null; | |
| 592 | + } else { | |
| 593 | + this.keyUsage = keyUsage.clone(); | |
| 594 | + } | |
| 595 | + } | |
| 596 | + | |
| 597 | + /** | |
| 598 | + * Sets the extendedKeyUsage criterion. The <code>X509Certificate</code> | |
| 599 | + * must allow the specified key purposes in its extended key usage | |
| 600 | + * extension. If <code>keyPurposeSet</code> is empty or <code>null</code>, | |
| 601 | + * no extendedKeyUsage check will be done. Note that an | |
| 602 | + * <code>X509Certificate</code> that has no extendedKeyUsage extension | |
| 603 | + * implicitly allows all key purposes. | |
| 604 | + * <p> | |
| 605 | + * Note that the <code>Set</code> is cloned to protect against | |
| 606 | + * subsequent modifications. | |
| 607 | + * | |
| 608 | + * @param keyPurposeSet a <code>Set</code> of key purpose OIDs in string | |
| 609 | + * format (or <code>null</code>). Each OID is represented by a set of | |
| 610 | + * nonnegative integers separated by periods. | |
| 611 | + * @throws IOException if the OID is invalid, such as | |
| 612 | + * the first component being not 0, 1 or 2 or the second component | |
| 613 | + * being greater than 39. | |
| 614 | + * @see #getExtendedKeyUsage | |
| 615 | + */ | |
| 616 | + public void setExtendedKeyUsage(Set<String> keyPurposeSet) throws IOException { | |
| 617 | + if ((keyPurposeSet == null) || keyPurposeSet.isEmpty()) { | |
| 618 | + this.keyPurposeSet = null; | |
| 619 | + keyPurposeOIDSet = null; | |
| 620 | + } else { | |
| 621 | + this.keyPurposeSet = | |
| 622 | + Collections.unmodifiableSet(new HashSet<String>(keyPurposeSet)); | |
| 623 | + keyPurposeOIDSet = new HashSet<ObjectIdentifier>(); | |
| 624 | + for (String s : this.keyPurposeSet) { | |
| 625 | + keyPurposeOIDSet.add(new ObjectIdentifier(s)); | |
| 626 | + } | |
| 627 | + } | |
| 628 | + } | |
| 629 | + | |
| 630 | + /** | |
| 631 | + * Enables/disables matching all of the subjectAlternativeNames | |
| 632 | + * specified in the {@link #setSubjectAlternativeNames | |
| 633 | + * setSubjectAlternativeNames} or {@link #addSubjectAlternativeName | |
| 634 | + * addSubjectAlternativeName} methods. If enabled, | |
| 635 | + * the <code>X509Certificate</code> must contain all of the | |
| 636 | + * specified subject alternative names. If disabled, the | |
| 637 | + * <code>X509Certificate</code> must contain at least one of the | |
| 638 | + * specified subject alternative names. | |
| 639 | + * | |
| 640 | + * <p>The matchAllNames flag is <code>true</code> by default. | |
| 641 | + * | |
| 642 | + * @param matchAllNames if <code>true</code>, the flag is enabled; | |
| 643 | + * if <code>false</code>, the flag is disabled. | |
| 644 | + * @see #getMatchAllSubjectAltNames | |
| 645 | + */ | |
| 646 | + public void setMatchAllSubjectAltNames(boolean matchAllNames) { | |
| 647 | + this.matchAllSubjectAltNames = matchAllNames; | |
| 648 | + } | |
| 649 | + | |
| 650 | + /** | |
| 651 | + * Sets the subjectAlternativeNames criterion. The | |
| 652 | + * <code>X509Certificate</code> must contain all or at least one of the | |
| 653 | + * specified subjectAlternativeNames, depending on the value of | |
| 654 | + * the matchAllNames flag (see {@link #setMatchAllSubjectAltNames | |
| 655 | + * setMatchAllSubjectAltNames}). | |
| 656 | + * <p> | |
| 657 | + * This method allows the caller to specify, with a single method call, | |
| 658 | + * the complete set of subject alternative names for the | |
| 659 | + * subjectAlternativeNames criterion. The specified value replaces | |
| 660 | + * the previous value for the subjectAlternativeNames criterion. | |
| 661 | + * <p> | |
| 662 | + * The <code>names</code> parameter (if not <code>null</code>) is a | |
| 663 | + * <code>Collection</code> with one | |
| 664 | + * entry for each name to be included in the subject alternative name | |
| 665 | + * criterion. Each entry is a <code>List</code> whose first entry is an | |
| 666 | + * <code>Integer</code> (the name type, 0-8) and whose second | |
| 667 | + * entry is a <code>String</code> or a byte array (the name, in | |
| 668 | + * string or ASN.1 DER encoded form, respectively). | |
| 669 | + * There can be multiple names of the same type. If <code>null</code> | |
| 670 | + * is supplied as the value for this argument, no | |
| 671 | + * subjectAlternativeNames check will be performed. | |
| 672 | + * <p> | |
| 673 | + * Each subject alternative name in the <code>Collection</code> | |
| 674 | + * may be specified either as a <code>String</code> or as an ASN.1 encoded | |
| 675 | + * byte array. For more details about the formats used, see | |
| 676 | + * {@link #addSubjectAlternativeName(int type, String name) | |
| 677 | + * addSubjectAlternativeName(int type, String name)} and | |
| 678 | + * {@link #addSubjectAlternativeName(int type, byte [] name) | |
| 679 | + * addSubjectAlternativeName(int type, byte [] name)}. | |
| 680 | + * <p> | |
| 681 | + * <strong>Note:</strong> for distinguished names, specify the byte | |
| 682 | + * array form instead of the String form. See the note in | |
| 683 | + * {@link #addSubjectAlternativeName(int, String)} for more information. | |
| 684 | + * <p> | |
| 685 | + * Note that the <code>names</code> parameter can contain duplicate | |
| 686 | + * names (same name and name type), but they may be removed from the | |
| 687 | + * <code>Collection</code> of names returned by the | |
| 688 | + * {@link #getSubjectAlternativeNames getSubjectAlternativeNames} method. | |
| 689 | + * <p> | |
| 690 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 691 | + * protect against subsequent modifications. | |
| 692 | + * | |
| 693 | + * @param names a <code>Collection</code> of names (or <code>null</code>) | |
| 694 | + * @throws IOException if a parsing error occurs | |
| 695 | + * @see #getSubjectAlternativeNames | |
| 696 | + */ | |
| 697 | + public void setSubjectAlternativeNames(Collection<List<?>> names) | |
| 698 | + throws IOException { | |
| 699 | + if (names == null) { | |
| 700 | + subjectAlternativeNames = null; | |
| 701 | + subjectAlternativeGeneralNames = null; | |
| 702 | + } else { | |
| 703 | + if (names.isEmpty()) { | |
| 704 | + subjectAlternativeNames = null; | |
| 705 | + subjectAlternativeGeneralNames = null; | |
| 706 | + return; | |
| 707 | + } | |
| 708 | + Set<List<?>> tempNames = cloneAndCheckNames(names); | |
| 709 | + // Ensure that we either set both of these or neither | |
| 710 | + subjectAlternativeGeneralNames = parseNames(tempNames); | |
| 711 | + subjectAlternativeNames = tempNames; | |
| 712 | + } | |
| 713 | + } | |
| 714 | + | |
| 715 | + /** | |
| 716 | + * Adds a name to the subjectAlternativeNames criterion. The | |
| 717 | + * <code>X509Certificate</code> must contain all or at least one | |
| 718 | + * of the specified subjectAlternativeNames, depending on the value of | |
| 719 | + * the matchAllNames flag (see {@link #setMatchAllSubjectAltNames | |
| 720 | + * setMatchAllSubjectAltNames}). | |
| 721 | + * <p> | |
| 722 | + * This method allows the caller to add a name to the set of subject | |
| 723 | + * alternative names. | |
| 724 | + * The specified name is added to any previous value for the | |
| 725 | + * subjectAlternativeNames criterion. If the specified name is a | |
| 726 | + * duplicate, it may be ignored. | |
| 727 | + * <p> | |
| 728 | + * The name is provided in string format. | |
| 729 | + * <a href="http://www.ietf.org/rfc/rfc822.txt">RFC 822</a>, DNS, and URI | |
| 730 | + * names use the well-established string formats for those types (subject to | |
| 731 | + * the restrictions included in RFC 3280). IPv4 address names are | |
| 732 | + * supplied using dotted quad notation. OID address names are represented | |
| 733 | + * as a series of nonnegative integers separated by periods. And | |
| 734 | + * directory names (distinguished names) are supplied in RFC 2253 format. | |
| 735 | + * No standard string format is defined for otherNames, X.400 names, | |
| 736 | + * EDI party names, IPv6 address names, or any other type of names. They | |
| 737 | + * should be specified using the | |
| 738 | + * {@link #addSubjectAlternativeName(int type, byte [] name) | |
| 739 | + * addSubjectAlternativeName(int type, byte [] name)} | |
| 740 | + * method. | |
| 741 | + * <p> | |
| 742 | + * <strong>Note:</strong> for distinguished names, use | |
| 743 | + * {@linkplain #addSubjectAlternativeName(int, byte[])} instead. | |
| 744 | + * This method should not be relied on as it can fail to match some | |
| 745 | + * certificates because of a loss of encoding information in the RFC 2253 | |
| 746 | + * String form of some distinguished names. | |
| 747 | + * | |
| 748 | + * @param type the name type (0-8, as specified in | |
| 749 | + * RFC 3280, section 4.2.1.7) | |
| 750 | + * @param name the name in string form (not <code>null</code>) | |
| 751 | + * @throws IOException if a parsing error occurs | |
| 752 | + */ | |
| 753 | + public void addSubjectAlternativeName(int type, String name) | |
| 754 | + throws IOException { | |
| 755 | + addSubjectAlternativeNameInternal(type, name); | |
| 756 | + } | |
| 757 | + | |
| 758 | + /** | |
| 759 | + * Adds a name to the subjectAlternativeNames criterion. The | |
| 760 | + * <code>X509Certificate</code> must contain all or at least one | |
| 761 | + * of the specified subjectAlternativeNames, depending on the value of | |
| 762 | + * the matchAllNames flag (see {@link #setMatchAllSubjectAltNames | |
| 763 | + * setMatchAllSubjectAltNames}). | |
| 764 | + * <p> | |
| 765 | + * This method allows the caller to add a name to the set of subject | |
| 766 | + * alternative names. | |
| 767 | + * The specified name is added to any previous value for the | |
| 768 | + * subjectAlternativeNames criterion. If the specified name is a | |
| 769 | + * duplicate, it may be ignored. | |
| 770 | + * <p> | |
| 771 | + * The name is provided as a byte array. This byte array should contain | |
| 772 | + * the DER encoded name, as it would appear in the GeneralName structure | |
| 773 | + * defined in RFC 3280 and X.509. The encoded byte array should only contain | |
| 774 | + * the encoded value of the name, and should not include the tag associated | |
| 775 | + * with the name in the GeneralName structure. The ASN.1 definition of this | |
| 776 | + * structure appears below. | |
| 777 | + * <pre><code> | |
| 778 | + * GeneralName ::= CHOICE { | |
| 779 | + * otherName [0] OtherName, | |
| 780 | + * rfc822Name [1] IA5String, | |
| 781 | + * dNSName [2] IA5String, | |
| 782 | + * x400Address [3] ORAddress, | |
| 783 | + * directoryName [4] Name, | |
| 784 | + * ediPartyName [5] EDIPartyName, | |
| 785 | + * uniformResourceIdentifier [6] IA5String, | |
| 786 | + * iPAddress [7] OCTET STRING, | |
| 787 | + * registeredID [8] OBJECT IDENTIFIER} | |
| 788 | + * </code></pre> | |
| 789 | + * <p> | |
| 790 | + * Note that the byte array supplied here is cloned to protect against | |
| 791 | + * subsequent modifications. | |
| 792 | + * | |
| 793 | + * @param type the name type (0-8, as listed above) | |
| 794 | + * @param name a byte array containing the name in ASN.1 DER encoded form | |
| 795 | + * @throws IOException if a parsing error occurs | |
| 796 | + */ | |
| 797 | + public void addSubjectAlternativeName(int type, byte[] name) | |
| 798 | + throws IOException { | |
| 799 | + // clone because byte arrays are modifiable | |
| 800 | + addSubjectAlternativeNameInternal(type, name.clone()); | |
| 801 | + } | |
| 802 | + | |
| 803 | + /** | |
| 804 | + * A private method that adds a name (String or byte array) to the | |
| 805 | + * subjectAlternativeNames criterion. The <code>X509Certificate</code> | |
| 806 | + * must contain the specified subjectAlternativeName. | |
| 807 | + * | |
| 808 | + * @param type the name type (0-8, as specified in | |
| 809 | + * RFC 3280, section 4.2.1.7) | |
| 810 | + * @param name the name in string or byte array form | |
| 811 | + * @throws IOException if a parsing error occurs | |
| 812 | + */ | |
| 813 | + private void addSubjectAlternativeNameInternal(int type, Object name) | |
| 814 | + throws IOException { | |
| 815 | + // First, ensure that the name parses | |
| 816 | + GeneralNameInterface tempName = makeGeneralNameInterface(type, name); | |
| 817 | + if (subjectAlternativeNames == null) { | |
| 818 | + subjectAlternativeNames = new HashSet<List<?>>(); | |
| 819 | + } | |
| 820 | + if (subjectAlternativeGeneralNames == null) { | |
| 821 | + subjectAlternativeGeneralNames = new HashSet<GeneralNameInterface>(); | |
| 822 | + } | |
| 823 | + List<Object> list = new ArrayList<Object>(2); | |
| 824 | + list.add(Integer.valueOf(type)); | |
| 825 | + list.add(name); | |
| 826 | + subjectAlternativeNames.add(list); | |
| 827 | + subjectAlternativeGeneralNames.add(tempName); | |
| 828 | + } | |
| 829 | + | |
| 830 | + /** | |
| 831 | + * Parse an argument of the form passed to setSubjectAlternativeNames, | |
| 832 | + * returning a <code>Collection</code> of | |
| 833 | + * <code>GeneralNameInterface</code>s. | |
| 834 | + * Throw an IllegalArgumentException or a ClassCastException | |
| 835 | + * if the argument is malformed. | |
| 836 | + * | |
| 837 | + * @param names a Collection with one entry per name. | |
| 838 | + * Each entry is a <code>List</code> whose first entry | |
| 839 | + * is an Integer (the name type, 0-8) and whose second | |
| 840 | + * entry is a String or a byte array (the name, in | |
| 841 | + * string or ASN.1 DER encoded form, respectively). | |
| 842 | + * There can be multiple names of the same type. Null is | |
| 843 | + * not an acceptable value. | |
| 844 | + * @return a Set of <code>GeneralNameInterface</code>s | |
| 845 | + * @throws IOException if a parsing error occurs | |
| 846 | + */ | |
| 847 | + private static Set<GeneralNameInterface> parseNames(Collection<List<?>> names) throws IOException { | |
| 848 | + Set<GeneralNameInterface> genNames = new HashSet<GeneralNameInterface>(); | |
| 849 | + for (List<?> nameList : names) { | |
| 850 | + if (nameList.size() != 2) { | |
| 851 | + throw new IOException("name list size not 2"); | |
| 852 | + } | |
| 853 | + Object o = nameList.get(0); | |
| 854 | + if (!(o instanceof Integer)) { | |
| 855 | + throw new IOException("expected an Integer"); | |
| 856 | + } | |
| 857 | + int nameType = ((Integer)o).intValue(); | |
| 858 | + o = nameList.get(1); | |
| 859 | + genNames.add(makeGeneralNameInterface(nameType, o)); | |
| 860 | + } | |
| 861 | + | |
| 862 | + return genNames; | |
| 863 | + } | |
| 864 | + | |
| 865 | + /** | |
| 866 | + * Compare for equality two objects of the form passed to | |
| 867 | + * setSubjectAlternativeNames (or X509CRLSelector.setIssuerNames). | |
| 868 | + * Throw an <code>IllegalArgumentException</code> or a | |
| 869 | + * <code>ClassCastException</code> if one of the objects is malformed. | |
| 870 | + * | |
| 871 | + * @param object1 a Collection containing the first object to compare | |
| 872 | + * @param object2 a Collection containing the second object to compare | |
| 873 | + * @return true if the objects are equal, false otherwise | |
| 874 | + */ | |
| 875 | + static boolean equalNames(Collection object1, Collection object2) { | |
| 876 | + if ((object1 == null) || (object2 == null)) { | |
| 877 | + return object1 == object2; | |
| 878 | + } | |
| 879 | + return object1.equals(object2); | |
| 880 | + } | |
| 881 | + | |
| 882 | + /** | |
| 883 | + * Make a <code>GeneralNameInterface</code> out of a name type (0-8) and an | |
| 884 | + * Object that may be a byte array holding the ASN.1 DER encoded | |
| 885 | + * name or a String form of the name. Except for X.509 | |
| 886 | + * Distinguished Names, the String form of the name must not be the | |
| 887 | + * result from calling toString on an existing GeneralNameInterface | |
| 888 | + * implementing class. The output of toString is not compatible | |
| 889 | + * with the String constructors for names other than Distinguished | |
| 890 | + * Names. | |
| 891 | + * | |
| 892 | + * @param type name type (0-8) | |
| 893 | + * @param name name as ASN.1 Der-encoded byte array or String | |
| 894 | + * @return a GeneralNameInterface name | |
| 895 | + * @throws IOException if a parsing error occurs | |
| 896 | + */ | |
| 897 | + static GeneralNameInterface makeGeneralNameInterface(int type, Object name) | |
| 898 | + throws IOException { | |
| 899 | + GeneralNameInterface result; | |
| 900 | + if (debug != null) { | |
| 901 | + debug.println("X509CertSelector.makeGeneralNameInterface(" | |
| 902 | + + type + ")..."); | |
| 903 | + } | |
| 904 | + | |
| 905 | + if (name instanceof String) { | |
| 906 | + if (debug != null) { | |
| 907 | + debug.println("X509CertSelector.makeGeneralNameInterface() " | |
| 908 | + + "name is String: " + name); | |
| 909 | + } | |
| 910 | + switch (type) { | |
| 911 | + case NAME_RFC822: | |
| 912 | + result = new RFC822Name((String)name); | |
| 913 | + break; | |
| 914 | + case NAME_DNS: | |
| 915 | + result = new DNSName((String)name); | |
| 916 | + break; | |
| 917 | + case NAME_DIRECTORY: | |
| 918 | + result = new X500Name((String)name); | |
| 919 | + break; | |
| 920 | + case NAME_URI: | |
| 921 | + result = new URIName((String)name); | |
| 922 | + break; | |
| 923 | + case NAME_IP: | |
| 924 | + result = new IPAddressName((String)name); | |
| 925 | + break; | |
| 926 | + case NAME_OID: | |
| 927 | + result = new OIDName((String)name); | |
| 928 | + break; | |
| 929 | + default: | |
| 930 | + throw new IOException("unable to parse String names of type " | |
| 931 | + + type); | |
| 932 | + } | |
| 933 | + if (debug != null) { | |
| 934 | + debug.println("X509CertSelector.makeGeneralNameInterface() " | |
| 935 | + + "result: " + result.toString()); | |
| 936 | + } | |
| 937 | + } else if (name instanceof byte[]) { | |
| 938 | + DerValue val = new DerValue((byte[]) name); | |
| 939 | + if (debug != null) { | |
| 940 | + debug.println | |
| 941 | + ("X509CertSelector.makeGeneralNameInterface() is byte[]"); | |
| 942 | + } | |
| 943 | + | |
| 944 | + switch (type) { | |
| 945 | + case NAME_ANY: | |
| 946 | + result = new OtherName(val); | |
| 947 | + break; | |
| 948 | + case NAME_RFC822: | |
| 949 | + result = new RFC822Name(val); | |
| 950 | + break; | |
| 951 | + case NAME_DNS: | |
| 952 | + result = new DNSName(val); | |
| 953 | + break; | |
| 954 | + case NAME_X400: | |
| 955 | + result = new X400Address(val); | |
| 956 | + break; | |
| 957 | + case NAME_DIRECTORY: | |
| 958 | + result = new X500Name(val); | |
| 959 | + break; | |
| 960 | + case NAME_EDI: | |
| 961 | + result = new EDIPartyName(val); | |
| 962 | + break; | |
| 963 | + case NAME_URI: | |
| 964 | + result = new URIName(val); | |
| 965 | + break; | |
| 966 | + case NAME_IP: | |
| 967 | + result = new IPAddressName(val); | |
| 968 | + break; | |
| 969 | + case NAME_OID: | |
| 970 | + result = new OIDName(val); | |
| 971 | + break; | |
| 972 | + default: | |
| 973 | + throw new IOException("unable to parse byte array names of " | |
| 974 | + + "type " + type); | |
| 975 | + } | |
| 976 | + if (debug != null) { | |
| 977 | + debug.println("X509CertSelector.makeGeneralNameInterface() result: " | |
| 978 | + + result.toString()); | |
| 979 | + } | |
| 980 | + } else { | |
| 981 | + if (debug != null) { | |
| 982 | + debug.println("X509CertSelector.makeGeneralName() input name " | |
| 983 | + + "not String or byte array"); | |
| 984 | + } | |
| 985 | + throw new IOException("name not String or byte array"); | |
| 986 | + } | |
| 987 | + return result; | |
| 988 | + } | |
| 989 | + | |
| 990 | + | |
| 991 | + /** | |
| 992 | + * Sets the name constraints criterion. The <code>X509Certificate</code> | |
| 993 | + * must have subject and subject alternative names that | |
| 994 | + * meet the specified name constraints. | |
| 995 | + * <p> | |
| 996 | + * The name constraints are specified as a byte array. This byte array | |
| 997 | + * should contain the DER encoded form of the name constraints, as they | |
| 998 | + * would appear in the NameConstraints structure defined in RFC 3280 | |
| 999 | + * and X.509. The ASN.1 definition of this structure appears below. | |
| 1000 | + * | |
| 1001 | + * <pre><code> | |
| 1002 | + * NameConstraints ::= SEQUENCE { | |
| 1003 | + * permittedSubtrees [0] GeneralSubtrees OPTIONAL, | |
| 1004 | + * excludedSubtrees [1] GeneralSubtrees OPTIONAL } | |
| 1005 | + * | |
| 1006 | + * GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree | |
| 1007 | + * | |
| 1008 | + * GeneralSubtree ::= SEQUENCE { | |
| 1009 | + * base GeneralName, | |
| 1010 | + * minimum [0] BaseDistance DEFAULT 0, | |
| 1011 | + * maximum [1] BaseDistance OPTIONAL } | |
| 1012 | + * | |
| 1013 | + * BaseDistance ::= INTEGER (0..MAX) | |
| 1014 | + * | |
| 1015 | + * GeneralName ::= CHOICE { | |
| 1016 | + * otherName [0] OtherName, | |
| 1017 | + * rfc822Name [1] IA5String, | |
| 1018 | + * dNSName [2] IA5String, | |
| 1019 | + * x400Address [3] ORAddress, | |
| 1020 | + * directoryName [4] Name, | |
| 1021 | + * ediPartyName [5] EDIPartyName, | |
| 1022 | + * uniformResourceIdentifier [6] IA5String, | |
| 1023 | + * iPAddress [7] OCTET STRING, | |
| 1024 | + * registeredID [8] OBJECT IDENTIFIER} | |
| 1025 | + * </code></pre> | |
| 1026 | + * <p> | |
| 1027 | + * Note that the byte array supplied here is cloned to protect against | |
| 1028 | + * subsequent modifications. | |
| 1029 | + * | |
| 1030 | + * @param bytes a byte array containing the ASN.1 DER encoding of | |
| 1031 | + * a NameConstraints extension to be used for checking | |
| 1032 | + * name constraints. Only the value of the extension is | |
| 1033 | + * included, not the OID or criticality flag. Can be | |
| 1034 | + * <code>null</code>, | |
| 1035 | + * in which case no name constraints check will be performed. | |
| 1036 | + * @throws IOException if a parsing error occurs | |
| 1037 | + * @see #getNameConstraints | |
| 1038 | + */ | |
| 1039 | + public void setNameConstraints(byte[] bytes) throws IOException { | |
| 1040 | + if (bytes == null) { | |
| 1041 | + ncBytes = null; | |
| 1042 | + nc = null; | |
| 1043 | + } else { | |
| 1044 | + ncBytes = bytes.clone(); | |
| 1045 | + nc = new NameConstraintsExtension(FALSE, bytes); | |
| 1046 | + } | |
| 1047 | + } | |
| 1048 | + | |
| 1049 | + /** | |
| 1050 | + * Sets the basic constraints constraint. If the value is greater than or | |
| 1051 | + * equal to zero, <code>X509Certificates</code> must include a | |
| 1052 | + * basicConstraints extension with | |
| 1053 | + * a pathLen of at least this value. If the value is -2, only end-entity | |
| 1054 | + * certificates are accepted. If the value is -1, no check is done. | |
| 1055 | + * <p> | |
| 1056 | + * This constraint is useful when building a certification path forward | |
| 1057 | + * (from the target toward the trust anchor. If a partial path has been | |
| 1058 | + * built, any candidate certificate must have a maxPathLen value greater | |
| 1059 | + * than or equal to the number of certificates in the partial path. | |
| 1060 | + * | |
| 1061 | + * @param minMaxPathLen the value for the basic constraints constraint | |
| 1062 | + * @throws IllegalArgumentException if the value is less than -2 | |
| 1063 | + * @see #getBasicConstraints | |
| 1064 | + */ | |
| 1065 | + public void setBasicConstraints(int minMaxPathLen) { | |
| 1066 | + if (minMaxPathLen < -2) { | |
| 1067 | + throw new IllegalArgumentException("basic constraints less than -2"); | |
| 1068 | + } | |
| 1069 | + basicConstraints = minMaxPathLen; | |
| 1070 | + } | |
| 1071 | + | |
| 1072 | + /** | |
| 1073 | + * Sets the policy constraint. The <code>X509Certificate</code> must | |
| 1074 | + * include at least one of the specified policies in its certificate | |
| 1075 | + * policies extension. If <code>certPolicySet</code> is empty, then the | |
| 1076 | + * <code>X509Certificate</code> must include at least some specified policy | |
| 1077 | + * in its certificate policies extension. If <code>certPolicySet</code> is | |
| 1078 | + * <code>null</code>, no policy check will be performed. | |
| 1079 | + * <p> | |
| 1080 | + * Note that the <code>Set</code> is cloned to protect against | |
| 1081 | + * subsequent modifications. | |
| 1082 | + * | |
| 1083 | + * @param certPolicySet a <code>Set</code> of certificate policy OIDs in | |
| 1084 | + * string format (or <code>null</code>). Each OID is | |
| 1085 | + * represented by a set of nonnegative integers | |
| 1086 | + * separated by periods. | |
| 1087 | + * @throws IOException if a parsing error occurs on the OID such as | |
| 1088 | + * the first component is not 0, 1 or 2 or the second component is | |
| 1089 | + * greater than 39. | |
| 1090 | + * @see #getPolicy | |
| 1091 | + */ | |
| 1092 | + public void setPolicy(Set<String> certPolicySet) throws IOException { | |
| 1093 | + if (certPolicySet == null) { | |
| 1094 | + policySet = null; | |
| 1095 | + policy = null; | |
| 1096 | + } else { | |
| 1097 | + // Snapshot set and parse it | |
| 1098 | + Set<String> tempSet = Collections.unmodifiableSet | |
| 1099 | + (new HashSet<String>(certPolicySet)); | |
| 1100 | + /* Convert to Vector of ObjectIdentifiers */ | |
| 1101 | + Iterator<String> i = tempSet.iterator(); | |
| 1102 | + Vector<CertificatePolicyId> polIdVector = new Vector<CertificatePolicyId>(); | |
| 1103 | + while (i.hasNext()) { | |
| 1104 | + Object o = i.next(); | |
| 1105 | + if (!(o instanceof String)) { | |
| 1106 | + throw new IOException("non String in certPolicySet"); | |
| 1107 | + } | |
| 1108 | + polIdVector.add(new CertificatePolicyId(new ObjectIdentifier( | |
| 1109 | + (String)o))); | |
| 1110 | + } | |
| 1111 | + // If everything went OK, make the changes | |
| 1112 | + policySet = tempSet; | |
| 1113 | + policy = new CertificatePolicySet(polIdVector); | |
| 1114 | + } | |
| 1115 | + } | |
| 1116 | + | |
| 1117 | + /** | |
| 1118 | + * Sets the pathToNames criterion. The <code>X509Certificate</code> must | |
| 1119 | + * not include name constraints that would prohibit building a | |
| 1120 | + * path to the specified names. | |
| 1121 | + * <p> | |
| 1122 | + * This method allows the caller to specify, with a single method call, | |
| 1123 | + * the complete set of names which the <code>X509Certificates</code>'s | |
| 1124 | + * name constraints must permit. The specified value replaces | |
| 1125 | + * the previous value for the pathToNames criterion. | |
| 1126 | + * <p> | |
| 1127 | + * This constraint is useful when building a certification path forward | |
| 1128 | + * (from the target toward the trust anchor. If a partial path has been | |
| 1129 | + * built, any candidate certificate must not include name constraints that | |
| 1130 | + * would prohibit building a path to any of the names in the partial path. | |
| 1131 | + * <p> | |
| 1132 | + * The <code>names</code> parameter (if not <code>null</code>) is a | |
| 1133 | + * <code>Collection</code> with one | |
| 1134 | + * entry for each name to be included in the pathToNames | |
| 1135 | + * criterion. Each entry is a <code>List</code> whose first entry is an | |
| 1136 | + * <code>Integer</code> (the name type, 0-8) and whose second | |
| 1137 | + * entry is a <code>String</code> or a byte array (the name, in | |
| 1138 | + * string or ASN.1 DER encoded form, respectively). | |
| 1139 | + * There can be multiple names of the same type. If <code>null</code> | |
| 1140 | + * is supplied as the value for this argument, no | |
| 1141 | + * pathToNames check will be performed. | |
| 1142 | + * <p> | |
| 1143 | + * Each name in the <code>Collection</code> | |
| 1144 | + * may be specified either as a <code>String</code> or as an ASN.1 encoded | |
| 1145 | + * byte array. For more details about the formats used, see | |
| 1146 | + * {@link #addPathToName(int type, String name) | |
| 1147 | + * addPathToName(int type, String name)} and | |
| 1148 | + * {@link #addPathToName(int type, byte [] name) | |
| 1149 | + * addPathToName(int type, byte [] name)}. | |
| 1150 | + * <p> | |
| 1151 | + * <strong>Note:</strong> for distinguished names, specify the byte | |
| 1152 | + * array form instead of the String form. See the note in | |
| 1153 | + * {@link #addPathToName(int, String)} for more information. | |
| 1154 | + * <p> | |
| 1155 | + * Note that the <code>names</code> parameter can contain duplicate | |
| 1156 | + * names (same name and name type), but they may be removed from the | |
| 1157 | + * <code>Collection</code> of names returned by the | |
| 1158 | + * {@link #getPathToNames getPathToNames} method. | |
| 1159 | + * <p> | |
| 1160 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 1161 | + * protect against subsequent modifications. | |
| 1162 | + * | |
| 1163 | + * @param names a <code>Collection</code> with one entry per name | |
| 1164 | + * (or <code>null</code>) | |
| 1165 | + * @throws IOException if a parsing error occurs | |
| 1166 | + * @see #getPathToNames | |
| 1167 | + */ | |
| 1168 | + public void setPathToNames(Collection<List<?>> names) throws IOException { | |
| 1169 | + if ((names == null) || names.isEmpty()) { | |
| 1170 | + pathToNames = null; | |
| 1171 | + pathToGeneralNames = null; | |
| 1172 | + } else { | |
| 1173 | + Set<List<?>> tempNames = cloneAndCheckNames(names); | |
| 1174 | + pathToGeneralNames = parseNames(tempNames); | |
| 1175 | + // Ensure that we either set both of these or neither | |
| 1176 | + pathToNames = tempNames; | |
| 1177 | + } | |
| 1178 | + } | |
| 1179 | + | |
| 1180 | + // called from CertPathHelper | |
| 1181 | + void setPathToNamesInternal(Set<GeneralNameInterface> names) { | |
| 1182 | + // set names to non-null dummy value | |
| 1183 | + // this breaks getPathToNames() | |
| 1184 | + pathToNames = Collections.<List<?>>emptySet(); | |
| 1185 | + pathToGeneralNames = names; | |
| 1186 | + } | |
| 1187 | + | |
| 1188 | + /** | |
| 1189 | + * Adds a name to the pathToNames criterion. The <code>X509Certificate</code> | |
| 1190 | + * must not include name constraints that would prohibit building a | |
| 1191 | + * path to the specified name. | |
| 1192 | + * <p> | |
| 1193 | + * This method allows the caller to add a name to the set of names which | |
| 1194 | + * the <code>X509Certificates</code>'s name constraints must permit. | |
| 1195 | + * The specified name is added to any previous value for the | |
| 1196 | + * pathToNames criterion. If the name is a duplicate, it may be ignored. | |
| 1197 | + * <p> | |
| 1198 | + * The name is provided in string format. RFC 822, DNS, and URI names | |
| 1199 | + * use the well-established string formats for those types (subject to | |
| 1200 | + * the restrictions included in RFC 3280). IPv4 address names are | |
| 1201 | + * supplied using dotted quad notation. OID address names are represented | |
| 1202 | + * as a series of nonnegative integers separated by periods. And | |
| 1203 | + * directory names (distinguished names) are supplied in RFC 2253 format. | |
| 1204 | + * No standard string format is defined for otherNames, X.400 names, | |
| 1205 | + * EDI party names, IPv6 address names, or any other type of names. They | |
| 1206 | + * should be specified using the | |
| 1207 | + * {@link #addPathToName(int type, byte [] name) | |
| 1208 | + * addPathToName(int type, byte [] name)} method. | |
| 1209 | + * <p> | |
| 1210 | + * <strong>Note:</strong> for distinguished names, use | |
| 1211 | + * {@linkplain #addPathToName(int, byte[])} instead. | |
| 1212 | + * This method should not be relied on as it can fail to match some | |
| 1213 | + * certificates because of a loss of encoding information in the RFC 2253 | |
| 1214 | + * String form of some distinguished names. | |
| 1215 | + * | |
| 1216 | + * @param type the name type (0-8, as specified in | |
| 1217 | + * RFC 3280, section 4.2.1.7) | |
| 1218 | + * @param name the name in string form | |
| 1219 | + * @throws IOException if a parsing error occurs | |
| 1220 | + */ | |
| 1221 | + public void addPathToName(int type, String name) throws IOException { | |
| 1222 | + addPathToNameInternal(type, name); | |
| 1223 | + } | |
| 1224 | + | |
| 1225 | + /** | |
| 1226 | + * Adds a name to the pathToNames criterion. The <code>X509Certificate</code> | |
| 1227 | + * must not include name constraints that would prohibit building a | |
| 1228 | + * path to the specified name. | |
| 1229 | + * <p> | |
| 1230 | + * This method allows the caller to add a name to the set of names which | |
| 1231 | + * the <code>X509Certificates</code>'s name constraints must permit. | |
| 1232 | + * The specified name is added to any previous value for the | |
| 1233 | + * pathToNames criterion. If the name is a duplicate, it may be ignored. | |
| 1234 | + * <p> | |
| 1235 | + * The name is provided as a byte array. This byte array should contain | |
| 1236 | + * the DER encoded name, as it would appear in the GeneralName structure | |
| 1237 | + * defined in RFC 3280 and X.509. The ASN.1 definition of this structure | |
| 1238 | + * appears in the documentation for | |
| 1239 | + * {@link #addSubjectAlternativeName(int type, byte [] name) | |
| 1240 | + * addSubjectAlternativeName(int type, byte [] name)}. | |
| 1241 | + * <p> | |
| 1242 | + * Note that the byte array supplied here is cloned to protect against | |
| 1243 | + * subsequent modifications. | |
| 1244 | + * | |
| 1245 | + * @param type the name type (0-8, as specified in | |
| 1246 | + * RFC 3280, section 4.2.1.7) | |
| 1247 | + * @param name a byte array containing the name in ASN.1 DER encoded form | |
| 1248 | + * @throws IOException if a parsing error occurs | |
| 1249 | + */ | |
| 1250 | + public void addPathToName(int type, byte [] name) throws IOException { | |
| 1251 | + // clone because byte arrays are modifiable | |
| 1252 | + addPathToNameInternal(type, name.clone()); | |
| 1253 | + } | |
| 1254 | + | |
| 1255 | + /** | |
| 1256 | + * A private method that adds a name (String or byte array) to the | |
| 1257 | + * pathToNames criterion. The <code>X509Certificate</code> must contain | |
| 1258 | + * the specified pathToName. | |
| 1259 | + * | |
| 1260 | + * @param type the name type (0-8, as specified in | |
| 1261 | + * RFC 3280, section 4.2.1.7) | |
| 1262 | + * @param name the name in string or byte array form | |
| 1263 | + * @throws IOException if an encoding error occurs (incorrect form for DN) | |
| 1264 | + */ | |
| 1265 | + private void addPathToNameInternal(int type, Object name) | |
| 1266 | + throws IOException { | |
| 1267 | + // First, ensure that the name parses | |
| 1268 | + GeneralNameInterface tempName = makeGeneralNameInterface(type, name); | |
| 1269 | + if (pathToGeneralNames == null) { | |
| 1270 | + pathToNames = new HashSet<List<?>>(); | |
| 1271 | + pathToGeneralNames = new HashSet<GeneralNameInterface>(); | |
| 1272 | + } | |
| 1273 | + List<Object> list = new ArrayList<Object>(2); | |
| 1274 | + list.add(Integer.valueOf(type)); | |
| 1275 | + list.add(name); | |
| 1276 | + pathToNames.add(list); | |
| 1277 | + pathToGeneralNames.add(tempName); | |
| 1278 | + } | |
| 1279 | + | |
| 1280 | + /** | |
| 1281 | + * Returns the certificateEquals criterion. The specified | |
| 1282 | + * <code>X509Certificate</code> must be equal to the | |
| 1283 | + * <code>X509Certificate</code> passed to the <code>match</code> method. | |
| 1284 | + * If <code>null</code>, this check is not applied. | |
| 1285 | + * | |
| 1286 | + * @return the <code>X509Certificate</code> to match (or <code>null</code>) | |
| 1287 | + * @see #setCertificate | |
| 1288 | + */ | |
| 1289 | + public X509Certificate getCertificate() { | |
| 1290 | + return x509Cert; | |
| 1291 | + } | |
| 1292 | + | |
| 1293 | + /** | |
| 1294 | + * Returns the serialNumber criterion. The specified serial number | |
| 1295 | + * must match the certificate serial number in the | |
| 1296 | + * <code>X509Certificate</code>. If <code>null</code>, any certificate | |
| 1297 | + * serial number will do. | |
| 1298 | + * | |
| 1299 | + * @return the certificate serial number to match | |
| 1300 | + * (or <code>null</code>) | |
| 1301 | + * @see #setSerialNumber | |
| 1302 | + */ | |
| 1303 | + public BigInteger getSerialNumber() { | |
| 1304 | + return serialNumber; | |
| 1305 | + } | |
| 1306 | + | |
| 1307 | + /** | |
| 1308 | + * Returns the issuer criterion as an <code>X500Principal</code>. This | |
| 1309 | + * distinguished name must match the issuer distinguished name in the | |
| 1310 | + * <code>X509Certificate</code>. If <code>null</code>, the issuer criterion | |
| 1311 | + * is disabled and any issuer distinguished name will do. | |
| 1312 | + * | |
| 1313 | + * @return the required issuer distinguished name as X500Principal | |
| 1314 | + * (or <code>null</code>) | |
| 1315 | + * @since 1.5 | |
| 1316 | + */ | |
| 1317 | + public X500Principal getIssuer() { | |
| 1318 | + return issuer; | |
| 1319 | + } | |
| 1320 | + | |
| 1321 | + /** | |
| 1322 | + * <strong>Denigrated</strong>, use {@linkplain #getIssuer()} or | |
| 1323 | + * {@linkplain #getIssuerAsBytes()} instead. This method should not be | |
| 1324 | + * relied on as it can fail to match some certificates because of a loss of | |
| 1325 | + * encoding information in the RFC 2253 String form of some distinguished | |
| 1326 | + * names. | |
| 1327 | + * <p> | |
| 1328 | + * Returns the issuer criterion as a <code>String</code>. This | |
| 1329 | + * distinguished name must match the issuer distinguished name in the | |
| 1330 | + * <code>X509Certificate</code>. If <code>null</code>, the issuer criterion | |
| 1331 | + * is disabled and any issuer distinguished name will do. | |
| 1332 | + * <p> | |
| 1333 | + * If the value returned is not <code>null</code>, it is a | |
| 1334 | + * distinguished name, in RFC 2253 format. | |
| 1335 | + * | |
| 1336 | + * @return the required issuer distinguished name in RFC 2253 format | |
| 1337 | + * (or <code>null</code>) | |
| 1338 | + */ | |
| 1339 | + public String getIssuerAsString() { | |
| 1340 | + return (issuer == null ? null : issuer.getName()); | |
| 1341 | + } | |
| 1342 | + | |
| 1343 | + /** | |
| 1344 | + * Returns the issuer criterion as a byte array. This distinguished name | |
| 1345 | + * must match the issuer distinguished name in the | |
| 1346 | + * <code>X509Certificate</code>. If <code>null</code>, the issuer criterion | |
| 1347 | + * is disabled and any issuer distinguished name will do. | |
| 1348 | + * <p> | |
| 1349 | + * If the value returned is not <code>null</code>, it is a byte | |
| 1350 | + * array containing a single DER encoded distinguished name, as defined in | |
| 1351 | + * X.501. The ASN.1 notation for this structure is supplied in the | |
| 1352 | + * documentation for | |
| 1353 | + * {@link #setIssuer(byte [] issuerDN) setIssuer(byte [] issuerDN)}. | |
| 1354 | + * <p> | |
| 1355 | + * Note that the byte array returned is cloned to protect against | |
| 1356 | + * subsequent modifications. | |
| 1357 | + * | |
| 1358 | + * @return a byte array containing the required issuer distinguished name | |
| 1359 | + * in ASN.1 DER format (or <code>null</code>) | |
| 1360 | + * @throws IOException if an encoding error occurs | |
| 1361 | + */ | |
| 1362 | + public byte[] getIssuerAsBytes() throws IOException { | |
| 1363 | + return (issuer == null ? null: issuer.getEncoded()); | |
| 1364 | + } | |
| 1365 | + | |
| 1366 | + /** | |
| 1367 | + * Returns the subject criterion as an <code>X500Principal</code>. This | |
| 1368 | + * distinguished name must match the subject distinguished name in the | |
| 1369 | + * <code>X509Certificate</code>. If <code>null</code>, the subject criterion | |
| 1370 | + * is disabled and any subject distinguished name will do. | |
| 1371 | + * | |
| 1372 | + * @return the required subject distinguished name as X500Principal | |
| 1373 | + * (or <code>null</code>) | |
| 1374 | + * @since 1.5 | |
| 1375 | + */ | |
| 1376 | + public X500Principal getSubject() { | |
| 1377 | + return subject; | |
| 1378 | + } | |
| 1379 | + | |
| 1380 | + /** | |
| 1381 | + * <strong>Denigrated</strong>, use {@linkplain #getSubject()} or | |
| 1382 | + * {@linkplain #getSubjectAsBytes()} instead. This method should not be | |
| 1383 | + * relied on as it can fail to match some certificates because of a loss of | |
| 1384 | + * encoding information in the RFC 2253 String form of some distinguished | |
| 1385 | + * names. | |
| 1386 | + * <p> | |
| 1387 | + * Returns the subject criterion as a <code>String</code>. This | |
| 1388 | + * distinguished name must match the subject distinguished name in the | |
| 1389 | + * <code>X509Certificate</code>. If <code>null</code>, the subject criterion | |
| 1390 | + * is disabled and any subject distinguished name will do. | |
| 1391 | + * <p> | |
| 1392 | + * If the value returned is not <code>null</code>, it is a | |
| 1393 | + * distinguished name, in RFC 2253 format. | |
| 1394 | + * | |
| 1395 | + * @return the required subject distinguished name in RFC 2253 format | |
| 1396 | + * (or <code>null</code>) | |
| 1397 | + */ | |
| 1398 | + public String getSubjectAsString() { | |
| 1399 | + return (subject == null ? null : subject.getName()); | |
| 1400 | + } | |
| 1401 | + | |
| 1402 | + /** | |
| 1403 | + * Returns the subject criterion as a byte array. This distinguished name | |
| 1404 | + * must match the subject distinguished name in the | |
| 1405 | + * <code>X509Certificate</code>. If <code>null</code>, the subject criterion | |
| 1406 | + * is disabled and any subject distinguished name will do. | |
| 1407 | + * <p> | |
| 1408 | + * If the value returned is not <code>null</code>, it is a byte | |
| 1409 | + * array containing a single DER encoded distinguished name, as defined in | |
| 1410 | + * X.501. The ASN.1 notation for this structure is supplied in the | |
| 1411 | + * documentation for | |
| 1412 | + * {@link #setSubject(byte [] subjectDN) setSubject(byte [] subjectDN)}. | |
| 1413 | + * <p> | |
| 1414 | + * Note that the byte array returned is cloned to protect against | |
| 1415 | + * subsequent modifications. | |
| 1416 | + * | |
| 1417 | + * @return a byte array containing the required subject distinguished name | |
| 1418 | + * in ASN.1 DER format (or <code>null</code>) | |
| 1419 | + * @throws IOException if an encoding error occurs | |
| 1420 | + */ | |
| 1421 | + public byte[] getSubjectAsBytes() throws IOException { | |
| 1422 | + return (subject == null ? null : subject.getEncoded()); | |
| 1423 | + } | |
| 1424 | + | |
| 1425 | + /** | |
| 1426 | + * Returns the subjectKeyIdentifier criterion. The | |
| 1427 | + * <code>X509Certificate</code> must contain a SubjectKeyIdentifier | |
| 1428 | + * extension with the specified value. If <code>null</code>, no | |
| 1429 | + * subjectKeyIdentifier check will be done. | |
| 1430 | + * <p> | |
| 1431 | + * Note that the byte array returned is cloned to protect against | |
| 1432 | + * subsequent modifications. | |
| 1433 | + * | |
| 1434 | + * @return the key identifier (or <code>null</code>) | |
| 1435 | + * @see #setSubjectKeyIdentifier | |
| 1436 | + */ | |
| 1437 | + public byte[] getSubjectKeyIdentifier() { | |
| 1438 | + if (subjectKeyID == null) { | |
| 1439 | + return null; | |
| 1440 | + } | |
| 1441 | + return subjectKeyID.clone(); | |
| 1442 | + } | |
| 1443 | + | |
| 1444 | + /** | |
| 1445 | + * Returns the authorityKeyIdentifier criterion. The | |
| 1446 | + * <code>X509Certificate</code> must contain a AuthorityKeyIdentifier | |
| 1447 | + * extension with the specified value. If <code>null</code>, no | |
| 1448 | + * authorityKeyIdentifier check will be done. | |
| 1449 | + * <p> | |
| 1450 | + * Note that the byte array returned is cloned to protect against | |
| 1451 | + * subsequent modifications. | |
| 1452 | + * | |
| 1453 | + * @return the key identifier (or <code>null</code>) | |
| 1454 | + * @see #setAuthorityKeyIdentifier | |
| 1455 | + */ | |
| 1456 | + public byte[] getAuthorityKeyIdentifier() { | |
| 1457 | + if (authorityKeyID == null) { | |
| 1458 | + return null; | |
| 1459 | + } | |
| 1460 | + return authorityKeyID.clone(); | |
| 1461 | + } | |
| 1462 | + | |
| 1463 | + /** | |
| 1464 | + * Returns the certificateValid criterion. The specified date must fall | |
| 1465 | + * within the certificate validity period for the | |
| 1466 | + * <code>X509Certificate</code>. If <code>null</code>, no certificateValid | |
| 1467 | + * check will be done. | |
| 1468 | + * <p> | |
| 1469 | + * Note that the <code>Date</code> returned is cloned to protect against | |
| 1470 | + * subsequent modifications. | |
| 1471 | + * | |
| 1472 | + * @return the <code>Date</code> to check (or <code>null</code>) | |
| 1473 | + * @see #setCertificateValid | |
| 1474 | + */ | |
| 1475 | + public Date getCertificateValid() { | |
| 1476 | + if (certificateValid == null) { | |
| 1477 | + return null; | |
| 1478 | + } | |
| 1479 | + return (Date)certificateValid.clone(); | |
| 1480 | + } | |
| 1481 | + | |
| 1482 | + /** | |
| 1483 | + * Returns the privateKeyValid criterion. The specified date must fall | |
| 1484 | + * within the private key validity period for the | |
| 1485 | + * <code>X509Certificate</code>. If <code>null</code>, no privateKeyValid | |
| 1486 | + * check will be done. | |
| 1487 | + * <p> | |
| 1488 | + * Note that the <code>Date</code> returned is cloned to protect against | |
| 1489 | + * subsequent modifications. | |
| 1490 | + * | |
| 1491 | + * @return the <code>Date</code> to check (or <code>null</code>) | |
| 1492 | + * @see #setPrivateKeyValid | |
| 1493 | + */ | |
| 1494 | + public Date getPrivateKeyValid() { | |
| 1495 | + if (privateKeyValid == null) { | |
| 1496 | + return null; | |
| 1497 | + } | |
| 1498 | + return (Date)privateKeyValid.clone(); | |
| 1499 | + } | |
| 1500 | + | |
| 1501 | + /** | |
| 1502 | + * Returns the subjectPublicKeyAlgID criterion. The | |
| 1503 | + * <code>X509Certificate</code> must contain a subject public key | |
| 1504 | + * with the specified algorithm. If <code>null</code>, no | |
| 1505 | + * subjectPublicKeyAlgID check will be done. | |
| 1506 | + * | |
| 1507 | + * @return the object identifier (OID) of the signature algorithm to check | |
| 1508 | + * for (or <code>null</code>). An OID is represented by a set of | |
| 1509 | + * nonnegative integers separated by periods. | |
| 1510 | + * @see #setSubjectPublicKeyAlgID | |
| 1511 | + */ | |
| 1512 | + public String getSubjectPublicKeyAlgID() { | |
| 1513 | + if (subjectPublicKeyAlgID == null) { | |
| 1514 | + return null; | |
| 1515 | + } | |
| 1516 | + return subjectPublicKeyAlgID.toString(); | |
| 1517 | + } | |
| 1518 | + | |
| 1519 | + /** | |
| 1520 | + * Returns the subjectPublicKey criterion. The | |
| 1521 | + * <code>X509Certificate</code> must contain the specified subject | |
| 1522 | + * public key. If <code>null</code>, no subjectPublicKey check will be done. | |
| 1523 | + * | |
| 1524 | + * @return the subject public key to check for (or <code>null</code>) | |
| 1525 | + * @see #setSubjectPublicKey | |
| 1526 | + */ | |
| 1527 | + public PublicKey getSubjectPublicKey() { | |
| 1528 | + return subjectPublicKey; | |
| 1529 | + } | |
| 1530 | + | |
| 1531 | + /** | |
| 1532 | + * Returns the keyUsage criterion. The <code>X509Certificate</code> | |
| 1533 | + * must allow the specified keyUsage values. If null, no keyUsage | |
| 1534 | + * check will be done. | |
| 1535 | + * <p> | |
| 1536 | + * Note that the boolean array returned is cloned to protect against | |
| 1537 | + * subsequent modifications. | |
| 1538 | + * | |
| 1539 | + * @return a boolean array in the same format as the boolean | |
| 1540 | + * array returned by | |
| 1541 | + * {@link X509Certificate#getKeyUsage() X509Certificate.getKeyUsage()}. | |
| 1542 | + * Or <code>null</code>. | |
| 1543 | + * @see #setKeyUsage | |
| 1544 | + */ | |
| 1545 | + public boolean[] getKeyUsage() { | |
| 1546 | + if (keyUsage == null) { | |
| 1547 | + return null; | |
| 1548 | + } | |
| 1549 | + return keyUsage.clone(); | |
| 1550 | + } | |
| 1551 | + | |
| 1552 | + /** | |
| 1553 | + * Returns the extendedKeyUsage criterion. The <code>X509Certificate</code> | |
| 1554 | + * must allow the specified key purposes in its extended key usage | |
| 1555 | + * extension. If the <code>keyPurposeSet</code> returned is empty or | |
| 1556 | + * <code>null</code>, no extendedKeyUsage check will be done. Note that an | |
| 1557 | + * <code>X509Certificate</code> that has no extendedKeyUsage extension | |
| 1558 | + * implicitly allows all key purposes. | |
| 1559 | + * | |
| 1560 | + * @return an immutable <code>Set</code> of key purpose OIDs in string | |
| 1561 | + * format (or <code>null</code>) | |
| 1562 | + * @see #setExtendedKeyUsage | |
| 1563 | + */ | |
| 1564 | + public Set<String> getExtendedKeyUsage() { | |
| 1565 | + return keyPurposeSet; | |
| 1566 | + } | |
| 1567 | + | |
| 1568 | + /** | |
| 1569 | + * Indicates if the <code>X509Certificate</code> must contain all | |
| 1570 | + * or at least one of the subjectAlternativeNames | |
| 1571 | + * specified in the {@link #setSubjectAlternativeNames | |
| 1572 | + * setSubjectAlternativeNames} or {@link #addSubjectAlternativeName | |
| 1573 | + * addSubjectAlternativeName} methods. If <code>true</code>, | |
| 1574 | + * the <code>X509Certificate</code> must contain all of the | |
| 1575 | + * specified subject alternative names. If <code>false</code>, the | |
| 1576 | + * <code>X509Certificate</code> must contain at least one of the | |
| 1577 | + * specified subject alternative names. | |
| 1578 | + * | |
| 1579 | + * @return <code>true</code> if the flag is enabled; | |
| 1580 | + * <code>false</code> if the flag is disabled. The flag is | |
| 1581 | + * <code>true</code> by default. | |
| 1582 | + * @see #setMatchAllSubjectAltNames | |
| 1583 | + */ | |
| 1584 | + public boolean getMatchAllSubjectAltNames() { | |
| 1585 | + return matchAllSubjectAltNames; | |
| 1586 | + } | |
| 1587 | + | |
| 1588 | + /** | |
| 1589 | + * Returns a copy of the subjectAlternativeNames criterion. | |
| 1590 | + * The <code>X509Certificate</code> must contain all or at least one | |
| 1591 | + * of the specified subjectAlternativeNames, depending on the value | |
| 1592 | + * of the matchAllNames flag (see {@link #getMatchAllSubjectAltNames | |
| 1593 | + * getMatchAllSubjectAltNames}). If the value returned is | |
| 1594 | + * <code>null</code>, no subjectAlternativeNames check will be performed. | |
| 1595 | + * <p> | |
| 1596 | + * If the value returned is not <code>null</code>, it is a | |
| 1597 | + * <code>Collection</code> with | |
| 1598 | + * one entry for each name to be included in the subject alternative name | |
| 1599 | + * criterion. Each entry is a <code>List</code> whose first entry is an | |
| 1600 | + * <code>Integer</code> (the name type, 0-8) and whose second | |
| 1601 | + * entry is a <code>String</code> or a byte array (the name, in | |
| 1602 | + * string or ASN.1 DER encoded form, respectively). | |
| 1603 | + * There can be multiple names of the same type. Note that the | |
| 1604 | + * <code>Collection</code> returned may contain duplicate names (same name | |
| 1605 | + * and name type). | |
| 1606 | + * <p> | |
| 1607 | + * Each subject alternative name in the <code>Collection</code> | |
| 1608 | + * may be specified either as a <code>String</code> or as an ASN.1 encoded | |
| 1609 | + * byte array. For more details about the formats used, see | |
| 1610 | + * {@link #addSubjectAlternativeName(int type, String name) | |
| 1611 | + * addSubjectAlternativeName(int type, String name)} and | |
| 1612 | + * {@link #addSubjectAlternativeName(int type, byte [] name) | |
| 1613 | + * addSubjectAlternativeName(int type, byte [] name)}. | |
| 1614 | + * <p> | |
| 1615 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 1616 | + * protect against subsequent modifications. | |
| 1617 | + * | |
| 1618 | + * @return a <code>Collection</code> of names (or <code>null</code>) | |
| 1619 | + * @see #setSubjectAlternativeNames | |
| 1620 | + */ | |
| 1621 | + public Collection<List<?>> getSubjectAlternativeNames() { | |
| 1622 | + if (subjectAlternativeNames == null) { | |
| 1623 | + return null; | |
| 1624 | + } | |
| 1625 | + return cloneNames(subjectAlternativeNames); | |
| 1626 | + } | |
| 1627 | + | |
| 1628 | + /** | |
| 1629 | + * Clone an object of the form passed to | |
| 1630 | + * setSubjectAlternativeNames and setPathToNames. | |
| 1631 | + * Throw a <code>RuntimeException</code> if the argument is malformed. | |
| 1632 | + * <p> | |
| 1633 | + * This method wraps cloneAndCheckNames, changing any | |
| 1634 | + * <code>IOException</code> into a <code>RuntimeException</code>. This | |
| 1635 | + * method should be used when the object being | |
| 1636 | + * cloned has already been checked, so there should never be any exceptions. | |
| 1637 | + * | |
| 1638 | + * @param names a <code>Collection</code> with one entry per name. | |
| 1639 | + * Each entry is a <code>List</code> whose first entry | |
| 1640 | + * is an Integer (the name type, 0-8) and whose second | |
| 1641 | + * entry is a String or a byte array (the name, in | |
| 1642 | + * string or ASN.1 DER encoded form, respectively). | |
| 1643 | + * There can be multiple names of the same type. Null | |
| 1644 | + * is not an acceptable value. | |
| 1645 | + * @return a deep copy of the specified <code>Collection</code> | |
| 1646 | + * @throws RuntimeException if a parsing error occurs | |
| 1647 | + */ | |
| 1648 | + private static Set<List<?>> cloneNames(Collection<List<?>> names) { | |
| 1649 | + try { | |
| 1650 | + return cloneAndCheckNames(names); | |
| 1651 | + } catch (IOException e) { | |
| 1652 | + throw new RuntimeException("cloneNames encountered IOException: " + | |
| 1653 | + e.getMessage()); | |
| 1654 | + } | |
| 1655 | + } | |
| 1656 | + | |
| 1657 | + /** | |
| 1658 | + * Clone and check an argument of the form passed to | |
| 1659 | + * setSubjectAlternativeNames and setPathToNames. | |
| 1660 | + * Throw an <code>IOException</code> if the argument is malformed. | |
| 1661 | + * | |
| 1662 | + * @param names a <code>Collection</code> with one entry per name. | |
| 1663 | + * Each entry is a <code>List</code> whose first entry | |
| 1664 | + * is an Integer (the name type, 0-8) and whose second | |
| 1665 | + * entry is a String or a byte array (the name, in | |
| 1666 | + * string or ASN.1 DER encoded form, respectively). | |
| 1667 | + * There can be multiple names of the same type. | |
| 1668 | + * <code>null</code> is not an acceptable value. | |
| 1669 | + * @return a deep copy of the specified <code>Collection</code> | |
| 1670 | + * @throws IOException if a parsing error occurs | |
| 1671 | + */ | |
| 1672 | + private static Set<List<?>> cloneAndCheckNames(Collection<List<?>> names) throws IOException { | |
| 1673 | + // Copy the Lists and Collection | |
| 1674 | + Set<List<?>> namesCopy = new HashSet<List<?>>(); | |
| 1675 | + Iterator<List<?>> i = names.iterator(); | |
| 1676 | + while (i.hasNext()) { | |
| 1677 | + Object o = i.next(); | |
| 1678 | + if (!(o instanceof List)) { | |
| 1679 | + throw new IOException("expected a List"); | |
| 1680 | + } | |
| 1681 | + namesCopy.add(new ArrayList<Object>((List<?>)o)); | |
| 1682 | + } | |
| 1683 | + | |
| 1684 | + // Check the contents of the Lists and clone any byte arrays | |
| 1685 | + i = namesCopy.iterator(); | |
| 1686 | + while (i.hasNext()) { | |
| 1687 | + List<Object> nameList = (List<Object>)i.next(); | |
| 1688 | + if (nameList.size() != 2) { | |
| 1689 | + throw new IOException("name list size not 2"); | |
| 1690 | + } | |
| 1691 | + Object o = nameList.get(0); | |
| 1692 | + if (!(o instanceof Integer)) { | |
| 1693 | + throw new IOException("expected an Integer"); | |
| 1694 | + } | |
| 1695 | + int nameType = ((Integer)o).intValue(); | |
| 1696 | + if ((nameType < 0) || (nameType > 8)) { | |
| 1697 | + throw new IOException("name type not 0-8"); | |
| 1698 | + } | |
| 1699 | + Object nameObject = nameList.get(1); | |
| 1700 | + if (!(nameObject instanceof byte[]) && | |
| 1701 | + !(nameObject instanceof String)) { | |
| 1702 | + if (debug != null) { | |
| 1703 | + debug.println("X509CertSelector.cloneAndCheckNames() " | |
| 1704 | + + "name not byte array"); | |
| 1705 | + } | |
| 1706 | + throw new IOException("name not byte array or String"); | |
| 1707 | + } | |
| 1708 | + if (nameObject instanceof byte[]) { | |
| 1709 | + nameList.set(1, ((byte[]) nameObject).clone()); | |
| 1710 | + } | |
| 1711 | + } | |
| 1712 | + return namesCopy; | |
| 1713 | + } | |
| 1714 | + | |
| 1715 | + /** | |
| 1716 | + * Returns the name constraints criterion. The <code>X509Certificate</code> | |
| 1717 | + * must have subject and subject alternative names that | |
| 1718 | + * meet the specified name constraints. | |
| 1719 | + * <p> | |
| 1720 | + * The name constraints are returned as a byte array. This byte array | |
| 1721 | + * contains the DER encoded form of the name constraints, as they | |
| 1722 | + * would appear in the NameConstraints structure defined in RFC 3280 | |
| 1723 | + * and X.509. The ASN.1 notation for this structure is supplied in the | |
| 1724 | + * documentation for | |
| 1725 | + * {@link #setNameConstraints(byte [] bytes) setNameConstraints(byte [] bytes)}. | |
| 1726 | + * <p> | |
| 1727 | + * Note that the byte array returned is cloned to protect against | |
| 1728 | + * subsequent modifications. | |
| 1729 | + * | |
| 1730 | + * @return a byte array containing the ASN.1 DER encoding of | |
| 1731 | + * a NameConstraints extension used for checking name constraints. | |
| 1732 | + * <code>null</code> if no name constraints check will be performed. | |
| 1733 | + * @see #setNameConstraints | |
| 1734 | + */ | |
| 1735 | + public byte[] getNameConstraints() { | |
| 1736 | + if (ncBytes == null) { | |
| 1737 | + return null; | |
| 1738 | + } else { | |
| 1739 | + return ncBytes.clone(); | |
| 1740 | + } | |
| 1741 | + } | |
| 1742 | + | |
| 1743 | + /** | |
| 1744 | + * Returns the basic constraints constraint. If the value is greater than | |
| 1745 | + * or equal to zero, the <code>X509Certificates</code> must include a | |
| 1746 | + * basicConstraints extension with a pathLen of at least this value. | |
| 1747 | + * If the value is -2, only end-entity certificates are accepted. If | |
| 1748 | + * the value is -1, no basicConstraints check is done. | |
| 1749 | + * | |
| 1750 | + * @return the value for the basic constraints constraint | |
| 1751 | + * @see #setBasicConstraints | |
| 1752 | + */ | |
| 1753 | + public int getBasicConstraints() { | |
| 1754 | + return basicConstraints; | |
| 1755 | + } | |
| 1756 | + | |
| 1757 | + /** | |
| 1758 | + * Returns the policy criterion. The <code>X509Certificate</code> must | |
| 1759 | + * include at least one of the specified policies in its certificate policies | |
| 1760 | + * extension. If the <code>Set</code> returned is empty, then the | |
| 1761 | + * <code>X509Certificate</code> must include at least some specified policy | |
| 1762 | + * in its certificate policies extension. If the <code>Set</code> returned is | |
| 1763 | + * <code>null</code>, no policy check will be performed. | |
| 1764 | + * | |
| 1765 | + * @return an immutable <code>Set</code> of certificate policy OIDs in | |
| 1766 | + * string format (or <code>null</code>) | |
| 1767 | + * @see #setPolicy | |
| 1768 | + */ | |
| 1769 | + public Set<String> getPolicy() { | |
| 1770 | + return policySet; | |
| 1771 | + } | |
| 1772 | + | |
| 1773 | + /** | |
| 1774 | + * Returns a copy of the pathToNames criterion. The | |
| 1775 | + * <code>X509Certificate</code> must not include name constraints that would | |
| 1776 | + * prohibit building a path to the specified names. If the value | |
| 1777 | + * returned is <code>null</code>, no pathToNames check will be performed. | |
| 1778 | + * <p> | |
| 1779 | + * If the value returned is not <code>null</code>, it is a | |
| 1780 | + * <code>Collection</code> with one | |
| 1781 | + * entry for each name to be included in the pathToNames | |
| 1782 | + * criterion. Each entry is a <code>List</code> whose first entry is an | |
| 1783 | + * <code>Integer</code> (the name type, 0-8) and whose second | |
| 1784 | + * entry is a <code>String</code> or a byte array (the name, in | |
| 1785 | + * string or ASN.1 DER encoded form, respectively). | |
| 1786 | + * There can be multiple names of the same type. Note that the | |
| 1787 | + * <code>Collection</code> returned may contain duplicate names (same | |
| 1788 | + * name and name type). | |
| 1789 | + * <p> | |
| 1790 | + * Each name in the <code>Collection</code> | |
| 1791 | + * may be specified either as a <code>String</code> or as an ASN.1 encoded | |
| 1792 | + * byte array. For more details about the formats used, see | |
| 1793 | + * {@link #addPathToName(int type, String name) | |
| 1794 | + * addPathToName(int type, String name)} and | |
| 1795 | + * {@link #addPathToName(int type, byte [] name) | |
| 1796 | + * addPathToName(int type, byte [] name)}. | |
| 1797 | + * <p> | |
| 1798 | + * Note that a deep copy is performed on the <code>Collection</code> to | |
| 1799 | + * protect against subsequent modifications. | |
| 1800 | + * | |
| 1801 | + * @return a <code>Collection</code> of names (or <code>null</code>) | |
| 1802 | + * @see #setPathToNames | |
| 1803 | + */ | |
| 1804 | + public Collection<List<?>> getPathToNames() { | |
| 1805 | + if (pathToNames == null) { | |
| 1806 | + return null; | |
| 1807 | + } | |
| 1808 | + return cloneNames(pathToNames); | |
| 1809 | + } | |
| 1810 | + | |
| 1811 | + /** | |
| 1812 | + * Return a printable representation of the <code>CertSelector</code>. | |
| 1813 | + * | |
| 1814 | + * @return a <code>String</code> describing the contents of the | |
| 1815 | + * <code>CertSelector</code> | |
| 1816 | + */ | |
| 1817 | + public String toString() { | |
| 1818 | + StringBuffer sb = new StringBuffer(); | |
| 1819 | + sb.append("X509CertSelector: [\n"); | |
| 1820 | + if (x509Cert != null) { | |
| 1821 | + sb.append(" Certificate: " + x509Cert.toString() + "\n"); | |
| 1822 | + } | |
| 1823 | + if (serialNumber != null) { | |
| 1824 | + sb.append(" Serial Number: " + serialNumber.toString() + "\n"); | |
| 1825 | + } | |
| 1826 | + if (issuer != null) { | |
| 1827 | + sb.append(" Issuer: " + getIssuerAsString() + "\n"); | |
| 1828 | + } | |
| 1829 | + if (subject != null) { | |
| 1830 | + sb.append(" Subject: " + getSubjectAsString() + "\n"); | |
| 1831 | + } | |
| 1832 | + sb.append(" matchAllSubjectAltNames flag: " | |
| 1833 | + + String.valueOf(matchAllSubjectAltNames) + "\n"); | |
| 1834 | + if (subjectAlternativeNames != null) { | |
| 1835 | + sb.append(" SubjectAlternativeNames:\n"); | |
| 1836 | + Iterator<List<?>> i = subjectAlternativeNames.iterator(); | |
| 1837 | + while (i.hasNext()) { | |
| 1838 | + List<?> list = i.next(); | |
| 1839 | + sb.append(" type " + list.get(0) + | |
| 1840 | + ", name " + list.get(1) + "\n"); | |
| 1841 | + } | |
| 1842 | + } | |
| 1843 | + if (subjectKeyID != null) { | |
| 1844 | + HexDumpEncoder enc = new HexDumpEncoder(); | |
| 1845 | + sb.append(" Subject Key Identifier: " + | |
| 1846 | + enc.encodeBuffer(subjectKeyID) + "\n"); | |
| 1847 | + } | |
| 1848 | + if (authorityKeyID != null) { | |
| 1849 | + HexDumpEncoder enc = new HexDumpEncoder(); | |
| 1850 | + sb.append(" Authority Key Identifier: " + | |
| 1851 | + enc.encodeBuffer(authorityKeyID) + "\n"); | |
| 1852 | + } | |
| 1853 | + if (certificateValid != null) { | |
| 1854 | + sb.append(" Certificate Valid: " + | |
| 1855 | + certificateValid.toString() + "\n"); | |
| 1856 | + } | |
| 1857 | + if (privateKeyValid != null) { | |
| 1858 | + sb.append(" Private Key Valid: " + | |
| 1859 | + privateKeyValid.toString() + "\n"); | |
| 1860 | + } | |
| 1861 | + if (subjectPublicKeyAlgID != null) { | |
| 1862 | + sb.append(" Subject Public Key AlgID: " + | |
| 1863 | + subjectPublicKeyAlgID.toString() + "\n"); | |
| 1864 | + } | |
| 1865 | + if (subjectPublicKey != null) { | |
| 1866 | + sb.append(" Subject Public Key: " + | |
| 1867 | + subjectPublicKey.toString() + "\n"); | |
| 1868 | + } | |
| 1869 | + if (keyUsage != null) { | |
| 1870 | + sb.append(" Key Usage: " + keyUsageToString(keyUsage) + "\n"); | |
| 1871 | + } | |
| 1872 | + if (keyPurposeSet != null) { | |
| 1873 | + sb.append(" Extended Key Usage: " + | |
| 1874 | + keyPurposeSet.toString() + "\n"); | |
| 1875 | + } | |
| 1876 | + if (policy != null) { | |
| 1877 | + sb.append(" Policy: " + policy.toString() + "\n"); | |
| 1878 | + } | |
| 1879 | + if (pathToGeneralNames != null) { | |
| 1880 | + sb.append(" Path to names:\n"); | |
| 1881 | + Iterator<GeneralNameInterface> i = pathToGeneralNames.iterator(); | |
| 1882 | + while (i.hasNext()) { | |
| 1883 | + sb.append(" " + i.next() + "\n"); | |
| 1884 | + } | |
| 1885 | + } | |
| 1886 | + sb.append("]"); | |
| 1887 | + return sb.toString(); | |
| 1888 | + } | |
| 1889 | + | |
| 1890 | + // Copied from sun.security.x509.KeyUsageExtension | |
| 1891 | + // (without calling the superclass) | |
| 1892 | + /** | |
| 1893 | + * Returns a printable representation of the KeyUsage. | |
| 1894 | + */ | |
| 1895 | + private static String keyUsageToString(boolean[] k) { | |
| 1896 | + String s = "KeyUsage [\n"; | |
| 1897 | + try { | |
| 1898 | + if (k[0]) { | |
| 1899 | + s += " DigitalSignature\n"; | |
| 1900 | + } | |
| 1901 | + if (k[1]) { | |
| 1902 | + s += " Non_repudiation\n"; | |
| 1903 | + } | |
| 1904 | + if (k[2]) { | |
| 1905 | + s += " Key_Encipherment\n"; | |
| 1906 | + } | |
| 1907 | + if (k[3]) { | |
| 1908 | + s += " Data_Encipherment\n"; | |
| 1909 | + } | |
| 1910 | + if (k[4]) { | |
| 1911 | + s += " Key_Agreement\n"; | |
| 1912 | + } | |
| 1913 | + if (k[5]) { | |
| 1914 | + s += " Key_CertSign\n"; | |
| 1915 | + } | |
| 1916 | + if (k[6]) { | |
| 1917 | + s += " Crl_Sign\n"; | |
| 1918 | + } | |
| 1919 | + if (k[7]) { | |
| 1920 | + s += " Encipher_Only\n"; | |
| 1921 | + } | |
| 1922 | + if (k[8]) { | |
| 1923 | + s += " Decipher_Only\n"; | |
| 1924 | + } | |
| 1925 | + } catch (ArrayIndexOutOfBoundsException ex) {} | |
| 1926 | + | |
| 1927 | + s += "]\n"; | |
| 1928 | + | |
| 1929 | + return (s); | |
| 1930 | + } | |
| 1931 | + | |
| 1932 | + /** | |
| 1933 | + * Returns an Extension object given any X509Certificate and extension oid. | |
| 1934 | + * Throw an <code>IOException</code> if the extension byte value is | |
| 1935 | + * malformed. | |
| 1936 | + * | |
| 1937 | + * @param cert a <code>X509Certificate</code> | |
| 1938 | + * @param extId an <code>integer</code> which specifies the extension index. | |
| 1939 | + * Currently, the supported extensions are as follows: | |
| 1940 | + * index 0 - PrivateKeyUsageExtension | |
| 1941 | + * index 1 - SubjectAlternativeNameExtension | |
| 1942 | + * index 2 - NameConstraintsExtension | |
| 1943 | + * index 3 - CertificatePoliciesExtension | |
| 1944 | + * index 4 - ExtendedKeyUsageExtension | |
| 1945 | + * @return an <code>Extension</code> object whose real type is as specified | |
| 1946 | + * by the extension oid. | |
| 1947 | + * @throws IOException if cannot construct the <code>Extension</code> | |
| 1948 | + * object with the extension encoding retrieved from the passed in | |
| 1949 | + * <code>X509Certificate</code>. | |
| 1950 | + */ | |
| 1951 | + private static Extension getExtensionObject(X509Certificate cert, int extId) | |
| 1952 | + throws IOException { | |
| 1953 | + if (cert instanceof X509CertImpl) { | |
| 1954 | + X509CertImpl impl = (X509CertImpl)cert; | |
| 1955 | + switch (extId) { | |
| 1956 | + case PRIVATE_KEY_USAGE_ID: | |
| 1957 | + return impl.getPrivateKeyUsageExtension(); | |
| 1958 | + case SUBJECT_ALT_NAME_ID: | |
| 1959 | + return impl.getSubjectAlternativeNameExtension(); | |
| 1960 | + case NAME_CONSTRAINTS_ID: | |
| 1961 | + return impl.getNameConstraintsExtension(); | |
| 1962 | + case CERT_POLICIES_ID: | |
| 1963 | + return impl.getCertificatePoliciesExtension(); | |
| 1964 | + case EXTENDED_KEY_USAGE_ID: | |
| 1965 | + return impl.getExtendedKeyUsageExtension(); | |
| 1966 | + default: | |
| 1967 | + return null; | |
| 1968 | + } | |
| 1969 | + } | |
| 1970 | + byte[] rawExtVal = cert.getExtensionValue(EXTENSION_OIDS[extId]); | |
| 1971 | + if (rawExtVal == null) { | |
| 1972 | + return null; | |
| 1973 | + } | |
| 1974 | + DerInputStream in = new DerInputStream(rawExtVal); | |
| 1975 | + byte[] encoded = in.getOctetString(); | |
| 1976 | + switch (extId) { | |
| 1977 | + case PRIVATE_KEY_USAGE_ID: | |
| 1978 | + try { | |
| 1979 | + return new PrivateKeyUsageExtension(FALSE, encoded); | |
| 1980 | + } catch (CertificateException ex) { | |
| 1981 | + throw new IOException(ex.getMessage()); | |
| 1982 | + } | |
| 1983 | + case SUBJECT_ALT_NAME_ID: | |
| 1984 | + return new SubjectAlternativeNameExtension(FALSE, encoded); | |
| 1985 | + case NAME_CONSTRAINTS_ID: | |
| 1986 | + return new NameConstraintsExtension(FALSE, encoded); | |
| 1987 | + case CERT_POLICIES_ID: | |
| 1988 | + return new CertificatePoliciesExtension(FALSE, encoded); | |
| 1989 | + case EXTENDED_KEY_USAGE_ID: | |
| 1990 | + return new ExtendedKeyUsageExtension(FALSE, encoded); | |
| 1991 | + default: | |
| 1992 | + return null; | |
| 1993 | + } | |
| 1994 | + } | |
| 1995 | + | |
| 1996 | + /** | |
| 1997 | + * Decides whether a <code>Certificate</code> should be selected. | |
| 1998 | + * | |
| 1999 | + * @param cert the <code>Certificate</code> to be checked | |
| 2000 | + * @return <code>true</code> if the <code>Certificate</code> should be | |
| 2001 | + * selected, <code>false</code> otherwise | |
| 2002 | + */ | |
| 2003 | + public boolean match(Certificate cert) { | |
| 2004 | + if (!(cert instanceof X509Certificate)) { | |
| 2005 | + return false; | |
| 2006 | + } | |
| 2007 | + X509Certificate xcert = (X509Certificate)cert; | |
| 2008 | + | |
| 2009 | + if (debug != null) { | |
| 2010 | + debug.println("X509CertSelector.match(SN: " | |
| 2011 | + + (xcert.getSerialNumber()).toString(16) + "\n Issuer: " | |
| 2012 | + + xcert.getIssuerDN() + "\n Subject: " + xcert.getSubjectDN() | |
| 2013 | + + ")"); | |
| 2014 | + } | |
| 2015 | + | |
| 2016 | + /* match on X509Certificate */ | |
| 2017 | + if (x509Cert != null) { | |
| 2018 | + if (!x509Cert.equals(xcert)) { | |
| 2019 | + if (debug != null) { | |
| 2020 | + debug.println("X509CertSelector.match: " | |
| 2021 | + + "certs don't match"); | |
| 2022 | + } | |
| 2023 | + return false; | |
| 2024 | + } | |
| 2025 | + } | |
| 2026 | + | |
| 2027 | + /* match on serial number */ | |
| 2028 | + if (serialNumber != null) { | |
| 2029 | + if (!serialNumber.equals(xcert.getSerialNumber())) { | |
| 2030 | + if (debug != null) { | |
| 2031 | + debug.println("X509CertSelector.match: " | |
| 2032 | + + "serial numbers don't match"); | |
| 2033 | + } | |
| 2034 | + return false; | |
| 2035 | + } | |
| 2036 | + } | |
| 2037 | + | |
| 2038 | + /* match on issuer name */ | |
| 2039 | + if (issuer != null) { | |
| 2040 | + if (!issuer.equals(xcert.getIssuerX500Principal())) { | |
| 2041 | + if (debug != null) { | |
| 2042 | + debug.println("X509CertSelector.match: " | |
| 2043 | + + "issuer DNs don't match"); | |
| 2044 | + } | |
| 2045 | + return false; | |
| 2046 | + } | |
| 2047 | + } | |
| 2048 | + | |
| 2049 | + /* match on subject name */ | |
| 2050 | + if (subject != null) { | |
| 2051 | + if (!subject.equals(xcert.getSubjectX500Principal())) { | |
| 2052 | + if (debug != null) { | |
| 2053 | + debug.println("X509CertSelector.match: " | |
| 2054 | + + "subject DNs don't match"); | |
| 2055 | + } | |
| 2056 | + return false; | |
| 2057 | + } | |
| 2058 | + } | |
| 2059 | + | |
| 2060 | + /* match on certificate validity range */ | |
| 2061 | + if (certificateValid != null) { | |
| 2062 | + try { | |
| 2063 | + xcert.checkValidity(certificateValid); | |
| 2064 | + } catch (CertificateException e) { | |
| 2065 | + if (debug != null) { | |
| 2066 | + debug.println("X509CertSelector.match: " | |
| 2067 | + + "certificate not within validity period"); | |
| 2068 | + } | |
| 2069 | + return false; | |
| 2070 | + } | |
| 2071 | + } | |
| 2072 | + | |
| 2073 | + /* match on subject public key */ | |
| 2074 | + if (subjectPublicKeyBytes != null) { | |
| 2075 | + byte[] certKey = xcert.getPublicKey().getEncoded(); | |
| 2076 | + if (!Arrays.equals(subjectPublicKeyBytes, certKey)) { | |
| 2077 | + if (debug != null) { | |
| 2078 | + debug.println("X509CertSelector.match: " | |
| 2079 | + + "subject public keys don't match"); | |
| 2080 | + } | |
| 2081 | + return false; | |
| 2082 | + } | |
| 2083 | + } | |
| 2084 | + | |
| 2085 | + boolean result = matchBasicConstraints(xcert) | |
| 2086 | + && matchKeyUsage(xcert) | |
| 2087 | + && matchExtendedKeyUsage(xcert) | |
| 2088 | + && matchSubjectKeyID(xcert) | |
| 2089 | + && matchAuthorityKeyID(xcert) | |
| 2090 | + && matchPrivateKeyValid(xcert) | |
| 2091 | + && matchSubjectPublicKeyAlgID(xcert) | |
| 2092 | + && matchPolicy(xcert) | |
| 2093 | + && matchSubjectAlternativeNames(xcert) | |
| 2094 | + && matchPathToNames(xcert) | |
| 2095 | + && matchNameConstraints(xcert); | |
| 2096 | + | |
| 2097 | + if (result && (debug != null)) { | |
| 2098 | + debug.println("X509CertSelector.match returning: true"); | |
| 2099 | + } | |
| 2100 | + return result; | |
| 2101 | + } | |
| 2102 | + | |
| 2103 | + /* match on subject key identifier extension value */ | |
| 2104 | + private boolean matchSubjectKeyID(X509Certificate xcert) { | |
| 2105 | + if (subjectKeyID == null) { | |
| 2106 | + return true; | |
| 2107 | + } | |
| 2108 | + try { | |
| 2109 | + byte[] extVal = xcert.getExtensionValue("2.5.29.14"); | |
| 2110 | + if (extVal == null) { | |
| 2111 | + if (debug != null) { | |
| 2112 | + debug.println("X509CertSelector.match: " | |
| 2113 | + + "no subject key ID extension"); | |
| 2114 | + } | |
| 2115 | + return false; | |
| 2116 | + } | |
| 2117 | + DerInputStream in = new DerInputStream(extVal); | |
| 2118 | + byte[] certSubjectKeyID = in.getOctetString(); | |
| 2119 | + if (certSubjectKeyID == null || | |
| 2120 | + !Arrays.equals(subjectKeyID, certSubjectKeyID)) { | |
| 2121 | + if (debug != null) { | |
| 2122 | + debug.println("X509CertSelector.match: " | |
| 2123 | + + "subject key IDs don't match"); | |
| 2124 | + } | |
| 2125 | + return false; | |
| 2126 | + } | |
| 2127 | + } catch (IOException ex) { | |
| 2128 | + if (debug != null) { | |
| 2129 | + debug.println("X509CertSelector.match: " | |
| 2130 | + + "exception in subject key ID check"); | |
| 2131 | + } | |
| 2132 | + return false; | |
| 2133 | + } | |
| 2134 | + return true; | |
| 2135 | + } | |
| 2136 | + | |
| 2137 | + /* match on authority key identifier extension value */ | |
| 2138 | + private boolean matchAuthorityKeyID(X509Certificate xcert) { | |
| 2139 | + if (authorityKeyID == null) { | |
| 2140 | + return true; | |
| 2141 | + } | |
| 2142 | + try { | |
| 2143 | + byte[] extVal = xcert.getExtensionValue("2.5.29.35"); | |
| 2144 | + if (extVal == null) { | |
| 2145 | + if (debug != null) { | |
| 2146 | + debug.println("X509CertSelector.match: " | |
| 2147 | + + "no authority key ID extension"); | |
| 2148 | + } | |
| 2149 | + return false; | |
| 2150 | + } | |
| 2151 | + DerInputStream in = new DerInputStream(extVal); | |
| 2152 | + byte[] certAuthKeyID = in.getOctetString(); | |
| 2153 | + if (certAuthKeyID == null || | |
| 2154 | + !Arrays.equals(authorityKeyID, certAuthKeyID)) { | |
| 2155 | + if (debug != null) { | |
| 2156 | + debug.println("X509CertSelector.match: " | |
| 2157 | + + "authority key IDs don't match"); | |
| 2158 | + } | |
| 2159 | + return false; | |
| 2160 | + } | |
| 2161 | + } catch (IOException ex) { | |
| 2162 | + if (debug != null) { | |
| 2163 | + debug.println("X509CertSelector.match: " | |
| 2164 | + + "exception in authority key ID check"); | |
| 2165 | + } | |
| 2166 | + return false; | |
| 2167 | + } | |
| 2168 | + return true; | |
| 2169 | + } | |
| 2170 | + | |
| 2171 | + /* match on private key usage range */ | |
| 2172 | + private boolean matchPrivateKeyValid(X509Certificate xcert) { | |
| 2173 | + if (privateKeyValid == null) { | |
| 2174 | + return true; | |
| 2175 | + } | |
| 2176 | + PrivateKeyUsageExtension ext = null; | |
| 2177 | + try { | |
| 2178 | + ext = (PrivateKeyUsageExtension) | |
| 2179 | + getExtensionObject(xcert, PRIVATE_KEY_USAGE_ID); | |
| 2180 | + if (ext != null) { | |
| 2181 | + ext.valid(privateKeyValid); | |
| 2182 | + } | |
| 2183 | + } catch (CertificateExpiredException e1) { | |
| 2184 | + if (debug != null) { | |
| 2185 | + String time = "n/a"; | |
| 2186 | + try { | |
| 2187 | + Date notAfter = | |
| 2188 | + (Date)ext.get(PrivateKeyUsageExtension.NOT_AFTER); | |
| 2189 | + time = notAfter.toString(); | |
| 2190 | + } catch (CertificateException ex) { | |
| 2191 | + // not able to retrieve notAfter value | |
| 2192 | + } | |
| 2193 | + debug.println("X509CertSelector.match: private key usage not " | |
| 2194 | + + "within validity date; ext.NOT_After: " | |
| 2195 | + + time + "; X509CertSelector: " | |
| 2196 | + + this.toString()); | |
| 2197 | + e1.printStackTrace(); | |
| 2198 | + } | |
| 2199 | + return false; | |
| 2200 | + } catch (CertificateNotYetValidException e2) { | |
| 2201 | + if (debug != null) { | |
| 2202 | + String time = "n/a"; | |
| 2203 | + try { | |
| 2204 | + Date notBefore = (Date) | |
| 2205 | + ext.get(PrivateKeyUsageExtension.NOT_BEFORE); | |
| 2206 | + time = notBefore.toString(); | |
| 2207 | + } catch (CertificateException ex) { | |
| 2208 | + // not able to retrieve notBefore value | |
| 2209 | + } | |
| 2210 | + debug.println("X509CertSelector.match: private key usage not " | |
| 2211 | + + "within validity date; ext.NOT_BEFORE: " | |
| 2212 | + + time + "; X509CertSelector: " | |
| 2213 | + + this.toString()); | |
| 2214 | + e2.printStackTrace(); | |
| 2215 | + } | |
| 2216 | + return false; | |
| 2217 | + } catch (CertificateException e3) { | |
| 2218 | + if (debug != null) { | |
| 2219 | + debug.println("X509CertSelector.match: CertificateException " | |
| 2220 | + + "in private key usage check; X509CertSelector: " | |
| 2221 | + + this.toString()); | |
| 2222 | + e3.printStackTrace(); | |
| 2223 | + } | |
| 2224 | + return false; | |
| 2225 | + } catch (IOException e4) { | |
| 2226 | + if (debug != null) { | |
| 2227 | + debug.println("X509CertSelector.match: IOException in " | |
| 2228 | + + "private key usage check; X509CertSelector: " | |
| 2229 | + + this.toString()); | |
| 2230 | + e4.printStackTrace(); | |
| 2231 | + } | |
| 2232 | + return false; | |
| 2233 | + } | |
| 2234 | + return true; | |
| 2235 | + } | |
| 2236 | + | |
| 2237 | + /* match on subject public key algorithm OID */ | |
| 2238 | + private boolean matchSubjectPublicKeyAlgID(X509Certificate xcert) { | |
| 2239 | + if (subjectPublicKeyAlgID == null) { | |
| 2240 | + return true; | |
| 2241 | + } | |
| 2242 | + try { | |
| 2243 | + byte[] encodedKey = xcert.getPublicKey().getEncoded(); | |
| 2244 | + DerValue val = new DerValue(encodedKey); | |
| 2245 | + if (val.tag != DerValue.tag_Sequence) { | |
| 2246 | + throw new IOException("invalid key format"); | |
| 2247 | + } | |
| 2248 | + | |
| 2249 | + AlgorithmId algID = AlgorithmId.parse(val.data.getDerValue()); | |
| 2250 | + if (debug != null) { | |
| 2251 | + debug.println("X509CertSelector.match: subjectPublicKeyAlgID = " | |
| 2252 | + + subjectPublicKeyAlgID + ", xcert subjectPublicKeyAlgID = " | |
| 2253 | + + algID.getOID()); | |
| 2254 | + } | |
| 2255 | + if (!subjectPublicKeyAlgID.equals(algID.getOID())) { | |
| 2256 | + if (debug != null) { | |
| 2257 | + debug.println("X509CertSelector.match: " | |
| 2258 | + + "subject public key alg IDs don't match"); | |
| 2259 | + } | |
| 2260 | + return false; | |
| 2261 | + } | |
| 2262 | + } catch (IOException e5) { | |
| 2263 | + if (debug != null) { | |
| 2264 | + debug.println("X509CertSelector.match: IOException in subject " | |
| 2265 | + + "public key algorithm OID check"); | |
| 2266 | + } | |
| 2267 | + return false; | |
| 2268 | + } | |
| 2269 | + return true; | |
| 2270 | + } | |
| 2271 | + | |
| 2272 | + /* match on key usage extension value */ | |
| 2273 | + private boolean matchKeyUsage(X509Certificate xcert) { | |
| 2274 | + if (keyUsage == null) { | |
| 2275 | + return true; | |
| 2276 | + } | |
| 2277 | + boolean[] certKeyUsage = xcert.getKeyUsage(); | |
| 2278 | + if (certKeyUsage != null) { | |
| 2279 | + for (int keyBit = 0; keyBit < keyUsage.length; keyBit++) { | |
| 2280 | + if (keyUsage[keyBit] && | |
| 2281 | + ((keyBit >= certKeyUsage.length) || !certKeyUsage[keyBit])) { | |
| 2282 | + if (debug != null) { | |
| 2283 | + debug.println("X509CertSelector.match: " | |
| 2284 | + + "key usage bits don't match"); | |
| 2285 | + } | |
| 2286 | + return false; | |
| 2287 | + } | |
| 2288 | + } | |
| 2289 | + } | |
| 2290 | + return true; | |
| 2291 | + } | |
| 2292 | + | |
| 2293 | + /* match on extended key usage purpose OIDs */ | |
| 2294 | + private boolean matchExtendedKeyUsage(X509Certificate xcert) { | |
| 2295 | + if ((keyPurposeSet == null) || keyPurposeSet.isEmpty()) { | |
| 2296 | + return true; | |
| 2297 | + } | |
| 2298 | + try { | |
| 2299 | + ExtendedKeyUsageExtension ext = | |
| 2300 | + (ExtendedKeyUsageExtension)getExtensionObject(xcert, | |
| 2301 | + EXTENDED_KEY_USAGE_ID); | |
| 2302 | + if (ext != null) { | |
| 2303 | + Vector<ObjectIdentifier> certKeyPurposeVector = | |
| 2304 | + (Vector<ObjectIdentifier>)ext.get(ExtendedKeyUsageExtension.USAGES); | |
| 2305 | + if (!certKeyPurposeVector.contains(ANY_EXTENDED_KEY_USAGE) | |
| 2306 | + && !certKeyPurposeVector.containsAll(keyPurposeOIDSet)) { | |
| 2307 | + if (debug != null) { | |
| 2308 | + debug.println("X509CertSelector.match: cert failed " | |
| 2309 | + + "extendedKeyUsage criterion"); | |
| 2310 | + } | |
| 2311 | + return false; | |
| 2312 | + } | |
| 2313 | + } | |
| 2314 | + } catch (IOException ex) { | |
| 2315 | + if (debug != null) { | |
| 2316 | + debug.println("X509CertSelector.match: " | |
| 2317 | + + "IOException in extended key usage check"); | |
| 2318 | + } | |
| 2319 | + return false; | |
| 2320 | + } | |
| 2321 | + return true; | |
| 2322 | + } | |
| 2323 | + | |
| 2324 | + /* match on subject alternative name extension names */ | |
| 2325 | + private boolean matchSubjectAlternativeNames(X509Certificate xcert) { | |
| 2326 | + if ((subjectAlternativeNames == null) || subjectAlternativeNames.isEmpty()) { | |
| 2327 | + return true; | |
| 2328 | + } | |
| 2329 | + try { | |
| 2330 | + SubjectAlternativeNameExtension sanExt = | |
| 2331 | + (SubjectAlternativeNameExtension) getExtensionObject(xcert, | |
| 2332 | + SUBJECT_ALT_NAME_ID); | |
| 2333 | + if (sanExt == null) { | |
| 2334 | + if (debug != null) { | |
| 2335 | + debug.println("X509CertSelector.match: " | |
| 2336 | + + "no subject alternative name extension"); | |
| 2337 | + } | |
| 2338 | + return false; | |
| 2339 | + } | |
| 2340 | + GeneralNames certNames = (GeneralNames) | |
| 2341 | + sanExt.get(SubjectAlternativeNameExtension.SUBJECT_NAME); | |
| 2342 | + Iterator<GeneralNameInterface> i = | |
| 2343 | + subjectAlternativeGeneralNames.iterator(); | |
| 2344 | + while (i.hasNext()) { | |
| 2345 | + GeneralNameInterface matchName = i.next(); | |
| 2346 | + boolean found = false; | |
| 2347 | + for (Iterator<GeneralName> t = certNames.iterator(); | |
| 2348 | + t.hasNext() && !found; ) { | |
| 2349 | + GeneralNameInterface certName = (t.next()).getName(); | |
| 2350 | + found = certName.equals(matchName); | |
| 2351 | + } | |
| 2352 | + if (!found && (matchAllSubjectAltNames || !i.hasNext())) { | |
| 2353 | + if (debug != null) { | |
| 2354 | + debug.println("X509CertSelector.match: subject alternative " | |
| 2355 | + + "name " + matchName + " not found"); | |
| 2356 | + } | |
| 2357 | + return false; | |
| 2358 | + } else if (found && !matchAllSubjectAltNames) { | |
| 2359 | + break; | |
| 2360 | + } | |
| 2361 | + } | |
| 2362 | + } catch (IOException ex) { | |
| 2363 | + if (debug != null) | |
| 2364 | + debug.println("X509CertSelector.match: IOException in subject " | |
| 2365 | + + "alternative name check"); | |
| 2366 | + return false; | |
| 2367 | + } | |
| 2368 | + return true; | |
| 2369 | + } | |
| 2370 | + | |
| 2371 | + /* match on name constraints */ | |
| 2372 | + private boolean matchNameConstraints(X509Certificate xcert) { | |
| 2373 | + if (nc == null) { | |
| 2374 | + return true; | |
| 2375 | + } | |
| 2376 | + try { | |
| 2377 | + if (!nc.verify(xcert)) { | |
| 2378 | + if (debug != null) { | |
| 2379 | + debug.println("X509CertSelector.match: " | |
| 2380 | + + "name constraints not satisfied"); | |
| 2381 | + } | |
| 2382 | + return false; | |
| 2383 | + } | |
| 2384 | + } catch (IOException e) { | |
| 2385 | + if (debug != null) { | |
| 2386 | + debug.println("X509CertSelector.match: " | |
| 2387 | + + "IOException in name constraints check"); | |
| 2388 | + } | |
| 2389 | + return false; | |
| 2390 | + } | |
| 2391 | + return true; | |
| 2392 | + } | |
| 2393 | + | |
| 2394 | + /* match on policy OIDs */ | |
| 2395 | + private boolean matchPolicy(X509Certificate xcert) { | |
| 2396 | + if (policy == null) { | |
| 2397 | + return true; | |
| 2398 | + } | |
| 2399 | + try { | |
| 2400 | + CertificatePoliciesExtension ext = (CertificatePoliciesExtension) | |
| 2401 | + getExtensionObject(xcert, CERT_POLICIES_ID); | |
| 2402 | + if (ext == null) { | |
| 2403 | + if (debug != null) { | |
| 2404 | + debug.println("X509CertSelector.match: " | |
| 2405 | + + "no certificate policy extension"); | |
| 2406 | + } | |
| 2407 | + return false; | |
| 2408 | + } | |
| 2409 | + List<PolicyInformation> policies = (List<PolicyInformation>)ext.get(CertificatePoliciesExtension.POLICIES); | |
| 2410 | + /* | |
| 2411 | + * Convert the Vector of PolicyInformation to a Vector | |
| 2412 | + * of CertificatePolicyIds for easier comparison. | |
| 2413 | + */ | |
| 2414 | + List<CertificatePolicyId> policyIDs = new ArrayList<CertificatePolicyId>(policies.size()); | |
| 2415 | + for (PolicyInformation info : policies) { | |
| 2416 | + policyIDs.add(info.getPolicyIdentifier()); | |
| 2417 | + } | |
| 2418 | + if (policy != null) { | |
| 2419 | + boolean foundOne = false; | |
| 2420 | + /* | |
| 2421 | + * if the user passes in an empty policy Set, then | |
| 2422 | + * we just want to make sure that the candidate certificate | |
| 2423 | + * has some policy OID in its CertPoliciesExtension | |
| 2424 | + */ | |
| 2425 | + if (policy.getCertPolicyIds().isEmpty()) { | |
| 2426 | + if (policyIDs.isEmpty()) { | |
| 2427 | + if (debug != null) { | |
| 2428 | + debug.println("X509CertSelector.match: " | |
| 2429 | + + "cert failed policyAny criterion"); | |
| 2430 | + } | |
| 2431 | + return false; | |
| 2432 | + } | |
| 2433 | + } else { | |
| 2434 | + for (CertificatePolicyId id : policy.getCertPolicyIds()) { | |
| 2435 | + if (policyIDs.contains(id)) { | |
| 2436 | + foundOne = true; | |
| 2437 | + break; | |
| 2438 | + } | |
| 2439 | + } | |
| 2440 | + if (!foundOne) { | |
| 2441 | + if (debug != null) { | |
| 2442 | + debug.println("X509CertSelector.match: " | |
| 2443 | + + "cert failed policyAny criterion"); | |
| 2444 | + } | |
| 2445 | + return false; | |
| 2446 | + } | |
| 2447 | + } | |
| 2448 | + } | |
| 2449 | + } catch (IOException ex) { | |
| 2450 | + if (debug != null) { | |
| 2451 | + debug.println("X509CertSelector.match: " | |
| 2452 | + + "IOException in certificate policy ID check"); | |
| 2453 | + } | |
| 2454 | + return false; | |
| 2455 | + } | |
| 2456 | + return true; | |
| 2457 | + } | |
| 2458 | + | |
| 2459 | + /* match on pathToNames */ | |
| 2460 | + private boolean matchPathToNames(X509Certificate xcert) { | |
| 2461 | + if (pathToGeneralNames == null) { | |
| 2462 | + return true; | |
| 2463 | + } | |
| 2464 | + try { | |
| 2465 | + NameConstraintsExtension ext = (NameConstraintsExtension) | |
| 2466 | + getExtensionObject(xcert, NAME_CONSTRAINTS_ID); | |
| 2467 | + if (ext == null) { | |
| 2468 | + return true; | |
| 2469 | + } | |
| 2470 | + if ((debug != null) && debug.isOn("certpath")) { | |
| 2471 | + debug.println("X509CertSelector.match pathToNames:\n"); | |
| 2472 | + Iterator<GeneralNameInterface> i = | |
| 2473 | + pathToGeneralNames.iterator(); | |
| 2474 | + while (i.hasNext()) { | |
| 2475 | + debug.println(" " + i.next() + "\n"); | |
| 2476 | + } | |
| 2477 | + } | |
| 2478 | + | |
| 2479 | + GeneralSubtrees permitted = (GeneralSubtrees) | |
| 2480 | + ext.get(NameConstraintsExtension.PERMITTED_SUBTREES); | |
| 2481 | + GeneralSubtrees excluded = (GeneralSubtrees) | |
| 2482 | + ext.get(NameConstraintsExtension.EXCLUDED_SUBTREES); | |
| 2483 | + if (excluded != null) { | |
| 2484 | + if (matchExcluded(excluded) == false) { | |
| 2485 | + return false; | |
| 2486 | + } | |
| 2487 | + } | |
| 2488 | + if (permitted != null) { | |
| 2489 | + if (matchPermitted(permitted) == false) { | |
| 2490 | + return false; | |
| 2491 | + } | |
| 2492 | + } | |
| 2493 | + } catch (IOException ex) { | |
| 2494 | + if (debug != null) { | |
| 2495 | + debug.println("X509CertSelector.match: " | |
| 2496 | + + "IOException in name constraints check"); | |
| 2497 | + } | |
| 2498 | + return false; | |
| 2499 | + } | |
| 2500 | + return true; | |
| 2501 | + } | |
| 2502 | + | |
| 2503 | + private boolean matchExcluded(GeneralSubtrees excluded) { | |
| 2504 | + /* | |
| 2505 | + * Enumerate through excluded and compare each entry | |
| 2506 | + * to all pathToNames. If any pathToName is within any of the | |
| 2507 | + * subtrees listed in excluded, return false. | |
| 2508 | + */ | |
| 2509 | + for (Iterator<GeneralSubtree> t = excluded.iterator(); t.hasNext(); ) { | |
| 2510 | + GeneralSubtree tree = t.next(); | |
| 2511 | + GeneralNameInterface excludedName = tree.getName().getName(); | |
| 2512 | + Iterator<GeneralNameInterface> i = pathToGeneralNames.iterator(); | |
| 2513 | + while (i.hasNext()) { | |
| 2514 | + GeneralNameInterface pathToName = i.next(); | |
| 2515 | + if (excludedName.getType() == pathToName.getType()) { | |
| 2516 | + switch (pathToName.constrains(excludedName)) { | |
| 2517 | + case GeneralNameInterface.NAME_WIDENS: | |
| 2518 | + case GeneralNameInterface.NAME_MATCH: | |
| 2519 | + if (debug != null) { | |
| 2520 | + debug.println("X509CertSelector.match: name constraints " | |
| 2521 | + + "inhibit path to specified name"); | |
| 2522 | + debug.println("X509CertSelector.match: excluded name: " + | |
| 2523 | + pathToName); | |
| 2524 | + } | |
| 2525 | + return false; | |
| 2526 | + default: | |
| 2527 | + } | |
| 2528 | + } | |
| 2529 | + } | |
| 2530 | + } | |
| 2531 | + return true; | |
| 2532 | + } | |
| 2533 | + | |
| 2534 | + private boolean matchPermitted(GeneralSubtrees permitted) { | |
| 2535 | + /* | |
| 2536 | + * Enumerate through pathToNames, checking that each pathToName | |
| 2537 | + * is in at least one of the subtrees listed in permitted. | |
| 2538 | + * If not, return false. However, if no subtrees of a given type | |
| 2539 | + * are listed, all names of that type are permitted. | |
| 2540 | + */ | |
| 2541 | + Iterator<GeneralNameInterface> i = pathToGeneralNames.iterator(); | |
| 2542 | + while (i.hasNext()) { | |
| 2543 | + GeneralNameInterface pathToName = i.next(); | |
| 2544 | + Iterator<GeneralSubtree> t = permitted.iterator(); | |
| 2545 | + boolean permittedNameFound = false; | |
| 2546 | + boolean nameTypeFound = false; | |
| 2547 | + String names = ""; | |
| 2548 | + while (t.hasNext() && !permittedNameFound) { | |
| 2549 | + GeneralSubtree tree = t.next(); | |
| 2550 | + GeneralNameInterface permittedName = tree.getName().getName(); | |
| 2551 | + if (permittedName.getType() == pathToName.getType()) { | |
| 2552 | + nameTypeFound = true; | |
| 2553 | + names = names + " " + permittedName; | |
| 2554 | + switch (pathToName.constrains(permittedName)) { | |
| 2555 | + case GeneralNameInterface.NAME_WIDENS: | |
| 2556 | + case GeneralNameInterface.NAME_MATCH: | |
| 2557 | + permittedNameFound = true; | |
| 2558 | + break; | |
| 2559 | + default: | |
| 2560 | + } | |
| 2561 | + } | |
| 2562 | + } | |
| 2563 | + if (!permittedNameFound && nameTypeFound) { | |
| 2564 | + if (debug != null) | |
| 2565 | + debug.println("X509CertSelector.match: " + | |
| 2566 | + "name constraints inhibit path to specified name; " + | |
| 2567 | + "permitted names of type " + pathToName.getType() + | |
| 2568 | + ": " + names); | |
| 2569 | + return false; | |
| 2570 | + } | |
| 2571 | + } | |
| 2572 | + return true; | |
| 2573 | + } | |
| 2574 | + | |
| 2575 | + /* match on basic constraints */ | |
| 2576 | + private boolean matchBasicConstraints(X509Certificate xcert) { | |
| 2577 | + if (basicConstraints == -1) { | |
| 2578 | + return true; | |
| 2579 | + } | |
| 2580 | + int maxPathLen = xcert.getBasicConstraints(); | |
| 2581 | + if (basicConstraints == -2) { | |
| 2582 | + if (maxPathLen != -1) { | |
| 2583 | + if (debug != null) { | |
| 2584 | + debug.println("X509CertSelector.match: not an EE cert"); | |
| 2585 | + } | |
| 2586 | + return false; | |
| 2587 | + } | |
| 2588 | + } else { | |
| 2589 | + if (maxPathLen < basicConstraints) { | |
| 2590 | + if (debug != null) { | |
| 2591 | + debug.println("X509CertSelector.match: maxPathLen too small (" | |
| 2592 | + + maxPathLen + " < " + basicConstraints + ")"); | |
| 2593 | + } | |
| 2594 | + return false; | |
| 2595 | + } | |
| 2596 | + } | |
| 2597 | + return true; | |
| 2598 | + } | |
| 2599 | + | |
| 2600 | + private static Set<?> cloneSet(Set<?> set) { | |
| 2601 | + if (set instanceof HashSet) { | |
| 2602 | + Object clone = ((HashSet<?>)set).clone(); | |
| 2603 | + return (Set<?>)clone; | |
| 2604 | + } else { | |
| 2605 | + return new HashSet<Object>(set); | |
| 2606 | + } | |
| 2607 | + } | |
| 2608 | + | |
| 2609 | + /** | |
| 2610 | + * Returns a copy of this object. | |
| 2611 | + * | |
| 2612 | + * @return the copy | |
| 2613 | + */ | |
| 2614 | + public Object clone() { | |
| 2615 | + try { | |
| 2616 | + X509CertSelector copy = (X509CertSelector)super.clone(); | |
| 2617 | + // Must clone these because addPathToName et al. modify them | |
| 2618 | + if (subjectAlternativeNames != null) { | |
| 2619 | + copy.subjectAlternativeNames = | |
| 2620 | + (Set<List<?>>)cloneSet(subjectAlternativeNames); | |
| 2621 | + copy.subjectAlternativeGeneralNames = | |
| 2622 | + (Set<GeneralNameInterface>)cloneSet | |
| 2623 | + (subjectAlternativeGeneralNames); | |
| 2624 | + } | |
| 2625 | + if (pathToGeneralNames != null) { | |
| 2626 | + copy.pathToNames = | |
| 2627 | + (Set<List<?>>)cloneSet(pathToNames); | |
| 2628 | + copy.pathToGeneralNames = | |
| 2629 | + (Set<GeneralNameInterface>)cloneSet | |
| 2630 | + (pathToGeneralNames); | |
| 2631 | + } | |
| 2632 | + return copy; | |
| 2633 | + } catch (CloneNotSupportedException e) { | |
| 2634 | + /* Cannot happen */ | |
| 2635 | + throw new InternalError(e.toString()); | |
| 2636 | + } | |
| 2637 | + } | |
| 2638 | +} | |
Binary file not shown.
| @@ -0,0 +1,649 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.math.BigInteger; | |
| 29 | +import java.security.Principal; | |
| 30 | +import java.security.PublicKey; | |
| 31 | +import java.util.Collection; | |
| 32 | +import java.util.Date; | |
| 33 | +import java.util.List; | |
| 34 | +import javax.security.auth.x500.X500Principal; | |
| 35 | + | |
| 36 | +import sun.security.x509.X509CertImpl; | |
| 37 | + | |
| 38 | +/** | |
| 39 | + * <p> | |
| 40 | + * Abstract class for X.509 certificates. This provides a standard | |
| 41 | + * way to access all the attributes of an X.509 certificate. | |
| 42 | + * <p> | |
| 43 | + * In June of 1996, the basic X.509 v3 format was completed by | |
| 44 | + * ISO/IEC and ANSI X9, which is described below in ASN.1: | |
| 45 | + * <pre> | |
| 46 | + * Certificate ::= SEQUENCE { | |
| 47 | + * tbsCertificate TBSCertificate, | |
| 48 | + * signatureAlgorithm AlgorithmIdentifier, | |
| 49 | + * signature BIT STRING } | |
| 50 | + * </pre> | |
| 51 | + * <p> | |
| 52 | + * These certificates are widely used to support authentication and | |
| 53 | + * other functionality in Internet security systems. Common applications | |
| 54 | + * include Privacy Enhanced Mail (PEM), Transport Layer Security (SSL), | |
| 55 | + * code signing for trusted software distribution, and Secure Electronic | |
| 56 | + * Transactions (SET). | |
| 57 | + * <p> | |
| 58 | + * These certificates are managed and vouched for by <em>Certificate | |
| 59 | + * Authorities</em> (CAs). CAs are services which create certificates by | |
| 60 | + * placing data in the X.509 standard format and then digitally signing | |
| 61 | + * that data. CAs act as trusted third parties, making introductions | |
| 62 | + * between principals who have no direct knowledge of each other. | |
| 63 | + * CA certificates are either signed by themselves, or by some other | |
| 64 | + * CA such as a "root" CA. | |
| 65 | + * <p> | |
| 66 | + * More information can be found in | |
| 67 | + * <a href="http://www.ietf.org/rfc/rfc3280.txt">RFC 3280: Internet X.509 | |
| 68 | + * Public Key Infrastructure Certificate and CRL Profile</a>. | |
| 69 | + * <p> | |
| 70 | + * The ASN.1 definition of <code>tbsCertificate</code> is: | |
| 71 | + * <pre> | |
| 72 | + * TBSCertificate ::= SEQUENCE { | |
| 73 | + * version [0] EXPLICIT Version DEFAULT v1, | |
| 74 | + * serialNumber CertificateSerialNumber, | |
| 75 | + * signature AlgorithmIdentifier, | |
| 76 | + * issuer Name, | |
| 77 | + * validity Validity, | |
| 78 | + * subject Name, | |
| 79 | + * subjectPublicKeyInfo SubjectPublicKeyInfo, | |
| 80 | + * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, | |
| 81 | + * -- If present, version must be v2 or v3 | |
| 82 | + * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, | |
| 83 | + * -- If present, version must be v2 or v3 | |
| 84 | + * extensions [3] EXPLICIT Extensions OPTIONAL | |
| 85 | + * -- If present, version must be v3 | |
| 86 | + * } | |
| 87 | + * </pre> | |
| 88 | + * <p> | |
| 89 | + * Certificates are instantiated using a certificate factory. The following is | |
| 90 | + * an example of how to instantiate an X.509 certificate: | |
| 91 | + * <pre> | |
| 92 | + * InputStream inStream = null; | |
| 93 | + * try { | |
| 94 | + * inStream = new FileInputStream("fileName-of-cert"); | |
| 95 | + * CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |
| 96 | + * X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); | |
| 97 | + * } finally { | |
| 98 | + * if (inStream != null) { | |
| 99 | + * inStream.close(); | |
| 100 | + * } | |
| 101 | + * } | |
| 102 | + * </pre> | |
| 103 | + * | |
| 104 | + * @author Hemma Prafullchandra | |
| 105 | + * | |
| 106 | + * | |
| 107 | + * @see Certificate | |
| 108 | + * @see CertificateFactory | |
| 109 | + * @see X509Extension | |
| 110 | + */ | |
| 111 | + | |
| 112 | +public abstract class X509Certificate extends Certificate | |
| 113 | +implements X509Extension { | |
| 114 | + | |
| 115 | + private static final long serialVersionUID = -2491127588187038216L; | |
| 116 | + | |
| 117 | + private transient X500Principal subjectX500Principal, issuerX500Principal; | |
| 118 | + | |
| 119 | + /** | |
| 120 | + * Constructor for X.509 certificates. | |
| 121 | + */ | |
| 122 | + protected X509Certificate() { | |
| 123 | + super("X.509"); | |
| 124 | + } | |
| 125 | + | |
| 126 | + /** | |
| 127 | + * Checks that the certificate is currently valid. It is if | |
| 128 | + * the current date and time are within the validity period given in the | |
| 129 | + * certificate. | |
| 130 | + * <p> | |
| 131 | + * The validity period consists of two date/time values: | |
| 132 | + * the first and last dates (and times) on which the certificate | |
| 133 | + * is valid. It is defined in | |
| 134 | + * ASN.1 as: | |
| 135 | + * <pre> | |
| 136 | + * validity Validity<p> | |
| 137 | + * Validity ::= SEQUENCE { | |
| 138 | + * notBefore CertificateValidityDate, | |
| 139 | + * notAfter CertificateValidityDate }<p> | |
| 140 | + * CertificateValidityDate ::= CHOICE { | |
| 141 | + * utcTime UTCTime, | |
| 142 | + * generalTime GeneralizedTime } | |
| 143 | + * </pre> | |
| 144 | + * | |
| 145 | + * @exception CertificateExpiredException if the certificate has expired. | |
| 146 | + * @exception CertificateNotYetValidException if the certificate is not | |
| 147 | + * yet valid. | |
| 148 | + */ | |
| 149 | + public abstract void checkValidity() | |
| 150 | + throws CertificateExpiredException, CertificateNotYetValidException; | |
| 151 | + | |
| 152 | + /** | |
| 153 | + * Checks that the given date is within the certificate's | |
| 154 | + * validity period. In other words, this determines whether the | |
| 155 | + * certificate would be valid at the given date/time. | |
| 156 | + * | |
| 157 | + * @param date the Date to check against to see if this certificate | |
| 158 | + * is valid at that date/time. | |
| 159 | + * | |
| 160 | + * @exception CertificateExpiredException if the certificate has expired | |
| 161 | + * with respect to the <code>date</code> supplied. | |
| 162 | + * @exception CertificateNotYetValidException if the certificate is not | |
| 163 | + * yet valid with respect to the <code>date</code> supplied. | |
| 164 | + * | |
| 165 | + * @see #checkValidity() | |
| 166 | + */ | |
| 167 | + public abstract void checkValidity(Date date) | |
| 168 | + throws CertificateExpiredException, CertificateNotYetValidException; | |
| 169 | + | |
| 170 | + /** | |
| 171 | + * Gets the <code>version</code> (version number) value from the | |
| 172 | + * certificate. | |
| 173 | + * The ASN.1 definition for this is: | |
| 174 | + * <pre> | |
| 175 | + * version [0] EXPLICIT Version DEFAULT v1<p> | |
| 176 | + * Version ::= INTEGER { v1(0), v2(1), v3(2) } | |
| 177 | + * </pre> | |
| 178 | + * @return the version number, i.e. 1, 2 or 3. | |
| 179 | + */ | |
| 180 | + public abstract int getVersion(); | |
| 181 | + | |
| 182 | + /** | |
| 183 | + * Gets the <code>serialNumber</code> value from the certificate. | |
| 184 | + * The serial number is an integer assigned by the certification | |
| 185 | + * authority to each certificate. It must be unique for each | |
| 186 | + * certificate issued by a given CA (i.e., the issuer name and | |
| 187 | + * serial number identify a unique certificate). | |
| 188 | + * The ASN.1 definition for this is: | |
| 189 | + * <pre> | |
| 190 | + * serialNumber CertificateSerialNumber<p> | |
| 191 | + * | |
| 192 | + * CertificateSerialNumber ::= INTEGER | |
| 193 | + * </pre> | |
| 194 | + * | |
| 195 | + * @return the serial number. | |
| 196 | + */ | |
| 197 | + public abstract BigInteger getSerialNumber(); | |
| 198 | + | |
| 199 | + /** | |
| 200 | + * <strong>Denigrated</strong>, replaced by {@linkplain | |
| 201 | + * #getIssuerX500Principal()}. This method returns the <code>issuer</code> | |
| 202 | + * as an implementation specific Principal object, which should not be | |
| 203 | + * relied upon by portable code. | |
| 204 | + * | |
| 205 | + * <p> | |
| 206 | + * Gets the <code>issuer</code> (issuer distinguished name) value from | |
| 207 | + * the certificate. The issuer name identifies the entity that signed (and | |
| 208 | + * issued) the certificate. | |
| 209 | + * | |
| 210 | + * <p>The issuer name field contains an | |
| 211 | + * X.500 distinguished name (DN). | |
| 212 | + * The ASN.1 definition for this is: | |
| 213 | + * <pre> | |
| 214 | + * issuer Name<p> | |
| 215 | + * | |
| 216 | + * Name ::= CHOICE { RDNSequence } | |
| 217 | + * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName | |
| 218 | + * RelativeDistinguishedName ::= | |
| 219 | + * SET OF AttributeValueAssertion | |
| 220 | + * | |
| 221 | + * AttributeValueAssertion ::= SEQUENCE { | |
| 222 | + * AttributeType, | |
| 223 | + * AttributeValue } | |
| 224 | + * AttributeType ::= OBJECT IDENTIFIER | |
| 225 | + * AttributeValue ::= ANY | |
| 226 | + * </pre> | |
| 227 | + * The <code>Name</code> describes a hierarchical name composed of | |
| 228 | + * attributes, | |
| 229 | + * such as country name, and corresponding values, such as US. | |
| 230 | + * The type of the <code>AttributeValue</code> component is determined by | |
| 231 | + * the <code>AttributeType</code>; in general it will be a | |
| 232 | + * <code>directoryString</code>. A <code>directoryString</code> is usually | |
| 233 | + * one of <code>PrintableString</code>, | |
| 234 | + * <code>TeletexString</code> or <code>UniversalString</code>. | |
| 235 | + * | |
| 236 | + * @return a Principal whose name is the issuer distinguished name. | |
| 237 | + */ | |
| 238 | + public abstract Principal getIssuerDN(); | |
| 239 | + | |
| 240 | + /** | |
| 241 | + * Returns the issuer (issuer distinguished name) value from the | |
| 242 | + * certificate as an <code>X500Principal</code>. | |
| 243 | + * <p> | |
| 244 | + * It is recommended that subclasses override this method. | |
| 245 | + * | |
| 246 | + * @return an <code>X500Principal</code> representing the issuer | |
| 247 | + * distinguished name | |
| 248 | + * @since 1.4 | |
| 249 | + */ | |
| 250 | + public X500Principal getIssuerX500Principal() { | |
| 251 | + if (issuerX500Principal == null) { | |
| 252 | + issuerX500Principal = X509CertImpl.getIssuerX500Principal(this); | |
| 253 | + } | |
| 254 | + return issuerX500Principal; | |
| 255 | + } | |
| 256 | + | |
| 257 | + /** | |
| 258 | + * <strong>Denigrated</strong>, replaced by {@linkplain | |
| 259 | + * #getSubjectX500Principal()}. This method returns the <code>subject</code> | |
| 260 | + * as an implementation specific Principal object, which should not be | |
| 261 | + * relied upon by portable code. | |
| 262 | + * | |
| 263 | + * <p> | |
| 264 | + * Gets the <code>subject</code> (subject distinguished name) value | |
| 265 | + * from the certificate. If the <code>subject</code> value is empty, | |
| 266 | + * then the <code>getName()</code> method of the returned | |
| 267 | + * <code>Principal</code> object returns an empty string (""). | |
| 268 | + * | |
| 269 | + * <p> The ASN.1 definition for this is: | |
| 270 | + * <pre> | |
| 271 | + * subject Name | |
| 272 | + * </pre> | |
| 273 | + * | |
| 274 | + * <p>See {@link #getIssuerDN() getIssuerDN} for <code>Name</code> | |
| 275 | + * and other relevant definitions. | |
| 276 | + * | |
| 277 | + * @return a Principal whose name is the subject name. | |
| 278 | + */ | |
| 279 | + public abstract Principal getSubjectDN(); | |
| 280 | + | |
| 281 | + /** | |
| 282 | + * Returns the subject (subject distinguished name) value from the | |
| 283 | + * certificate as an <code>X500Principal</code>. If the subject value | |
| 284 | + * is empty, then the <code>getName()</code> method of the returned | |
| 285 | + * <code>X500Principal</code> object returns an empty string (""). | |
| 286 | + * <p> | |
| 287 | + * It is recommended that subclasses override this method. | |
| 288 | + * | |
| 289 | + * @return an <code>X500Principal</code> representing the subject | |
| 290 | + * distinguished name | |
| 291 | + * @since 1.4 | |
| 292 | + */ | |
| 293 | + public X500Principal getSubjectX500Principal() { | |
| 294 | + if (subjectX500Principal == null) { | |
| 295 | + subjectX500Principal = X509CertImpl.getSubjectX500Principal(this); | |
| 296 | + } | |
| 297 | + return subjectX500Principal; | |
| 298 | + } | |
| 299 | + | |
| 300 | + /** | |
| 301 | + * Gets the <code>notBefore</code> date from the validity period of | |
| 302 | + * the certificate. | |
| 303 | + * The relevant ASN.1 definitions are: | |
| 304 | + * <pre> | |
| 305 | + * validity Validity<p> | |
| 306 | + * | |
| 307 | + * Validity ::= SEQUENCE { | |
| 308 | + * notBefore CertificateValidityDate, | |
| 309 | + * notAfter CertificateValidityDate }<p> | |
| 310 | + * CertificateValidityDate ::= CHOICE { | |
| 311 | + * utcTime UTCTime, | |
| 312 | + * generalTime GeneralizedTime } | |
| 313 | + * </pre> | |
| 314 | + * | |
| 315 | + * @return the start date of the validity period. | |
| 316 | + * @see #checkValidity | |
| 317 | + */ | |
| 318 | + public abstract Date getNotBefore(); | |
| 319 | + | |
| 320 | + /** | |
| 321 | + * Gets the <code>notAfter</code> date from the validity period of | |
| 322 | + * the certificate. See {@link #getNotBefore() getNotBefore} | |
| 323 | + * for relevant ASN.1 definitions. | |
| 324 | + * | |
| 325 | + * @return the end date of the validity period. | |
| 326 | + * @see #checkValidity | |
| 327 | + */ | |
| 328 | + public abstract Date getNotAfter(); | |
| 329 | + | |
| 330 | + /** | |
| 331 | + * Gets the DER-encoded certificate information, the | |
| 332 | + * <code>tbsCertificate</code> from this certificate. | |
| 333 | + * This can be used to verify the signature independently. | |
| 334 | + * | |
| 335 | + * @return the DER-encoded certificate information. | |
| 336 | + * @exception CertificateEncodingException if an encoding error occurs. | |
| 337 | + */ | |
| 338 | + public abstract byte[] getTBSCertificate() | |
| 339 | + throws CertificateEncodingException; | |
| 340 | + | |
| 341 | + /** | |
| 342 | + * Gets the <code>signature</code> value (the raw signature bits) from | |
| 343 | + * the certificate. | |
| 344 | + * The ASN.1 definition for this is: | |
| 345 | + * <pre> | |
| 346 | + * signature BIT STRING | |
| 347 | + * </pre> | |
| 348 | + * | |
| 349 | + * @return the signature. | |
| 350 | + */ | |
| 351 | + public abstract byte[] getSignature(); | |
| 352 | + | |
| 353 | + /** | |
| 354 | + * Gets the signature algorithm name for the certificate | |
| 355 | + * signature algorithm. An example is the string "SHA256withRSA". | |
| 356 | + * The ASN.1 definition for this is: | |
| 357 | + * <pre> | |
| 358 | + * signatureAlgorithm AlgorithmIdentifier<p> | |
| 359 | + * AlgorithmIdentifier ::= SEQUENCE { | |
| 360 | + * algorithm OBJECT IDENTIFIER, | |
| 361 | + * parameters ANY DEFINED BY algorithm OPTIONAL } | |
| 362 | + * -- contains a value of the type | |
| 363 | + * -- registered for use with the | |
| 364 | + * -- algorithm object identifier value | |
| 365 | + * </pre> | |
| 366 | + * | |
| 367 | + * <p>The algorithm name is determined from the <code>algorithm</code> | |
| 368 | + * OID string. | |
| 369 | + * | |
| 370 | + * @return the signature algorithm name. | |
| 371 | + */ | |
| 372 | + public abstract String getSigAlgName(); | |
| 373 | + | |
| 374 | + /** | |
| 375 | + * Gets the signature algorithm OID string from the certificate. | |
| 376 | + * An OID is represented by a set of nonnegative whole numbers separated | |
| 377 | + * by periods. | |
| 378 | + * For example, the string "1.2.840.10040.4.3" identifies the SHA-1 | |
| 379 | + * with DSA signature algorithm defined in | |
| 380 | + * <a href="http://www.ietf.org/rfc/rfc3279.txt">RFC 3279: Algorithms and | |
| 381 | + * Identifiers for the Internet X.509 Public Key Infrastructure Certificate | |
| 382 | + * and CRL Profile</a>. | |
| 383 | + * | |
| 384 | + * <p>See {@link #getSigAlgName() getSigAlgName} for | |
| 385 | + * relevant ASN.1 definitions. | |
| 386 | + * | |
| 387 | + * @return the signature algorithm OID string. | |
| 388 | + */ | |
| 389 | + public abstract String getSigAlgOID(); | |
| 390 | + | |
| 391 | + /** | |
| 392 | + * Gets the DER-encoded signature algorithm parameters from this | |
| 393 | + * certificate's signature algorithm. In most cases, the signature | |
| 394 | + * algorithm parameters are null; the parameters are usually | |
| 395 | + * supplied with the certificate's public key. | |
| 396 | + * If access to individual parameter values is needed then use | |
| 397 | + * {@link java.security.AlgorithmParameters AlgorithmParameters} | |
| 398 | + * and instantiate with the name returned by | |
| 399 | + * {@link #getSigAlgName() getSigAlgName}. | |
| 400 | + * | |
| 401 | + * <p>See {@link #getSigAlgName() getSigAlgName} for | |
| 402 | + * relevant ASN.1 definitions. | |
| 403 | + * | |
| 404 | + * @return the DER-encoded signature algorithm parameters, or | |
| 405 | + * null if no parameters are present. | |
| 406 | + */ | |
| 407 | + public abstract byte[] getSigAlgParams(); | |
| 408 | + | |
| 409 | + /** | |
| 410 | + * Gets the <code>issuerUniqueID</code> value from the certificate. | |
| 411 | + * The issuer unique identifier is present in the certificate | |
| 412 | + * to handle the possibility of reuse of issuer names over time. | |
| 413 | + * RFC 3280 recommends that names not be reused and that | |
| 414 | + * conforming certificates not make use of unique identifiers. | |
| 415 | + * Applications conforming to that profile should be capable of | |
| 416 | + * parsing unique identifiers and making comparisons. | |
| 417 | + * | |
| 418 | + * <p>The ASN.1 definition for this is: | |
| 419 | + * <pre> | |
| 420 | + * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL<p> | |
| 421 | + * UniqueIdentifier ::= BIT STRING | |
| 422 | + * </pre> | |
| 423 | + * | |
| 424 | + * @return the issuer unique identifier or null if it is not | |
| 425 | + * present in the certificate. | |
| 426 | + */ | |
| 427 | + public abstract boolean[] getIssuerUniqueID(); | |
| 428 | + | |
| 429 | + /** | |
| 430 | + * Gets the <code>subjectUniqueID</code> value from the certificate. | |
| 431 | + * | |
| 432 | + * <p>The ASN.1 definition for this is: | |
| 433 | + * <pre> | |
| 434 | + * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL<p> | |
| 435 | + * UniqueIdentifier ::= BIT STRING | |
| 436 | + * </pre> | |
| 437 | + * | |
| 438 | + * @return the subject unique identifier or null if it is not | |
| 439 | + * present in the certificate. | |
| 440 | + */ | |
| 441 | + public abstract boolean[] getSubjectUniqueID(); | |
| 442 | + | |
| 443 | + /** | |
| 444 | + * Gets a boolean array representing bits of | |
| 445 | + * the <code>KeyUsage</code> extension, (OID = 2.5.29.15). | |
| 446 | + * The key usage extension defines the purpose (e.g., encipherment, | |
| 447 | + * signature, certificate signing) of the key contained in the | |
| 448 | + * certificate. | |
| 449 | + * The ASN.1 definition for this is: | |
| 450 | + * <pre> | |
| 451 | + * KeyUsage ::= BIT STRING { | |
| 452 | + * digitalSignature (0), | |
| 453 | + * nonRepudiation (1), | |
| 454 | + * keyEncipherment (2), | |
| 455 | + * dataEncipherment (3), | |
| 456 | + * keyAgreement (4), | |
| 457 | + * keyCertSign (5), | |
| 458 | + * cRLSign (6), | |
| 459 | + * encipherOnly (7), | |
| 460 | + * decipherOnly (8) } | |
| 461 | + * </pre> | |
| 462 | + * RFC 3280 recommends that when used, this be marked | |
| 463 | + * as a critical extension. | |
| 464 | + * | |
| 465 | + * @return the KeyUsage extension of this certificate, represented as | |
| 466 | + * an array of booleans. The order of KeyUsage values in the array is | |
| 467 | + * the same as in the above ASN.1 definition. The array will contain a | |
| 468 | + * value for each KeyUsage defined above. If the KeyUsage list encoded | |
| 469 | + * in the certificate is longer than the above list, it will not be | |
| 470 | + * truncated. Returns null if this certificate does not | |
| 471 | + * contain a KeyUsage extension. | |
| 472 | + */ | |
| 473 | + public abstract boolean[] getKeyUsage(); | |
| 474 | + | |
| 475 | + /** | |
| 476 | + * Gets an unmodifiable list of Strings representing the OBJECT | |
| 477 | + * IDENTIFIERs of the <code>ExtKeyUsageSyntax</code> field of the | |
| 478 | + * extended key usage extension, (OID = 2.5.29.37). It indicates | |
| 479 | + * one or more purposes for which the certified public key may be | |
| 480 | + * used, in addition to or in place of the basic purposes | |
| 481 | + * indicated in the key usage extension field. The ASN.1 | |
| 482 | + * definition for this is: | |
| 483 | + * <pre> | |
| 484 | + * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId<p> | |
| 485 | + * | |
| 486 | + * KeyPurposeId ::= OBJECT IDENTIFIER<p> | |
| 487 | + * </pre> | |
| 488 | + * | |
| 489 | + * Key purposes may be defined by any organization with a | |
| 490 | + * need. Object identifiers used to identify key purposes shall be | |
| 491 | + * assigned in accordance with IANA or ITU-T Rec. X.660 | | |
| 492 | + * ISO/IEC/ITU 9834-1. | |
| 493 | + * <p> | |
| 494 | + * This method was added to version 1.4 of the Java 2 Platform Standard | |
| 495 | + * Edition. In order to maintain backwards compatibility with existing | |
| 496 | + * service providers, this method is not <code>abstract</code> | |
| 497 | + * and it provides a default implementation. Subclasses | |
| 498 | + * should override this method with a correct implementation. | |
| 499 | + * | |
| 500 | + * @return the ExtendedKeyUsage extension of this certificate, | |
| 501 | + * as an unmodifiable list of object identifiers represented | |
| 502 | + * as Strings. Returns null if this certificate does not | |
| 503 | + * contain an ExtendedKeyUsage extension. | |
| 504 | + * @throws CertificateParsingException if the extension cannot be decoded | |
| 505 | + * @since 1.4 | |
| 506 | + */ | |
| 507 | + public List<String> getExtendedKeyUsage() throws CertificateParsingException { | |
| 508 | + return X509CertImpl.getExtendedKeyUsage(this); | |
| 509 | + } | |
| 510 | + | |
| 511 | + /** | |
| 512 | + * Gets the certificate constraints path length from the | |
| 513 | + * critical <code>BasicConstraints</code> extension, (OID = 2.5.29.19). | |
| 514 | + * <p> | |
| 515 | + * The basic constraints extension identifies whether the subject | |
| 516 | + * of the certificate is a Certificate Authority (CA) and | |
| 517 | + * how deep a certification path may exist through that CA. The | |
| 518 | + * <code>pathLenConstraint</code> field (see below) is meaningful | |
| 519 | + * only if <code>cA</code> is set to TRUE. In this case, it gives the | |
| 520 | + * maximum number of CA certificates that may follow this certificate in a | |
| 521 | + * certification path. A value of zero indicates that only an end-entity | |
| 522 | + * certificate may follow in the path. | |
| 523 | + * <p> | |
| 524 | + * The ASN.1 definition for this is: | |
| 525 | + * <pre> | |
| 526 | + * BasicConstraints ::= SEQUENCE { | |
| 527 | + * cA BOOLEAN DEFAULT FALSE, | |
| 528 | + * pathLenConstraint INTEGER (0..MAX) OPTIONAL } | |
| 529 | + * </pre> | |
| 530 | + * | |
| 531 | + * @return the value of <code>pathLenConstraint</code> if the | |
| 532 | + * BasicConstraints extension is present in the certificate and the | |
| 533 | + * subject of the certificate is a CA, otherwise -1. | |
| 534 | + * If the subject of the certificate is a CA and | |
| 535 | + * <code>pathLenConstraint</code> does not appear, | |
| 536 | + * <code>Integer.MAX_VALUE</code> is returned to indicate that there is no | |
| 537 | + * limit to the allowed length of the certification path. | |
| 538 | + */ | |
| 539 | + public abstract int getBasicConstraints(); | |
| 540 | + | |
| 541 | + /** | |
| 542 | + * Gets an immutable collection of subject alternative names from the | |
| 543 | + * <code>SubjectAltName</code> extension, (OID = 2.5.29.17). | |
| 544 | + * <p> | |
| 545 | + * The ASN.1 definition of the <code>SubjectAltName</code> extension is: | |
| 546 | + * <pre> | |
| 547 | + * SubjectAltName ::= GeneralNames | |
| 548 | + * | |
| 549 | + * GeneralNames :: = SEQUENCE SIZE (1..MAX) OF GeneralName | |
| 550 | + * | |
| 551 | + * GeneralName ::= CHOICE { | |
| 552 | + * otherName [0] OtherName, | |
| 553 | + * rfc822Name [1] IA5String, | |
| 554 | + * dNSName [2] IA5String, | |
| 555 | + * x400Address [3] ORAddress, | |
| 556 | + * directoryName [4] Name, | |
| 557 | + * ediPartyName [5] EDIPartyName, | |
| 558 | + * uniformResourceIdentifier [6] IA5String, | |
| 559 | + * iPAddress [7] OCTET STRING, | |
| 560 | + * registeredID [8] OBJECT IDENTIFIER} | |
| 561 | + * </pre> | |
| 562 | + * <p> | |
| 563 | + * If this certificate does not contain a <code>SubjectAltName</code> | |
| 564 | + * extension, <code>null</code> is returned. Otherwise, a | |
| 565 | + * <code>Collection</code> is returned with an entry representing each | |
| 566 | + * <code>GeneralName</code> included in the extension. Each entry is a | |
| 567 | + * <code>List</code> whose first entry is an <code>Integer</code> | |
| 568 | + * (the name type, 0-8) and whose second entry is a <code>String</code> | |
| 569 | + * or a byte array (the name, in string or ASN.1 DER encoded form, | |
| 570 | + * respectively). | |
| 571 | + * <p> | |
| 572 | + * <a href="http://www.ietf.org/rfc/rfc822.txt">RFC 822</a>, DNS, and URI | |
| 573 | + * names are returned as <code>String</code>s, | |
| 574 | + * using the well-established string formats for those types (subject to | |
| 575 | + * the restrictions included in RFC 3280). IPv4 address names are | |
| 576 | + * returned using dotted quad notation. IPv6 address names are returned | |
| 577 | + * in the form "a1:a2:...:a8", where a1-a8 are hexadecimal values | |
| 578 | + * representing the eight 16-bit pieces of the address. OID names are | |
| 579 | + * returned as <code>String</code>s represented as a series of nonnegative | |
| 580 | + * integers separated by periods. And directory names (distinguished names) | |
| 581 | + * are returned in <a href="http://www.ietf.org/rfc/rfc2253.txt"> | |
| 582 | + * RFC 2253</a> string format. No standard string format is | |
| 583 | + * defined for otherNames, X.400 names, EDI party names, or any | |
| 584 | + * other type of names. They are returned as byte arrays | |
| 585 | + * containing the ASN.1 DER encoded form of the name. | |
| 586 | + * <p> | |
| 587 | + * Note that the <code>Collection</code> returned may contain more | |
| 588 | + * than one name of the same type. Also, note that the returned | |
| 589 | + * <code>Collection</code> is immutable and any entries containing byte | |
| 590 | + * arrays are cloned to protect against subsequent modifications. | |
| 591 | + * <p> | |
| 592 | + * This method was added to version 1.4 of the Java 2 Platform Standard | |
| 593 | + * Edition. In order to maintain backwards compatibility with existing | |
| 594 | + * service providers, this method is not <code>abstract</code> | |
| 595 | + * and it provides a default implementation. Subclasses | |
| 596 | + * should override this method with a correct implementation. | |
| 597 | + * | |
| 598 | + * @return an immutable <code>Collection</code> of subject alternative | |
| 599 | + * names (or <code>null</code>) | |
| 600 | + * @throws CertificateParsingException if the extension cannot be decoded | |
| 601 | + * @since 1.4 | |
| 602 | + */ | |
| 603 | + public Collection<List<?>> getSubjectAlternativeNames() | |
| 604 | + throws CertificateParsingException { | |
| 605 | + return X509CertImpl.getSubjectAlternativeNames(this); | |
| 606 | + } | |
| 607 | + | |
| 608 | + /** | |
| 609 | + * Gets an immutable collection of issuer alternative names from the | |
| 610 | + * <code>IssuerAltName</code> extension, (OID = 2.5.29.18). | |
| 611 | + * <p> | |
| 612 | + * The ASN.1 definition of the <code>IssuerAltName</code> extension is: | |
| 613 | + * <pre> | |
| 614 | + * IssuerAltName ::= GeneralNames | |
| 615 | + * </pre> | |
| 616 | + * The ASN.1 definition of <code>GeneralNames</code> is defined | |
| 617 | + * in {@link #getSubjectAlternativeNames getSubjectAlternativeNames}. | |
| 618 | + * <p> | |
| 619 | + * If this certificate does not contain an <code>IssuerAltName</code> | |
| 620 | + * extension, <code>null</code> is returned. Otherwise, a | |
| 621 | + * <code>Collection</code> is returned with an entry representing each | |
| 622 | + * <code>GeneralName</code> included in the extension. Each entry is a | |
| 623 | + * <code>List</code> whose first entry is an <code>Integer</code> | |
| 624 | + * (the name type, 0-8) and whose second entry is a <code>String</code> | |
| 625 | + * or a byte array (the name, in string or ASN.1 DER encoded form, | |
| 626 | + * respectively). For more details about the formats used for each | |
| 627 | + * name type, see the <code>getSubjectAlternativeNames</code> method. | |
| 628 | + * <p> | |
| 629 | + * Note that the <code>Collection</code> returned may contain more | |
| 630 | + * than one name of the same type. Also, note that the returned | |
| 631 | + * <code>Collection</code> is immutable and any entries containing byte | |
| 632 | + * arrays are cloned to protect against subsequent modifications. | |
| 633 | + * <p> | |
| 634 | + * This method was added to version 1.4 of the Java 2 Platform Standard | |
| 635 | + * Edition. In order to maintain backwards compatibility with existing | |
| 636 | + * service providers, this method is not <code>abstract</code> | |
| 637 | + * and it provides a default implementation. Subclasses | |
| 638 | + * should override this method with a correct implementation. | |
| 639 | + * | |
| 640 | + * @return an immutable <code>Collection</code> of issuer alternative | |
| 641 | + * names (or <code>null</code>) | |
| 642 | + * @throws CertificateParsingException if the extension cannot be decoded | |
| 643 | + * @since 1.4 | |
| 644 | + */ | |
| 645 | + public Collection<List<?>> getIssuerAlternativeNames() | |
| 646 | + throws CertificateParsingException { | |
| 647 | + return X509CertImpl.getIssuerAlternativeNames(this); | |
| 648 | + } | |
| 649 | +} | |
Binary file not shown.
| @@ -0,0 +1,199 @@ | ||
| 1 | +/* | |
| 2 | + * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + * | |
| 5 | + * This code is free software; you can redistribute it and/or modify it | |
| 6 | + * under the terms of the GNU General Public License version 2 only, as | |
| 7 | + * published by the Free Software Foundation. Oracle designates this | |
| 8 | + * particular file as subject to the "Classpath" exception as provided | |
| 9 | + * by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + * | |
| 11 | + * This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + * version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + * accompanied this code). | |
| 16 | + * | |
| 17 | + * You should have received a copy of the GNU General Public License version | |
| 18 | + * 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + * | |
| 21 | + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + * or visit www.oracle.com if you need additional information or have any | |
| 23 | + * questions. | |
| 24 | + */ | |
| 25 | + | |
| 26 | +package java.security.cert; | |
| 27 | + | |
| 28 | +import java.util.Set; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * Interface for an X.509 extension. | |
| 32 | + * | |
| 33 | + * <p>The extensions defined for X.509 v3 | |
| 34 | + * {@link X509Certificate Certificates} and v2 | |
| 35 | + * {@link X509CRL CRLs} (Certificate Revocation | |
| 36 | + * Lists) provide methods | |
| 37 | + * for associating additional attributes with users or public keys, | |
| 38 | + * for managing the certification hierarchy, and for managing CRL | |
| 39 | + * distribution. The X.509 extensions format also allows communities | |
| 40 | + * to define private extensions to carry information unique to those | |
| 41 | + * communities. | |
| 42 | + * | |
| 43 | + * <p>Each extension in a certificate/CRL may be designated as | |
| 44 | + * critical or non-critical. A certificate/CRL-using system (an application | |
| 45 | + * validating a certificate/CRL) must reject the certificate/CRL if it | |
| 46 | + * encounters a critical extension it does not recognize. A non-critical | |
| 47 | + * extension may be ignored if it is not recognized. | |
| 48 | + * <p> | |
| 49 | + * The ASN.1 definition for this is: | |
| 50 | + * <pre> | |
| 51 | + * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension | |
| 52 | + * | |
| 53 | + * Extension ::= SEQUENCE { | |
| 54 | + * extnId OBJECT IDENTIFIER, | |
| 55 | + * critical BOOLEAN DEFAULT FALSE, | |
| 56 | + * extnValue OCTET STRING | |
| 57 | + * -- contains a DER encoding of a value | |
| 58 | + * -- of the type registered for use with | |
| 59 | + * -- the extnId object identifier value | |
| 60 | + * } | |
| 61 | + * </pre> | |
| 62 | + * Since not all extensions are known, the <code>getExtensionValue</code> | |
| 63 | + * method returns the DER-encoded OCTET STRING of the | |
| 64 | + * extension value (i.e., the <code>extnValue</code>). This can then | |
| 65 | + * be handled by a <em>Class</em> that understands the extension. | |
| 66 | + * | |
| 67 | + * @author Hemma Prafullchandra | |
| 68 | + */ | |
| 69 | + | |
| 70 | +public interface X509Extension { | |
| 71 | + | |
| 72 | + /** | |
| 73 | + * Check if there is a critical extension that is not supported. | |
| 74 | + * | |
| 75 | + * @return <tt>true</tt> if a critical extension is found that is | |
| 76 | + * not supported, otherwise <tt>false</tt>. | |
| 77 | + */ | |
| 78 | + public boolean hasUnsupportedCriticalExtension(); | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Gets a Set of the OID strings for the extension(s) marked | |
| 82 | + * CRITICAL in the certificate/CRL managed by the object | |
| 83 | + * implementing this interface. | |
| 84 | + * | |
| 85 | + * Here is sample code to get a Set of critical extensions from an | |
| 86 | + * X509Certificate and print the OIDs: | |
| 87 | + * <pre><code> | |
| 88 | + * InputStream inStrm = null; | |
| 89 | + * X509Certificate cert = null; | |
| 90 | + * try { | |
| 91 | + * inStrm = new FileInputStream("DER-encoded-Cert"); | |
| 92 | + * CertificateFactory cf = CertificateFactory.getInstance("X.509"); | |
| 93 | + * cert = (X509Certificate)cf.generateCertificate(inStrm); | |
| 94 | + * } finally { | |
| 95 | + * if (inStrm != null) { | |
| 96 | + * inStrm.close(); | |
| 97 | + * } | |
| 98 | + * }<p> | |
| 99 | + * | |
| 100 | + * Set<String> critSet = cert.getCriticalExtensionOIDs(); | |
| 101 | + * if (critSet != null && !critSet.isEmpty()) { | |
| 102 | + * System.out.println("Set of critical extensions:"); | |
| 103 | + * for (String oid : critSet) { | |
| 104 | + * System.out.println(oid); | |
| 105 | + * } | |
| 106 | + * } | |
| 107 | + * </code></pre> | |
| 108 | + * @return a Set (or an empty Set if none are marked critical) of | |
| 109 | + * the extension OID strings for extensions that are marked critical. | |
| 110 | + * If there are no extensions present at all, then this method returns | |
| 111 | + * null. | |
| 112 | + */ | |
| 113 | + public Set<String> getCriticalExtensionOIDs(); | |
| 114 | + | |
| 115 | + /** | |
| 116 | + * Gets a Set of the OID strings for the extension(s) marked | |
| 117 | + * NON-CRITICAL in the certificate/CRL managed by the object | |
| 118 | + * implementing this interface. | |
| 119 | + * | |
| 120 | + * Here is sample code to get a Set of non-critical extensions from an | |
| 121 | + * X509CRL revoked certificate entry and print the OIDs: | |
| 122 | + * <pre><code> | |
| 123 | + * InputStream inStrm = null; | |
| 124 | + * CertificateFactory cf = null; | |
| 125 | + * X509CRL crl = null; | |
| 126 | + * try { | |
| 127 | + * inStrm = new FileInputStream("DER-encoded-CRL"); | |
| 128 | + * cf = CertificateFactory.getInstance("X.509"); | |
| 129 | + * crl = (X509CRL)cf.generateCRL(inStrm); | |
| 130 | + * } finally { | |
| 131 | + * if (inStrm != null) { | |
| 132 | + * inStrm.close(); | |
| 133 | + * } | |
| 134 | + * }<p> | |
| 135 | + * | |
| 136 | + * byte[] certData = <DER-encoded certificate data> | |
| 137 | + * ByteArrayInputStream bais = new ByteArrayInputStream(certData); | |
| 138 | + * X509Certificate cert = (X509Certificate)cf.generateCertificate(bais); | |
| 139 | + * bais.close(); | |
| 140 | + * X509CRLEntry badCert = | |
| 141 | + * crl.getRevokedCertificate(cert.getSerialNumber());<p> | |
| 142 | + * | |
| 143 | + * if (badCert != null) { | |
| 144 | + * Set<String> nonCritSet = badCert.getNonCriticalExtensionOIDs();<p> | |
| 145 | + * if (nonCritSet != null) | |
| 146 | + * for (String oid : nonCritSet) { | |
| 147 | + * System.out.println(oid); | |
| 148 | + * } | |
| 149 | + * } | |
| 150 | + * </code></pre> | |
| 151 | + * | |
| 152 | + * @return a Set (or an empty Set if none are marked non-critical) of | |
| 153 | + * the extension OID strings for extensions that are marked non-critical. | |
| 154 | + * If there are no extensions present at all, then this method returns | |
| 155 | + * null. | |
| 156 | + */ | |
| 157 | + public Set<String> getNonCriticalExtensionOIDs(); | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * Gets the DER-encoded OCTET string for the extension value | |
| 161 | + * (<em>extnValue</em>) identified by the passed-in <code>oid</code> | |
| 162 | + * String. | |
| 163 | + * The <code>oid</code> string is | |
| 164 | + * represented by a set of nonnegative whole numbers separated | |
| 165 | + * by periods. | |
| 166 | + * | |
| 167 | + * <p>For example:<br> | |
| 168 | + * <table border=groove summary="Examples of OIDs and extension names"> | |
| 169 | + * <tr> | |
| 170 | + * <th>OID <em>(Object Identifier)</em></th> | |
| 171 | + * <th>Extension Name</th></tr> | |
| 172 | + * <tr><td>2.5.29.14</td> | |
| 173 | + * <td>SubjectKeyIdentifier</td></tr> | |
| 174 | + * <tr><td>2.5.29.15</td> | |
| 175 | + * <td>KeyUsage</td></tr> | |
| 176 | + * <tr><td>2.5.29.16</td> | |
| 177 | + * <td>PrivateKeyUsage</td></tr> | |
| 178 | + * <tr><td>2.5.29.17</td> | |
| 179 | + * <td>SubjectAlternativeName</td></tr> | |
| 180 | + * <tr><td>2.5.29.18</td> | |
| 181 | + * <td>IssuerAlternativeName</td></tr> | |
| 182 | + * <tr><td>2.5.29.19</td> | |
| 183 | + * <td>BasicConstraints</td></tr> | |
| 184 | + * <tr><td>2.5.29.30</td> | |
| 185 | + * <td>NameConstraints</td></tr> | |
| 186 | + * <tr><td>2.5.29.33</td> | |
| 187 | + * <td>PolicyMappings</td></tr> | |
| 188 | + * <tr><td>2.5.29.35</td> | |
| 189 | + * <td>AuthorityKeyIdentifier</td></tr> | |
| 190 | + * <tr><td>2.5.29.36</td> | |
| 191 | + * <td>PolicyConstraints</td></tr> | |
| 192 | + * </table> | |
| 193 | + * | |
| 194 | + * @param oid the Object Identifier value for the extension. | |
| 195 | + * @return the DER-encoded octet string of the extension value or | |
| 196 | + * null if it is not present. | |
| 197 | + */ | |
| 198 | + public byte[] getExtensionValue(String oid); | |
| 199 | +} | |
| @@ -0,0 +1,54 @@ | ||
| 1 | +<../../../../../mkconfig | |
| 2 | + | |
| 3 | +TARG=\ | |
| 4 | + Certificate.dis\ | |
| 5 | + CertificateEncodingException.dis\ | |
| 6 | + CertificateException.dis\ | |
| 7 | + CertificateExpiredException.dis\ | |
| 8 | + CertificateFactory.dis\ | |
| 9 | + CertificateFactorySpi.dis\ | |
| 10 | + CertificateNotYetValidException.dis\ | |
| 11 | + CertificateParsingException.dis\ | |
| 12 | + CertificateRevokedException.dis\ | |
| 13 | + CertPath.dis\ | |
| 14 | + CertPathBuilder.dis\ | |
| 15 | + CertPathBuilderException.dis\ | |
| 16 | + CertPathBuilderResult.dis\ | |
| 17 | + CertPathBuilderSpi.dis\ | |
| 18 | + CertPathHelperImpl.dis\ | |
| 19 | + CertPathParameters.dis\ | |
| 20 | + CertPathValidator.dis\ | |
| 21 | + CertPathValidatorException.dis\ | |
| 22 | + CertPathValidatorResult.dis\ | |
| 23 | + CertPathValidatorSpi.dis\ | |
| 24 | + CertSelector.dis\ | |
| 25 | + CertStore.dis\ | |
| 26 | + CertStoreException.dis\ | |
| 27 | + CertStoreParameters.dis\ | |
| 28 | + CertStoreSpi.dis\ | |
| 29 | + CollectionCertStoreParameters.dis\ | |
| 30 | + CRL.dis\ | |
| 31 | + CRLException.dis\ | |
| 32 | + CRLReason.dis\ | |
| 33 | + CRLSelector.dis\ | |
| 34 | + Extension.dis\ | |
| 35 | + LDAPCertStoreParameters.dis\ | |
| 36 | + PKIXBuilderParameters.dis\ | |
| 37 | + PKIXCertPathBuilderResult.dis\ | |
| 38 | + PKIXCertPathChecker.dis\ | |
| 39 | + PKIXCertPathValidatorResult.dis\ | |
| 40 | + PKIXParameters.dis\ | |
| 41 | + PKIXReason.dis\ | |
| 42 | + PolicyNode.dis\ | |
| 43 | + PolicyQualifierInfo.dis\ | |
| 44 | + TrustAnchor.dis\ | |
| 45 | + X509Certificate.dis\ | |
| 46 | + X509CertSelector.dis\ | |
| 47 | + X509CRL.dis\ | |
| 48 | + X509CRLEntry.dis\ | |
| 49 | + X509CRLSelector.dis\ | |
| 50 | + X509Extension.dis\ | |
| 51 | + | |
| 52 | +DISBIN=$ROOT/java/dis/java/java/java/security/cert | |
| 53 | + | |
| 54 | +<$ROOT/mkfiles/mkjava | |
| @@ -0,0 +1,65 @@ | ||
| 1 | +<!-- | |
| 2 | + Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. | |
| 3 | + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| 4 | + | |
| 5 | + This code is free software; you can redistribute it and/or modify it | |
| 6 | + under the terms of the GNU General Public License version 2 only, as | |
| 7 | + published by the Free Software Foundation. Oracle designates this | |
| 8 | + particular file as subject to the "Classpath" exception as provided | |
| 9 | + by Oracle in the LICENSE file that accompanied this code. | |
| 10 | + | |
| 11 | + This code is distributed in the hope that it will be useful, but WITHOUT | |
| 12 | + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 13 | + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 14 | + version 2 for more details (a copy is included in the LICENSE file that | |
| 15 | + accompanied this code). | |
| 16 | + | |
| 17 | + You should have received a copy of the GNU General Public License version | |
| 18 | + 2 along with this work; if not, write to the Free Software Foundation, | |
| 19 | + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| 20 | + | |
| 21 | + Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| 22 | + or visit www.oracle.com if you need additional information or have any | |
| 23 | + questions. | |
| 24 | +--> | |
| 25 | + | |
| 26 | +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | |
| 27 | +<html> | |
| 28 | +<body bgcolor="white"> | |
| 29 | + | |
| 30 | +Provides classes and interfaces for parsing and managing | |
| 31 | +certificates, certificate revocation lists (CRLs), and | |
| 32 | +certification paths. It contains support for X.509 v3 | |
| 33 | +certificates and X.509 v2 CRLs. | |
| 34 | + | |
| 35 | +<h2>Package Specification</h2> | |
| 36 | + | |
| 37 | +<ul> | |
| 38 | + <li><a href="{@docRoot}/../technotes/guides/security/crypto/CryptoSpec.html"> | |
| 39 | + <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT> | |
| 40 | + Cryptography Architecture (JCA) Reference Guide</b></a> | |
| 41 | + <li>RFC 3280: Internet X.509 Public Key Infrastructure Certificate and | |
| 42 | + Certificate Revocation List (CRL) Profile | |
| 43 | + <li><a href="{@docRoot}/../technotes/guides/security/StandardNames.html"> | |
| 44 | + <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT> | |
| 45 | + Cryptography Architecture Standard Algorithm Name | |
| 46 | + Documentation</b></a></li> | |
| 47 | +</ul> | |
| 48 | + | |
| 49 | +<h2>Related Documentation</h2> | |
| 50 | + | |
| 51 | +For information about X.509 certificates and CRLs, please see: | |
| 52 | +<ul> | |
| 53 | + <li><a href="http://www.ietf.org/rfc/rfc3280.txt"> | |
| 54 | + http://www.ietf.org/rfc/rfc3280.txt</a> | |
| 55 | + <li><a href= | |
| 56 | + "{@docRoot}/../technotes/guides/security/certpath/CertPathProgGuide.html"> | |
| 57 | + <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT> | |
| 58 | + PKI Programmer's Guide</a> | |
| 59 | + <li><a href="{@docRoot}/../technotes/guides/security/cert3.html"> | |
| 60 | + X.509 Certificates and Certificate Revocation Lists (CRLs)</a> | |
| 61 | +</ul> | |
| 62 | + | |
| 63 | +@since 1.2 | |
| 64 | +</body> | |
| 65 | +</html> | |