blob: 4badd59776ebf4df9bbbc7d59e2d8358c11c66c6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.security.cert;
import java.io.ByteArrayInputStream;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Principal;
import java.security.PublicKey;
import java.security.SignatureException;
import java.util.Arrays;
import java.util.Date;
import java.util.Set;
import javax.security.auth.x500.X500Principal;
/**
* Abstract base class for X.509 certificate revocation lists (CRL).
* <p>
* More information regarding CRL can be found in RFC 2459,
* "Internet X.509 Public Key Infrastructure Certificate and CRL Profile" at <a
* href
* ="http://www.ietf.org/rfc/rfc2459.txt">http://www.ietf.org/rfc/rfc2459.txt
* </a>.
*/
public abstract class X509CRL extends CRL implements X509Extension {
/**
* Creates a new {@code X509CRL} instance.
*/
protected X509CRL() {
super("X.509");
}
/**
* Returns whether the specified object equals to this instance.
*
* @param other
* the object to compare.
* @return {@code true} if the specified object is equal to this, otherwise
* {@code false}.
*/
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof X509CRL)) {
return false;
}
X509CRL obj = (X509CRL) other;
try {
return Arrays.equals(getEncoded(), obj.getEncoded());
} catch (CRLException e) {
return false;
}
}
/**
* Returns the hashcode of this CRL instance.
*
* @return the hashcode.
*/
public int hashCode() {
try {
int res = 0;
byte[] array = getEncoded();
for (int i=0; i<array.length; i++) {
res += array[i] & 0xFF;
}
return res;
} catch (CRLException e) {
return 0;
}
}
/**
* Returns this CRL in ASN.1 DER encoded form.
*
* @return this CRL in ASN.1 DER encoded form.
* @throws CRLException
* if encoding fails.
*/
public abstract byte[] getEncoded() throws CRLException;
/**
* Verifies this CRL by verifying that this CRL was signed with the
* corresponding private key to the specified public key.
*
* @param key
* the public key to verify this CRL with.
* @throws CRLException
* if encoding or decoding fails.
* @throws NoSuchAlgorithmException
* if a needed algorithm is not present.
* @throws InvalidKeyException
* if the specified key is invalid.
* @throws NoSuchProviderException
* if no provider can be found.
* @throws SignatureException
* if errors occur on signatures.
*/
public abstract void verify(PublicKey key)
throws CRLException, NoSuchAlgorithmException,
InvalidKeyException, NoSuchProviderException,
SignatureException;
/**
* Verifies this CRL by verifying that this CRL was signed with the
* corresponding private key to the specified public key. The signature
* verification engine of the specified provider will be used.
*
* @param key
* the public key to verify this CRL with.
* @param sigProvider
* the name of the provider for the signature algorithm.
* @throws CRLException
* if encoding decoding fails.
* @throws NoSuchAlgorithmException
* if a needed algorithm is not present.
* @throws InvalidKeyException
* if the specified key is invalid.
* @throws NoSuchProviderException
* if the specified provider cannot be found.
* @throws SignatureException
* if errors occur on signatures.
*/
public abstract void verify(PublicKey key, String sigProvider)
throws CRLException, NoSuchAlgorithmException,
InvalidKeyException, NoSuchProviderException,
SignatureException;
/**
* Returns the version number of this CRL.
*
* @return the version number of this CRL.
*/
public abstract int getVersion();
/**
* <b>Do not use</b>, use {@link #getIssuerX500Principal()} instead. Returns
* the issuer as an implementation specific Principal object.
*
* @return the issuer distinguished name.
*/
public abstract Principal getIssuerDN();
/**
* Returns the issuer distinguished name of this CRL.
*
* @return the issuer distinguished name of this CRL.
*/
public X500Principal getIssuerX500Principal() {
try {
// TODO if there is no X.509 certificate provider installed
// should we try to access Harmony X509CRLImpl via classForName?
CertificateFactory factory = CertificateFactory
.getInstance("X.509");
X509CRL crl = (X509CRL) factory
.generateCRL(new ByteArrayInputStream(getEncoded()));
return crl.getIssuerX500Principal();
} catch (Exception e) {
throw new RuntimeException("Failed to get X500Principal issuer", e);
}
}
/**
* Returns the {@code thisUpdate} value of this CRL.
*
* @return the {@code thisUpdate} value of this CRL.
*/
public abstract Date getThisUpdate();
/**
* Returns the {@code nextUpdate} value of this CRL.
*
* @return the {@code nextUpdate} value of this CRL, or {@code null} if none
* is present.
*/
public abstract Date getNextUpdate();
/**
* Returns the CRL entry with the specified certificate serial number.
*
* @param serialNumber
* the certificate serial number to search for a CRL entry.
* @return the entry for the specified certificate serial number, or {@code
* null} if not found.
*/
public abstract X509CRLEntry getRevokedCertificate(BigInteger serialNumber);
/**
* Returns the CRL entry for the specified certificate.
*
* @param certificate
* the certificate to search a CRL entry for.
* @return the entry for the specified certificate, or {@code null} if not
* found.
*/
public X509CRLEntry getRevokedCertificate(X509Certificate certificate) {
if (certificate == null) {
throw new NullPointerException();
}
return getRevokedCertificate(certificate.getSerialNumber());
}
/**
* Returns the set of revoked certificates.
*
* @return the set of revoked certificates, or {@code null} if no revoked
* certificates are in this CRL.
*/
public abstract Set<? extends X509CRLEntry> getRevokedCertificates();
/**
* Returns the {@code tbsCertList} information of this CRL in DER encoded
* form.
*
* @return the CRL information in DER encoded form.
* @throws CRLException
* if encoding fails.
*/
public abstract byte[] getTBSCertList() throws CRLException;
/**
* Returns the signature bytes of this CRL.
*
* @return the signature bytes of this CRL.
*/
public abstract byte[] getSignature();
/**
* Returns the name of the signature algorithm.
*
* @return the name of the signature algorithm.
*/
public abstract String getSigAlgName();
/**
* Returns the OID of the signature algorithm.
*
* @return the OID of the signature algorithm.
*/
public abstract String getSigAlgOID();
/**
* Returns the parameters of the signature algorithm in DER encoded form.
*
* @return the parameters of the signature algorithm in DER encoded form, or
* {@code null} if not present.
*/
public abstract byte[] getSigAlgParams();
}