X509AttrCertParser
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 X509AttrCertParser
{
private static readonly PemParser PemAttrCertParser = new PemParser("ATTRIBUTE CERTIFICATE");
private Asn1Set sData;
private int sDataObjectCount;
private Stream currentStream;
private X509V2AttributeCertificate ReadDerCertificate(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)) {
sData = result.Certificates;
return GetCertificate();
}
}
return new X509V2AttributeCertificate(AttributeCertificate.GetInstance(asn1Sequence));
}
private X509V2AttributeCertificate ReadPemCertificate(Stream inStream)
{
Asn1Sequence asn1Sequence = PemAttrCertParser.ReadPemObject(inStream);
if (asn1Sequence != null)
return new X509V2AttributeCertificate(AttributeCertificate.GetInstance(asn1Sequence));
return null;
}
private X509V2AttributeCertificate GetCertificate()
{
if (sData != null) {
while (sDataObjectCount < sData.Count) {
if (Asn1Utilities.TryGetOptionalContextTagged(sData[sDataObjectCount++], 2, false, out AttributeCertificate result, AttributeCertificate.GetTagged))
return new X509V2AttributeCertificate(result);
}
}
return null;
}
public X509V2AttributeCertificate ReadAttrCert(byte[] input)
{
using (MemoryStream inStream = new MemoryStream(input, false))
return ReadAttrCert(inStream);
}
public IList<X509V2AttributeCertificate> ReadAttrCerts(byte[] input)
{
using (MemoryStream inStream = new MemoryStream(input, false))
return ReadAttrCerts(inStream);
}
public X509V2AttributeCertificate ReadAttrCert(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 attribute certificate", innerException);
}
}
throw new ArgumentException("Stream must be read-able", "inStream");
}
public IList<X509V2AttributeCertificate> ReadAttrCerts(Stream inStream)
{
return new List<X509V2AttributeCertificate>(ParseAttrCerts(inStream));
}
[IteratorStateMachine(typeof(<ParseAttrCerts>d__11))]
public IEnumerable<X509V2AttributeCertificate> ParseAttrCerts(Stream inStream)
{
<ParseAttrCerts>d__11 <ParseAttrCerts>d__ = new <ParseAttrCerts>d__11(-2);
<ParseAttrCerts>d__.<>4__this = this;
<ParseAttrCerts>d__.<>3__inStream = inStream;
return <ParseAttrCerts>d__;
}
}
}