Extension
using System;
namespace Org.BouncyCastle.Asn1.X509
{
    public class Extension : Asn1Encodable
    {
        private static readonly DerBoolean DefaultCritical = DerBoolean.False;
        private readonly DerObjectIdentifier m_extnID;
        private readonly DerBoolean m_critical;
        private readonly Asn1OctetString m_extnValue;
        public DerBoolean Critical => m_critical;
        public DerObjectIdentifier ExtnID => m_extnID;
        public Asn1OctetString ExtnValue => m_extnValue;
        public static Extension GetInstance(object obj)
        {
            if (obj == null)
                return null;
            Extension extension = obj as Extension;
            if (extension != null)
                return extension;
            return new Extension(Asn1Sequence.GetInstance(obj));
        }
        public static Extension GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new Extension(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
        }
        public static Extension GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new Extension(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
        }
        private Extension(Asn1Sequence seq)
        {
            int count = seq.Count;
            int sequencePosition = 0;
            if (count < 2 || count > 3)
                throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
            m_extnID = DerObjectIdentifier.GetInstance(seq[sequencePosition++]);
            m_critical = (Asn1Utilities.ReadOptional(seq, ref sequencePosition, DerBoolean.GetOptional) ?? DefaultCritical);
            m_extnValue = Asn1OctetString.GetInstance(seq[sequencePosition++]);
            if (sequencePosition != count)
                throw new ArgumentException("Unexpected elements in sequence", "seq");
        }
        public Extension(DerObjectIdentifier extnID, DerBoolean critical, Asn1OctetString extnValue)
        {
            if (extnID == null)
                throw new ArgumentNullException("extnID");
            m_extnID = extnID;
            m_critical = (critical ?? DefaultCritical);
            if (extnValue == null)
                throw new ArgumentNullException("extnValue");
            m_extnValue = extnValue;
        }
        public override Asn1Object ToAsn1Object()
        {
            if (!DefaultCritical.Equals(m_critical))
                return new DerSequence(m_extnID, m_critical, m_extnValue);
            return new DerSequence(m_extnID, m_extnValue);
        }
        public X509Extension GetX509Extension()
        {
            return new X509Extension(m_critical, m_extnValue);
        }
    }
}