using System; using Org.BouncyCastle.Asn1.X509; namespace Org.BouncyCastle.Asn1.Esf { public class SignerAttribute : Asn1Encodable { public static SignerAttribute GetInstance(object obj) { if (obj == null) return null; if (obj is SignerAttribute signerAttribute) return signerAttribute; return new SignerAttribute(Asn1Sequence.GetInstance(obj), dummy: true); } private readonly Asn1Sequence m_claimedAttributes; private readonly AttributeCertificate m_certifiedAttributes; private SignerAttribute(Asn1Sequence seq, bool dummy) { Asn1TaggedObject taggedObject = Asn1TaggedObject.GetInstance(seq[0], Asn1Tags.ContextSpecific); if (taggedObject.TagNo == 0) { m_claimedAttributes = Asn1Sequence.GetInstance(taggedObject, true); } else if (taggedObject.TagNo == 1) { m_certifiedAttributes = AttributeCertificate.GetInstance(taggedObject, true); } else { throw new ArgumentException("illegal tag.", nameof(seq)); } } public SignerAttribute(Asn1Sequence claimedAttributes) { m_claimedAttributes = claimedAttributes ?? throw new ArgumentNullException(nameof(claimedAttributes)); } public SignerAttribute(AttributeCertificate certifiedAttributes) { m_certifiedAttributes = certifiedAttributes ?? throw new ArgumentNullException(nameof(certifiedAttributes)); } public virtual Asn1Sequence ClaimedAttributes => m_claimedAttributes; public virtual AttributeCertificate CertifiedAttributes => m_certifiedAttributes; /** * *
		*  SignerAttribute ::= SEQUENCE OF CHOICE {
		*      claimedAttributes   [0] ClaimedAttributes,
		*      certifiedAttributes [1] CertifiedAttributes }
		*
		*  ClaimedAttributes ::= SEQUENCE OF Attribute
		*  CertifiedAttributes ::= AttributeCertificate -- as defined in RFC 3281: see clause 4.1.
		* 
*/ public override Asn1Object ToAsn1Object() { return m_claimedAttributes != null ? new DerSequence(new DerTaggedObject(0, m_claimedAttributes)) : new DerSequence(new DerTaggedObject(1, m_certifiedAttributes)); } } }