using System; using Org.BouncyCastle.Asn1.Crmf; namespace Org.BouncyCastle.Asn1.Cmp { public class CertOrEncCert : Asn1Encodable, IAsn1Choice { private readonly CmpCertificate certificate; private readonly EncryptedValue encryptedCert; private CertOrEncCert(Asn1TaggedObject tagged) { if (tagged.TagNo == 0) { certificate = CmpCertificate.GetInstance(tagged.GetObject()); } else if (tagged.TagNo == 1) { encryptedCert = EncryptedValue.GetInstance(tagged.GetObject()); } else { throw new ArgumentException("unknown tag: " + tagged.TagNo, "tagged"); } } public static CertOrEncCert GetInstance(object obj) { if (obj is CertOrEncCert) return (CertOrEncCert)obj; if (obj is Asn1TaggedObject) return new CertOrEncCert((Asn1TaggedObject)obj); throw new ArgumentException("Invalid object: " + obj.GetType().Name, "obj"); } public CertOrEncCert(CmpCertificate certificate) { if (certificate == null) throw new ArgumentNullException("certificate"); this.certificate = certificate; } public CertOrEncCert(EncryptedValue encryptedCert) { if (encryptedCert == null) throw new ArgumentNullException("encryptedCert"); this.encryptedCert = encryptedCert; } public virtual CmpCertificate Certificate { get { return certificate; } } public virtual EncryptedValue EncryptedCert { get { return encryptedCert; } } /** *
* CertOrEncCert ::= CHOICE { * certificate [0] CMPCertificate, * encryptedCert [1] EncryptedValue * } ** @return a basic ASN.1 object representation. */ public override Asn1Object ToAsn1Object() { if (certificate != null) { return new DerTaggedObject(true, 0, certificate); } return new DerTaggedObject(true, 1, encryptedCert); } } }