All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.klakegg.pkix.ocsp.CertificateIssuer Maven / Gradle / Ivy

package net.klakegg.pkix.ocsp;

import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.ocsp.CertificateID;

import java.io.Serializable;
import java.security.cert.X509Certificate;
import java.util.Arrays;

/**
 * @author erlend
 */
public class CertificateIssuer implements Serializable {

    private static final long serialVersionUID = -5864866954149163735L;

    private static final String ALGORITHM_IDENTIFIER = "1.3.14.3.2.26";

    private byte[] issuerNameHash;

    private byte[] issuerKeyHash;

    public static CertificateIssuer generate(X509Certificate certificate) throws OcspException {
        try {
            // Digest calculator to be used to create values for the issuer certificate.
            // This is done once in case of multiple requests.
            OcspDigestOutputStream digestCalculator = new OcspDigestOutputStream("SHA-1");

            // Create an instance of the issuer certificate for use with Bouncy Caste/ASN1.
            X509CertificateHolder issuerHolder = new X509CertificateHolder(certificate.getEncoded());

            // Calculate hashes to identify issuer certificate.
            byte[] issuerNameHash =
                    digestCalculator.calculate(issuerHolder.toASN1Structure().getSubject().getEncoded(ASN1Encoding.DER));
            byte[] issuerKeyHash =
                    digestCalculator.calculate(issuerHolder.getSubjectPublicKeyInfo().getPublicKeyData().getBytes());

            return new CertificateIssuer(issuerNameHash, issuerKeyHash);
        } catch (Exception e) {
            throw new OcspException("Exception while preparing issuer data: '%s'", e, e.getMessage());
        }
    }

    public static CertificateIssuer generate(CertificateID certificateID) {
        return new CertificateIssuer(certificateID.getIssuerNameHash(), certificateID.getIssuerKeyHash());
    }

    public CertificateIssuer(byte[] issuerNameHash, byte[] issuerKeyHash) {
        this.issuerNameHash = issuerNameHash;
        this.issuerKeyHash = issuerKeyHash;
    }

    public String getAlgorithmIdentifier() {
        return ALGORITHM_IDENTIFIER;
    }

    public byte[] getIssuerNameHash() {
        return issuerNameHash;
    }

    public byte[] getIssuerKeyHash() {
        return issuerKeyHash;
    }

    @Override
    @SuppressWarnings("SimplifiableIfStatement")
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        CertificateIssuer that = (CertificateIssuer) o;

        if (!Arrays.equals(issuerNameHash, that.issuerNameHash)) return false;
        return Arrays.equals(issuerKeyHash, that.issuerKeyHash);
    }

    @Override
    public int hashCode() {
        int result = Arrays.hashCode(issuerNameHash);
        result = 31 * result + Arrays.hashCode(issuerKeyHash);
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy