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

X509CertificateParser

public class X509CertificateParser
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Security.Certificates; using Org.BouncyCastle.Utilities.IO; using System; using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; namespace Org.BouncyCastle.X509 { public class X509CertificateParser { private static readonly PemParser PemCertParser = new PemParser("CERTIFICATE"); private Asn1Set sData; private int sDataObjectCount; private Stream currentStream; private X509Certificate ReadDerCertificate(Asn1InputStream dIn) { Asn1Sequence asn1Sequence = (Asn1Sequence)dIn.ReadObject(); if (asn1Sequence.Count > 1 && asn1Sequence[0] is DerObjectIdentifier && asn1Sequence[0].Equals(PkcsObjectIdentifiers.SignedData)) { sData = SignedData.GetInstance(Asn1Sequence.GetInstance((Asn1TaggedObject)asn1Sequence[1], true)).Certificates; return GetCertificate(); } return new X509Certificate(X509CertificateStructure.GetInstance(asn1Sequence)); } private X509Certificate ReadPemCertificate(Stream inStream) { Asn1Sequence asn1Sequence = PemCertParser.ReadPemObject(inStream); if (asn1Sequence != null) return new X509Certificate(X509CertificateStructure.GetInstance(asn1Sequence)); return null; } private X509Certificate GetCertificate() { if (sData != null) { while (sDataObjectCount < sData.Count) { object obj = sData[sDataObjectCount++]; if (obj is Asn1Sequence) return new X509Certificate(X509CertificateStructure.GetInstance(obj)); } } return null; } public X509Certificate ReadCertificate(byte[] input) { using (MemoryStream inStream = new MemoryStream(input, false)) return ReadCertificate(inStream); } public IList<X509Certificate> ReadCertificates(byte[] input) { using (MemoryStream inStream = new MemoryStream(input, false)) return ReadCertificates(inStream); } public X509Certificate ReadCertificate(Stream inStream) { if (inStream == null) throw new ArgumentNullException("inStream"); if (inStream.CanRead) { if (currentStream == null) { currentStream = inStream; sData = null; sDataObjectCount = 0; } else if (currentStream != inStream) { currentStream = inStream; sData = null; sDataObjectCount = 0; } try { if (sData == null) { int num = inStream.ReadByte(); if (num >= 0) { if (inStream.CanSeek) inStream.Seek(-1, SeekOrigin.Current); else { PushbackStream pushbackStream = new PushbackStream(inStream); pushbackStream.Unread(num); inStream = pushbackStream; } if (num == 48) { using (Asn1InputStream dIn = new Asn1InputStream(inStream, 2147483647, true)) return ReadDerCertificate(dIn); } return ReadPemCertificate(inStream); } return null; } if (sDataObjectCount == sData.Count) { sData = null; sDataObjectCount = 0; return null; } return GetCertificate(); } catch (CertificateException) { throw; } catch (Exception innerException) { throw new CertificateException("Failed to read certificate", innerException); } } throw new ArgumentException("inStream must be read-able", "inStream"); } public IList<X509Certificate> ReadCertificates(Stream inStream) { return new List<X509Certificate>(ParseCertificates(inStream)); } [IteratorStateMachine(typeof(<ParseCertificates>d__11))] public IEnumerable<X509Certificate> ParseCertificates(Stream inStream) { <ParseCertificates>d__11 <ParseCertificates>d__ = new <ParseCertificates>d__11(-2); <ParseCertificates>d__.<>4__this = this; <ParseCertificates>d__.<>3__inStream = inStream; return <ParseCertificates>d__; } } }