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