OtherSigningCertificate
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Utilities;
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;
            Asn1Sequence asn1Sequence = obj as Asn1Sequence;
            if (asn1Sequence != null)
                return new OtherSigningCertificate(asn1Sequence);
            throw new ArgumentException("Unknown object in 'OtherSigningCertificate' factory: " + Platform.GetTypeName(obj), "obj");
        }
        private OtherSigningCertificate(Asn1Sequence seq)
        {
            if (seq == null)
                throw new ArgumentNullException("seq");
            if (seq.Count < 1 || seq.Count > 2)
                throw new ArgumentException("Bad sequence size: " + seq.Count.ToString(), "seq");
            m_certs = Asn1Sequence.GetInstance(seq[0].ToAsn1Object());
            if (seq.Count > 1)
                m_policies = Asn1Sequence.GetInstance(seq[1].ToAsn1Object());
        }
        public OtherSigningCertificate(params OtherCertID[] certs)
            : this(certs, (PolicyInformation[])null)
        {
        }
        public OtherSigningCertificate(OtherCertID[] certs, params PolicyInformation[] policies)
        {
            if (certs == null)
                throw new ArgumentNullException("certs");
            m_certs = new DerSequence(certs);
            if (policies != null)
                m_policies = new DerSequence(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 = new DerSequence(Asn1EncodableVector.FromEnumerable(certs));
            if (policies != null)
                m_policies = new DerSequence(Asn1EncodableVector.FromEnumerable(policies));
        }
        public OtherCertID[] GetCerts()
        {
            return m_certs.MapElements((Asn1Encodable element) => OtherCertID.GetInstance(element.ToAsn1Object()));
        }
        public PolicyInformation[] GetPolicies()
        {
            return m_policies?.MapElements((Asn1Encodable element) => PolicyInformation.GetInstance(element.ToAsn1Object()));
        }
        public override Asn1Object ToAsn1Object()
        {
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(m_certs);
            asn1EncodableVector.AddOptional(m_policies);
            return new DerSequence(asn1EncodableVector);
        }
    }
}