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

X509CrlParser

public class X509CrlParser
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; namespace Org.BouncyCastle.X509 { public class X509CrlParser { private static readonly PemParser PemCrlParser = new PemParser("CRL"); private Asn1Set sCrlData; private int sCrlDataObjectCount; private Stream currentCrlStream; public X509CrlParser() { } [Obsolete("Will be removed")] public X509CrlParser(bool lazyAsn1) { } private X509Crl ReadDerCrl(Asn1InputStream dIn) { Asn1Sequence asn1Sequence = (Asn1Sequence)dIn.ReadObject(); if (asn1Sequence.Count > 1 && asn1Sequence[0] is DerObjectIdentifier && asn1Sequence[0].Equals(PkcsObjectIdentifiers.SignedData)) { sCrlData = SignedData.GetInstance(Asn1Sequence.GetInstance((Asn1TaggedObject)asn1Sequence[1], true)).Crls; return GetCrl(); } return new X509Crl(CertificateList.GetInstance(asn1Sequence)); } private X509Crl ReadPemCrl(Stream inStream) { Asn1Sequence asn1Sequence = PemCrlParser.ReadPemObject(inStream); if (asn1Sequence != null) return new X509Crl(CertificateList.GetInstance(asn1Sequence)); return null; } private X509Crl GetCrl() { if (sCrlData == null || sCrlDataObjectCount >= sCrlData.Count) return null; return new X509Crl(CertificateList.GetInstance(sCrlData[sCrlDataObjectCount++])); } public X509Crl ReadCrl(byte[] input) { return ReadCrl(new MemoryStream(input, false)); } public IList<X509Crl> ReadCrls(byte[] input) { return ReadCrls(new MemoryStream(input, false)); } public X509Crl ReadCrl(Stream inStream) { if (inStream == null) throw new ArgumentNullException("inStream"); if (inStream.CanRead) { if (currentCrlStream == null) { currentCrlStream = inStream; sCrlData = null; sCrlDataObjectCount = 0; } else if (currentCrlStream != inStream) { currentCrlStream = inStream; sCrlData = null; sCrlDataObjectCount = 0; } try { if (sCrlData == 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 ReadDerCrl(dIn); } return ReadPemCrl(inStream); } return null; } if (sCrlDataObjectCount == sCrlData.Count) { sCrlData = null; sCrlDataObjectCount = 0; return null; } return GetCrl(); } catch (CrlException) { throw; } catch (Exception ex2) { throw new CrlException(ex2.ToString()); } } throw new ArgumentException("inStream must be read-able", "inStream"); } public IList<X509Crl> ReadCrls(Stream inStream) { return new List<X509Crl>(ParseCrls(inStream)); } public IEnumerable<X509Crl> ParseCrls(Stream inStream) { X509Crl x509Crl; while ((x509Crl = ReadCrl(inStream)) != null) { yield return x509Crl; } } } }