V3TbsCertificateGenerator
using System;
namespace Org.BouncyCastle.Asn1.X509
{
public class V3TbsCertificateGenerator
{
private static readonly DerTaggedObject Version = new DerTaggedObject(0, DerInteger.Two);
internal DerInteger serialNumber;
internal AlgorithmIdentifier signature;
internal X509Name issuer;
internal Validity validity;
internal Time startDate;
internal Time endDate;
internal X509Name subject;
internal SubjectPublicKeyInfo subjectPublicKeyInfo;
internal X509Extensions extensions;
private bool altNamePresentAndCritical;
private DerBitString issuerUniqueID;
private DerBitString subjectUniqueID;
public void SetSerialNumber(DerInteger serialNumber)
{
this.serialNumber = serialNumber;
}
public void SetSignature(AlgorithmIdentifier signature)
{
this.signature = signature;
}
public void SetIssuer(X509Name issuer)
{
this.issuer = issuer;
}
public void SetValidity(Validity validity)
{
this.validity = validity;
startDate = null;
endDate = null;
}
public void SetStartDate(Time startDate)
{
validity = null;
this.startDate = startDate;
}
public void SetStartDate(Asn1UtcTime startDate)
{
SetStartDate(new Time(startDate));
}
public void SetEndDate(Time endDate)
{
validity = null;
this.endDate = endDate;
}
public void SetEndDate(Asn1UtcTime endDate)
{
SetEndDate(new Time(endDate));
}
public void SetSubject(X509Name subject)
{
this.subject = subject;
}
public void SetIssuerUniqueID(DerBitString uniqueID)
{
issuerUniqueID = uniqueID;
}
public void SetSubjectUniqueID(DerBitString uniqueID)
{
subjectUniqueID = uniqueID;
}
public void SetSubjectPublicKeyInfo(SubjectPublicKeyInfo pubKeyInfo)
{
subjectPublicKeyInfo = pubKeyInfo;
}
public void SetExtensions(X509Extensions extensions)
{
this.extensions = extensions;
if (extensions != null) {
X509Extension extension = extensions.GetExtension(X509Extensions.SubjectAlternativeName);
if (extension != null && extension.IsCritical)
altNamePresentAndCritical = true;
}
}
public Asn1Sequence GeneratePreTbsCertificate()
{
if (signature != null)
throw new InvalidOperationException("signature field should not be set in PreTBSCertificate");
if (serialNumber == null || issuer == null || (validity == null && (startDate == null || endDate == null)) || (subject == null && !altNamePresentAndCritical) || subjectPublicKeyInfo == null)
throw new InvalidOperationException("not all mandatory fields set in V3 TBScertificate generator");
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(9);
asn1EncodableVector.Add(Version);
asn1EncodableVector.Add(serialNumber);
asn1EncodableVector.Add(issuer);
asn1EncodableVector.Add(validity ?? new Validity(startDate, endDate));
asn1EncodableVector.Add(subject ?? X509Name.GetInstance(DerSequence.Empty));
asn1EncodableVector.Add(subjectPublicKeyInfo);
asn1EncodableVector.AddOptionalTagged(false, 1, issuerUniqueID);
asn1EncodableVector.AddOptionalTagged(false, 2, subjectUniqueID);
asn1EncodableVector.AddOptionalTagged(true, 3, extensions);
return new DerSequence(asn1EncodableVector);
}
public TbsCertificateStructure GenerateTbsCertificate()
{
if (serialNumber == null || signature == null || issuer == null || (validity == null && (startDate == null || endDate == null)) || (subject == null && !altNamePresentAndCritical) || subjectPublicKeyInfo == null)
throw new InvalidOperationException("not all mandatory fields set in V3 TBScertificate generator");
return new TbsCertificateStructure(DerInteger.Two, serialNumber, signature, issuer, validity ?? new Validity(startDate, endDate), subject ?? X509Name.GetInstance(DerSequence.Empty), subjectPublicKeyInfo, issuerUniqueID, subjectUniqueID, extensions);
}
}
}