using System; using System.Collections; using Org.BouncyCastle.Utilities.Collections; namespace Org.BouncyCastle.Asn1.Esf { /// /// /// SignaturePolicyId ::= SEQUENCE { /// sigPolicyIdentifier SigPolicyId, /// sigPolicyHash SigPolicyHash, /// sigPolicyQualifiers SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL /// } /// /// SigPolicyId ::= OBJECT IDENTIFIER /// /// SigPolicyHash ::= OtherHashAlgAndValue /// /// public class SignaturePolicyId : Asn1Encodable { private readonly DerObjectIdentifier sigPolicyIdentifier; private readonly OtherHashAlgAndValue sigPolicyHash; private readonly Asn1Sequence sigPolicyQualifiers; public static SignaturePolicyId GetInstance( object obj) { if (obj == null || obj is SignaturePolicyId) return (SignaturePolicyId) obj; if (obj is Asn1Sequence) return new SignaturePolicyId((Asn1Sequence) obj); throw new ArgumentException( "Unknown object in 'SignaturePolicyId' factory: " + obj.GetType().Name, "obj"); } private SignaturePolicyId( Asn1Sequence seq) { if (seq == null) throw new ArgumentNullException("seq"); if (seq.Count < 2 || seq.Count > 3) throw new ArgumentException("Bad sequence size: " + seq.Count, "seq"); this.sigPolicyIdentifier = (DerObjectIdentifier) seq[0].ToAsn1Object(); this.sigPolicyHash = OtherHashAlgAndValue.GetInstance(seq[1].ToAsn1Object()); if (seq.Count > 2) { this.sigPolicyQualifiers = (Asn1Sequence) seq[2].ToAsn1Object(); } } public SignaturePolicyId( DerObjectIdentifier sigPolicyIdentifier, OtherHashAlgAndValue sigPolicyHash) : this(sigPolicyIdentifier, sigPolicyHash, null) { } public SignaturePolicyId( DerObjectIdentifier sigPolicyIdentifier, OtherHashAlgAndValue sigPolicyHash, params SigPolicyQualifierInfo[] sigPolicyQualifiers) { if (sigPolicyIdentifier == null) throw new ArgumentNullException("sigPolicyIdentifier"); if (sigPolicyHash == null) throw new ArgumentNullException("sigPolicyHash"); this.sigPolicyIdentifier = sigPolicyIdentifier; this.sigPolicyHash = sigPolicyHash; if (sigPolicyQualifiers != null) { this.sigPolicyQualifiers = new DerSequence(sigPolicyQualifiers); } } public SignaturePolicyId( DerObjectIdentifier sigPolicyIdentifier, OtherHashAlgAndValue sigPolicyHash, IEnumerable sigPolicyQualifiers) { if (sigPolicyIdentifier == null) throw new ArgumentNullException("sigPolicyIdentifier"); if (sigPolicyHash == null) throw new ArgumentNullException("sigPolicyHash"); this.sigPolicyIdentifier = sigPolicyIdentifier; this.sigPolicyHash = sigPolicyHash; if (sigPolicyQualifiers != null) { if (!CollectionUtilities.CheckElementsAreOfType(sigPolicyQualifiers, typeof(SigPolicyQualifierInfo))) throw new ArgumentException("Must contain only 'SigPolicyQualifierInfo' objects", "sigPolicyQualifiers"); this.sigPolicyQualifiers = new DerSequence( Asn1EncodableVector.FromEnumerable(sigPolicyQualifiers)); } } public DerObjectIdentifier SigPolicyIdentifier { get { return sigPolicyIdentifier; } } public OtherHashAlgAndValue SigPolicyHash { get { return sigPolicyHash; } } public SigPolicyQualifierInfo[] GetSigPolicyQualifiers() { if (sigPolicyQualifiers == null) return null; SigPolicyQualifierInfo[] infos = new SigPolicyQualifierInfo[sigPolicyQualifiers.Count]; for (int i = 0; i < sigPolicyQualifiers.Count; ++i) { infos[i] = SigPolicyQualifierInfo.GetInstance(sigPolicyQualifiers[i]); } return infos; } public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector( sigPolicyIdentifier, sigPolicyHash.ToAsn1Object()); if (sigPolicyQualifiers != null) { v.Add(sigPolicyQualifiers.ToAsn1Object()); } return new DerSequence(v); } } }