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

X509CertPairParser

public class X509CertPairParser
using Org.BouncyCastle.Asn1; 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 X509CertPairParser { private Stream currentStream; private X509CertificatePair ReadDerCrossCertificatePair(Stream inStream) { using (Asn1InputStream asn1InputStream = new Asn1InputStream(inStream, 2147483647, true)) return new X509CertificatePair(CertificatePair.GetInstance(asn1InputStream.ReadObject())); } public X509CertificatePair ReadCertPair(byte[] input) { return ReadCertPair(new MemoryStream(input, false)); } public IList<X509CertificatePair> ReadCertPairs(byte[] input) { return ReadCertPairs(new MemoryStream(input, false)); } public X509CertificatePair ReadCertPair(Stream inStream) { if (inStream == null) throw new ArgumentNullException("inStream"); if (inStream.CanRead) { if (currentStream == null) currentStream = inStream; else if (currentStream != inStream) { currentStream = inStream; } try { 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; } return ReadDerCrossCertificatePair(inStream); } return null; } catch (CertificateException) { throw; } catch (Exception ex2) { throw new CertificateException(ex2.ToString()); } } throw new ArgumentException("inStream must be read-able", "inStream"); } public IList<X509CertificatePair> ReadCertPairs(Stream inStream) { List<X509CertificatePair> list = new List<X509CertificatePair>(); X509CertificatePair item; while ((item = ReadCertPair(inStream)) != null) { list.Add(item); } return list; } } }