<PackageReference Include="BouncyCastle.Cryptography" Version="2.4.0" />

TbsCertificateStructure

using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Asn1.X509 { public class TbsCertificateStructure : Asn1Encodable { internal Asn1Sequence seq; internal DerInteger version; internal DerInteger serialNumber; internal AlgorithmIdentifier signature; internal X509Name issuer; internal Time startDate; internal Time endDate; internal X509Name subject; internal SubjectPublicKeyInfo subjectPublicKeyInfo; internal DerBitString issuerUniqueID; internal DerBitString subjectUniqueID; internal X509Extensions extensions; public int Version => version.IntValueExact + 1; public DerInteger VersionNumber => version; public DerInteger SerialNumber => serialNumber; public AlgorithmIdentifier Signature => signature; public X509Name Issuer => issuer; public Time StartDate => startDate; public Time EndDate => endDate; public X509Name Subject => subject; public SubjectPublicKeyInfo SubjectPublicKeyInfo => subjectPublicKeyInfo; public DerBitString IssuerUniqueID => issuerUniqueID; public DerBitString SubjectUniqueID => subjectUniqueID; public X509Extensions Extensions => extensions; public static TbsCertificateStructure GetInstance(object obj) { if (obj == null) return null; TbsCertificateStructure tbsCertificateStructure = obj as TbsCertificateStructure; if (tbsCertificateStructure != null) return tbsCertificateStructure; return new TbsCertificateStructure(Asn1Sequence.GetInstance(obj)); } public static TbsCertificateStructure GetInstance(Asn1TaggedObject obj, bool explicitly) { return GetInstance(Asn1Sequence.GetInstance(obj, explicitly)); } private TbsCertificateStructure(Asn1Sequence seq) { int num = 0; this.seq = seq; Asn1TaggedObject asn1TaggedObject = seq[0] as Asn1TaggedObject; if (asn1TaggedObject != null) version = DerInteger.GetInstance(asn1TaggedObject, true); else { num = -1; version = new DerInteger(0); } bool flag = false; bool flag2 = false; if (version.HasValue(0)) flag = true; else if (version.HasValue(1)) { flag2 = true; } else if (!version.HasValue(2)) { throw new ArgumentException("version number not recognised"); } serialNumber = DerInteger.GetInstance(seq[num + 1]); signature = AlgorithmIdentifier.GetInstance(seq[num + 2]); issuer = X509Name.GetInstance(seq[num + 3]); Asn1Sequence asn1Sequence = (Asn1Sequence)seq[num + 4]; startDate = Time.GetInstance(asn1Sequence[0]); endDate = Time.GetInstance(asn1Sequence[1]); subject = X509Name.GetInstance(seq[num + 5]); subjectPublicKeyInfo = SubjectPublicKeyInfo.GetInstance(seq[num + 6]); int num2 = seq.Count - (num + 6) - 1; if ((num2 != 0) & flag) throw new ArgumentException("version 1 certificate contains extra data"); while (num2 > 0) { Asn1TaggedObject instance = Asn1TaggedObject.GetInstance(seq[num + 6 + num2]); switch (instance.TagNo) { case 1: issuerUniqueID = DerBitString.GetInstance(instance, false); break; case 2: subjectUniqueID = DerBitString.GetInstance(instance, false); break; case 3: if (flag2) throw new ArgumentException("version 2 certificate cannot contain extensions"); extensions = X509Extensions.GetInstance(Asn1Sequence.GetInstance(instance, true)); break; default: throw new ArgumentException("Unknown tag encountered in structure: " + instance.TagNo.ToString()); } num2--; } } public override Asn1Object ToAsn1Object() { string environmentVariable = Platform.GetEnvironmentVariable("Org.BouncyCastle.X509.Allow_Non-DER_TBSCert"); if (environmentVariable == null || Platform.EqualsIgnoreCase("true", environmentVariable)) return seq; Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(8); if (!version.HasValue(0)) asn1EncodableVector.Add(new DerTaggedObject(true, 0, version)); asn1EncodableVector.Add(serialNumber, signature, issuer); asn1EncodableVector.Add(new DerSequence(startDate, endDate)); if (subject != null) asn1EncodableVector.Add(subject); else asn1EncodableVector.Add(DerSequence.Empty); asn1EncodableVector.Add(subjectPublicKeyInfo); asn1EncodableVector.AddOptionalTagged(false, 1, issuerUniqueID); asn1EncodableVector.AddOptionalTagged(false, 2, subjectUniqueID); asn1EncodableVector.AddOptionalTagged(true, 3, extensions); return new DerSequence(asn1EncodableVector); } } }