CertTemplate
using Org.BouncyCastle.Asn1.X509;
using System;
namespace Org.BouncyCastle.Asn1.Crmf
{
public class CertTemplate : Asn1Encodable
{
private readonly Asn1Sequence m_seq;
private readonly DerInteger m_version;
private readonly DerInteger m_serialNumber;
private readonly AlgorithmIdentifier m_signingAlg;
private readonly X509Name m_issuer;
private readonly OptionalValidity m_validity;
private readonly X509Name m_subject;
private readonly SubjectPublicKeyInfo m_publicKey;
private readonly DerBitString m_issuerUID;
private readonly DerBitString m_subjectUID;
private readonly X509Extensions m_extensions;
public virtual int Version => m_version.IntValueExact;
public virtual DerInteger SerialNumber => m_serialNumber;
public virtual AlgorithmIdentifier SigningAlg => m_signingAlg;
public virtual X509Name Issuer => m_issuer;
public virtual OptionalValidity Validity => m_validity;
public virtual X509Name Subject => m_subject;
public virtual SubjectPublicKeyInfo PublicKey => m_publicKey;
public virtual DerBitString IssuerUID => m_issuerUID;
public virtual DerBitString SubjectUID => m_subjectUID;
public virtual X509Extensions Extensions => m_extensions;
public static CertTemplate GetInstance(object obj)
{
if (obj == null)
return null;
CertTemplate certTemplate = obj as CertTemplate;
if (certTemplate != null)
return certTemplate;
return new CertTemplate(Asn1Sequence.GetInstance(obj));
}
public static CertTemplate GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new CertTemplate(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
}
public static CertTemplate GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
{
return new CertTemplate(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
}
private CertTemplate(Asn1Sequence seq)
{
int count = seq.Count;
if (count < 0 || count > 10)
throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
int sequencePosition = 0;
m_version = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, false, DerInteger.GetTagged);
m_serialNumber = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, DerInteger.GetTagged);
m_signingAlg = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, false, AlgorithmIdentifier.GetTagged);
m_issuer = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 3, true, X509Name.GetTagged);
m_validity = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 4, false, OptionalValidity.GetTagged);
m_subject = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 5, true, X509Name.GetTagged);
m_publicKey = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 6, false, SubjectPublicKeyInfo.GetTagged);
m_issuerUID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 7, false, DerBitString.GetTagged);
m_subjectUID = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 8, false, DerBitString.GetTagged);
m_extensions = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 9, false, X509Extensions.GetTagged);
if (sequencePosition != count)
throw new ArgumentException("Unexpected elements in sequence", "seq");
Rfc4211Asn1Utilities.CheckValidityFieldPresent(m_validity);
m_seq = seq;
}
public CertTemplate(DerInteger version, DerInteger serialNumber, AlgorithmIdentifier signingAlg, X509Name issuer, OptionalValidity validity, X509Name subject, SubjectPublicKeyInfo publicKey, DerBitString issuerUID, DerBitString subjectUID, X509Extensions extensions)
{
m_version = version;
m_serialNumber = serialNumber;
m_signingAlg = signingAlg;
m_issuer = issuer;
m_validity = Rfc4211Asn1Utilities.CheckValidityFieldPresent(validity);
m_subject = subject;
m_publicKey = publicKey;
m_issuerUID = issuerUID;
m_subjectUID = subjectUID;
m_extensions = extensions;
m_seq = CreateSequence();
}
public override Asn1Object ToAsn1Object()
{
return m_seq;
}
private Asn1Sequence CreateSequence()
{
Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(10);
asn1EncodableVector.AddOptionalTagged(false, 0, m_version);
asn1EncodableVector.AddOptionalTagged(false, 1, m_serialNumber);
asn1EncodableVector.AddOptionalTagged(false, 2, m_signingAlg);
asn1EncodableVector.AddOptionalTagged(true, 3, m_issuer);
asn1EncodableVector.AddOptionalTagged(false, 4, m_validity);
asn1EncodableVector.AddOptionalTagged(true, 5, m_subject);
asn1EncodableVector.AddOptionalTagged(false, 6, m_publicKey);
asn1EncodableVector.AddOptionalTagged(false, 7, m_issuerUID);
asn1EncodableVector.AddOptionalTagged(false, 8, m_subjectUID);
asn1EncodableVector.AddOptionalTagged(false, 9, m_extensions);
return new DerSequence(asn1EncodableVector);
}
}
}