<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

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; using System.Runtime.CompilerServices; 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) { DerObjectIdentifier derObjectIdentifier = asn1Sequence[0] as DerObjectIdentifier; if (derObjectIdentifier != null && PkcsObjectIdentifiers.SignedData.Equals(derObjectIdentifier) && Asn1Utilities.TryGetOptionalContextTagged(asn1Sequence[1], 0, true, out SignedData result, SignedData.GetTagged)) { sCrlData = result.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) { using (MemoryStream inStream = new MemoryStream(input, false)) return ReadCrl(inStream); } public IList<X509Crl> ReadCrls(byte[] input) { using (MemoryStream inStream = new MemoryStream(input, false)) return ReadCrls(inStream); } 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 innerException) { throw new CrlException("Failed to read CRL", innerException); } } throw new ArgumentException("Stream must be read-able", "inStream"); } public IList<X509Crl> ReadCrls(Stream inStream) { return new List<X509Crl>(ParseCrls(inStream)); } [IteratorStateMachine(typeof(<ParseCrls>d__13))] public IEnumerable<X509Crl> ParseCrls(Stream inStream) { <ParseCrls>d__13 <ParseCrls>d__ = new <ParseCrls>d__13(-2); <ParseCrls>d__.<>4__this = this; <ParseCrls>d__.<>3__inStream = inStream; return <ParseCrls>d__; } } }