using System; using Org.BouncyCastle.Asn1.X509; namespace Org.BouncyCastle.Asn1.BC { /** * Extension to tie an alternate certificate to the containing certificate. *
     *     LinkedCertificate := SEQUENCE {
     *         digest        DigestInfo,                   -- digest of PQC certificate
     *         certLocation  GeneralName,                  -- location of PQC certificate
     *         certIssuer    [0] Name OPTIONAL,            -- issuer of PQC cert (if different from current certificate)
     *         cACerts       [1] GeneralNames OPTIONAL,    -- CA certificates for PQC cert (one of more locations)
     * }
     * 
*/ public class LinkedCertificate : Asn1Encodable { private readonly DigestInfo mDigest; private readonly GeneralName mCertLocation; private X509Name mCertIssuer; private GeneralNames mCACerts; public LinkedCertificate(DigestInfo digest, GeneralName certLocation) : this(digest, certLocation, null, null) { } public LinkedCertificate(DigestInfo digest, GeneralName certLocation, X509Name certIssuer, GeneralNames caCerts) { this.mDigest = digest; this.mCertLocation = certLocation; this.mCertIssuer = certIssuer; this.mCACerts = caCerts; } private LinkedCertificate(Asn1Sequence seq) { this.mDigest = DigestInfo.GetInstance(seq[0]); this.mCertLocation = GeneralName.GetInstance(seq[1]); for (int i = 2; i < seq.Count; ++i) { Asn1TaggedObject tagged = Asn1TaggedObject.GetInstance(seq[i]); switch (tagged.TagNo) { case 0: this.mCertIssuer = X509Name.GetInstance(tagged, false); break; case 1: this.mCACerts = GeneralNames.GetInstance(tagged, false); break; default: throw new ArgumentException("unknown tag in tagged field"); } } } public static LinkedCertificate GetInstance(object obj) { if (obj is LinkedCertificate) return (LinkedCertificate)obj; if (obj != null) return new LinkedCertificate(Asn1Sequence.GetInstance(obj)); return null; } public virtual DigestInfo Digest { get { return mDigest; } } public virtual GeneralName CertLocation { get { return mCertLocation; } } public virtual X509Name CertIssuer { get { return mCertIssuer; } } public virtual GeneralNames CACerts { get { return mCACerts; } } public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(mDigest, mCertLocation); v.AddOptionalTagged(false, 0, mCertIssuer); v.AddOptionalTagged(false, 1, mCACerts); return new DerSequence(v); } } }