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;
}
}
}
}