using System; using Org.BouncyCastle.Asn1.X509; namespace Org.BouncyCastle.Asn1.Crmf { public class CertTemplate : Asn1Encodable { private readonly Asn1Sequence seq; private readonly DerInteger version; private readonly DerInteger serialNumber; private readonly AlgorithmIdentifier signingAlg; private readonly X509Name issuer; private readonly OptionalValidity validity; private readonly X509Name subject; private readonly SubjectPublicKeyInfo publicKey; private readonly DerBitString issuerUID; private readonly DerBitString subjectUID; private readonly X509Extensions extensions; private CertTemplate(Asn1Sequence seq) { this.seq = seq; foreach (Asn1TaggedObject tObj in seq) { switch (tObj.TagNo) { case 0: version = DerInteger.GetInstance(tObj, false); break; case 1: serialNumber = DerInteger.GetInstance(tObj, false); break; case 2: signingAlg = AlgorithmIdentifier.GetInstance(tObj, false); break; case 3: issuer = X509Name.GetInstance(tObj, true); // CHOICE break; case 4: validity = OptionalValidity.GetInstance(Asn1Sequence.GetInstance(tObj, false)); break; case 5: subject = X509Name.GetInstance(tObj, true); // CHOICE break; case 6: publicKey = SubjectPublicKeyInfo.GetInstance(tObj, false); break; case 7: issuerUID = DerBitString.GetInstance(tObj, false); break; case 8: subjectUID = DerBitString.GetInstance(tObj, false); break; case 9: extensions = X509Extensions.GetInstance(tObj, false); break; default: throw new ArgumentException("unknown tag: " + tObj.TagNo, "seq"); } } } public static CertTemplate GetInstance(object obj) { if (obj is CertTemplate) return (CertTemplate)obj; if (obj != null) return new CertTemplate(Asn1Sequence.GetInstance(obj)); return null; } public virtual int Version { get { return version.IntValueExact; } } public virtual DerInteger SerialNumber { get { return serialNumber; } } public virtual AlgorithmIdentifier SigningAlg { get { return signingAlg; } } public virtual X509Name Issuer { get { return issuer; } } public virtual OptionalValidity Validity { get { return validity; } } public virtual X509Name Subject { get { return subject; } } public virtual SubjectPublicKeyInfo PublicKey { get { return publicKey; } } public virtual DerBitString IssuerUID { get { return issuerUID; } } public virtual DerBitString SubjectUID { get { return subjectUID; } } public virtual X509Extensions Extensions { get { return extensions; } } /** *
* CertTemplate ::= SEQUENCE { * version [0] Version OPTIONAL, * serialNumber [1] INTEGER OPTIONAL, * signingAlg [2] AlgorithmIdentifier OPTIONAL, * issuer [3] Name OPTIONAL, * validity [4] OptionalValidity OPTIONAL, * subject [5] Name OPTIONAL, * publicKey [6] SubjectPublicKeyInfo OPTIONAL, * issuerUID [7] UniqueIdentifier OPTIONAL, * subjectUID [8] UniqueIdentifier OPTIONAL, * extensions [9] Extensions OPTIONAL } ** @return a basic ASN.1 object representation. */ public override Asn1Object ToAsn1Object() { return seq; } } }