// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.its;

import org.bouncycastle.oer.its.ieee1609dot2.CertificateType;
import org.bouncycastle.oer.its.ieee1609dot2.CertificateBase;
import org.bouncycastle.oer.its.ieee1609dot2.VerificationKeyIndicator;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccP256CurvePoint;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.PublicEncryptionKey;
import java.math.BigInteger;
import org.bouncycastle.oer.its.ieee1609dot2.CertificateId;
import java.io.OutputStream;
import org.bouncycastle.operator.DigestCalculator;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.HashedId8;
import org.bouncycastle.util.Arrays;
import java.io.IOException;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import org.bouncycastle.oer.its.ieee1609dot2.ToBeSignedCertificate;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.oer.its.ieee1609dot2.IssuerIdentifier;

public class ITSImplicitCertificateBuilder extends ITSCertificateBuilder
{
    private final IssuerIdentifier issuerIdentifier;
    
    public ITSImplicitCertificateBuilder(final ITSCertificate itsCertificate, final DigestCalculatorProvider digestCalculatorProvider, final ToBeSignedCertificate.Builder builder) {
        super(itsCertificate, builder);
        final AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256);
        final ASN1ObjectIdentifier algorithm = algorithmIdentifier.getAlgorithm();
        DigestCalculator value;
        try {
            value = digestCalculatorProvider.get(algorithmIdentifier);
        }
        catch (final OperatorCreationException cause) {
            throw new IllegalStateException(cause.getMessage(), cause);
        }
        try {
            final OutputStream outputStream = value.getOutputStream();
            outputStream.write(itsCertificate.getEncoded());
            outputStream.close();
        }
        catch (final IOException cause2) {
            throw new IllegalStateException(cause2.getMessage(), cause2);
        }
        final byte[] digest = value.getDigest();
        final HashedId8 hashedId8 = new HashedId8(Arrays.copyOfRange(digest, digest.length - 8, digest.length));
        if (algorithm.equals(NISTObjectIdentifiers.id_sha256)) {
            this.issuerIdentifier = IssuerIdentifier.sha256AndDigest(hashedId8);
        }
        else {
            if (!algorithm.equals(NISTObjectIdentifiers.id_sha384)) {
                throw new IllegalStateException("unknown digest");
            }
            this.issuerIdentifier = IssuerIdentifier.sha384AndDigest(hashedId8);
        }
    }
    
    public ITSCertificate build(final CertificateId certificateId, final BigInteger bigInteger, final BigInteger bigInteger2) {
        return this.build(certificateId, bigInteger, bigInteger2, null);
    }
    
    public ITSCertificate build(final CertificateId id, final BigInteger bigInteger, final BigInteger bigInteger2, final PublicEncryptionKey encryptionKey) {
        final EccP256CurvePoint uncompressedP256 = EccP256CurvePoint.uncompressedP256(bigInteger, bigInteger2);
        final ToBeSignedCertificate.Builder builder = new ToBeSignedCertificate.Builder(this.tbsCertificateBuilder);
        builder.setId(id);
        if (encryptionKey != null) {
            builder.setEncryptionKey(encryptionKey);
        }
        builder.setVerifyKeyIndicator(VerificationKeyIndicator.reconstructionValue(uncompressedP256));
        final CertificateBase.Builder builder2 = new CertificateBase.Builder();
        builder2.setVersion(this.version);
        builder2.setType(CertificateType.implicit);
        builder2.setIssuer(this.issuerIdentifier);
        builder2.setToBeSigned(builder.createToBeSignedCertificate());
        return new ITSCertificate(builder2.createCertificateBase());
    }
}
