package org.bouncycastle.eac;
import java.io.OutputStream;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.DERApplicationSpecific;
import org.bouncycastle.asn1.eac.CVCertificate;
import org.bouncycastle.asn1.eac.CertificateBody;
import org.bouncycastle.asn1.eac.CertificateHolderAuthorization;
import org.bouncycastle.asn1.eac.CertificateHolderReference;
import org.bouncycastle.asn1.eac.CertificationAuthorityReference;
import org.bouncycastle.asn1.eac.EACTags;
import org.bouncycastle.asn1.eac.PackedDate;
import org.bouncycastle.asn1.eac.PublicKeyDataObject;
import org.bouncycastle.eac.operator.EACSigner;
public class EACCertificateBuilder
{
private static final byte [] ZeroArray = new byte [] {0};
private PublicKeyDataObject publicKey;
private CertificateHolderAuthorization certificateHolderAuthorization;
private PackedDate certificateEffectiveDate;
private PackedDate certificateExpirationDate;
private CertificateHolderReference certificateHolderReference;
private CertificationAuthorityReference certificationAuthorityReference;
public EACCertificateBuilder(
CertificationAuthorityReference certificationAuthorityReference,
PublicKeyDataObject publicKey,
CertificateHolderReference certificateHolderReference,
CertificateHolderAuthorization certificateHolderAuthorization,
PackedDate certificateEffectiveDate,
PackedDate certificateExpirationDate)
{
this.certificationAuthorityReference = certificationAuthorityReference;
this.publicKey = publicKey;
this.certificateHolderReference = certificateHolderReference;
this.certificateHolderAuthorization = certificateHolderAuthorization;
this.certificateEffectiveDate = certificateEffectiveDate;
this.certificateExpirationDate = certificateExpirationDate;
}
private CertificateBody buildBody()
{
DERApplicationSpecific certificateProfileIdentifier;
certificateProfileIdentifier = new DERApplicationSpecific(
EACTags.INTERCHANGE_PROFILE, ZeroArray);
CertificateBody body = new CertificateBody(
certificateProfileIdentifier,
certificationAuthorityReference,
publicKey,
certificateHolderReference,
certificateHolderAuthorization,
certificateEffectiveDate,
certificateExpirationDate);
return body;
}
public EACCertificateHolder build(EACSigner signer)
throws EACException
{
try
{
CertificateBody body = buildBody();
OutputStream vOut = signer.getOutputStream();
vOut.write(body.getEncoded(ASN1Encoding.DER));
vOut.close();
return new EACCertificateHolder(new CVCertificate(body, signer.getSignature()));
}
catch (Exception e)
{
throw new EACException("unable to process signature: " + e.getMessage(), e);
}
}
}