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 && 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));
}
[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__;
}
}
}