<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

X509CertificatePair

public class X509CertificatePair
using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Security.Certificates; using System; namespace Org.BouncyCastle.X509 { public class X509CertificatePair { private readonly X509Certificate m_forward; private readonly X509Certificate m_reverse; public X509Certificate Forward => m_forward; public X509Certificate Reverse => m_reverse; public X509CertificatePair(X509Certificate forward, X509Certificate reverse) { if (forward == null && reverse == null) throw new ArgumentException("At least one of the pair shall be present"); m_forward = forward; m_reverse = reverse; } public X509CertificatePair(CertificatePair pair) { X509CertificateStructure forward = pair.Forward; X509CertificateStructure reverse = pair.Reverse; m_forward = ((forward == null) ? null : new X509Certificate(forward)); m_reverse = ((reverse == null) ? null : new X509Certificate(reverse)); } public CertificatePair GetCertificatePair() { return new CertificatePair(m_forward?.CertificateStructure, m_reverse?.CertificateStructure); } public byte[] GetEncoded() { try { return GetCertificatePair().GetEncoded("DER"); } catch (Exception ex) { throw new CertificateEncodingException(ex.Message, ex); } } public override bool Equals(object obj) { if (obj == this) return true; X509CertificatePair x509CertificatePair = obj as X509CertificatePair; if (x509CertificatePair == null) return false; if (object.Equals(m_forward, x509CertificatePair.m_forward)) return object.Equals(m_reverse, x509CertificatePair.m_reverse); return false; } public override int GetHashCode() { int num = -1; if (m_forward != null) num ^= m_forward.GetHashCode(); if (m_reverse != null) { num *= 17; num ^= m_reverse.GetHashCode(); } return num; } } }