OtherSigningCertificate
using Org.BouncyCastle.Asn1.X509;
using System;
using System.Collections.Generic;
namespace Org.BouncyCastle.Asn1.Esf
{
    public class OtherSigningCertificate : Asn1Encodable
    {
        private readonly Asn1Sequence m_certs;
        private readonly Asn1Sequence m_policies;
        public static OtherSigningCertificate GetInstance(object obj)
        {
            if (obj == null)
                return null;
            OtherSigningCertificate otherSigningCertificate = obj as OtherSigningCertificate;
            if (otherSigningCertificate != null)
                return otherSigningCertificate;
            return new OtherSigningCertificate(Asn1Sequence.GetInstance(obj));
        }
        public static OtherSigningCertificate GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new OtherSigningCertificate(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
        }
        public static OtherSigningCertificate GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new OtherSigningCertificate(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
        }
        private OtherSigningCertificate(Asn1Sequence seq)
        {
            int count = seq.Count;
            if (count < 1 || count > 2)
                throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
            m_certs = Asn1Sequence.GetInstance(seq[0]);
            if (count > 1)
                m_policies = Asn1Sequence.GetInstance(seq[1]);
        }
        public OtherSigningCertificate(params OtherCertID[] certs)
            : this(certs, (PolicyInformation[])null)
        {
        }
        public OtherSigningCertificate(OtherCertID[] certs, params PolicyInformation[] policies)
        {
            m_certs = DerSequence.FromElements(certs);
            m_policies = DerSequence.FromElementsOptional(policies);
        }
        public OtherSigningCertificate(IEnumerable<OtherCertID> certs)
            : this(certs, null)
        {
        }
        public OtherSigningCertificate(IEnumerable<OtherCertID> certs, IEnumerable<PolicyInformation> policies)
        {
            if (certs == null)
                throw new ArgumentNullException("certs");
            m_certs = DerSequence.FromVector(Asn1EncodableVector.FromEnumerable(certs));
            if (policies != null)
                m_policies = DerSequence.FromVector(Asn1EncodableVector.FromEnumerable(policies));
        }
        public OtherCertID[] GetCerts()
        {
            return m_certs.MapElements(OtherCertID.GetInstance);
        }
        public PolicyInformation[] GetPolicies()
        {
            return m_policies?.MapElements(PolicyInformation.GetInstance);
        }
        public override Asn1Object ToAsn1Object()
        {
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(2);
            asn1EncodableVector.Add(m_certs);
            asn1EncodableVector.AddOptional(m_policies);
            return new DerSequence(asn1EncodableVector);
        }
    }
}