示例#1
0
        public static X509Extension DecodeX509Extension(Byte[] rawData)
        {
            if (rawData == null)
            {
                throw new ArgumentNullException(nameof(rawData));
            }
            Asn1Reader asn = new Asn1Reader(rawData);

            if (asn.Tag != 48)
            {
                throw new Asn1InvalidTagException(asn.Offset);
            }
            asn.MoveNext();
            if (asn.Tag != (Byte)Asn1Type.OBJECT_IDENTIFIER)
            {
                throw new Asn1InvalidTagException(asn.Offset);
            }
            Oid     oid      = new Asn1ObjectIdentifier(asn).Value;
            Boolean critical = false;

            asn.MoveNext();
            if (asn.Tag == (Byte)Asn1Type.BOOLEAN)
            {
                critical = Asn1Utils.DecodeBoolean(asn.GetTagRawData());
                asn.MoveNext();
            }
            if (asn.Tag != (Byte)Asn1Type.OCTET_STRING)
            {
                throw new Asn1InvalidTagException(asn.Offset);
            }
            return(new X509Extension(oid, asn.GetPayload(), critical).ConvertExtension());
        }
        /// <summary>
        /// Decodes ASN.1-encoded byte array to an instance of <see cref="X509Extension"/> class.
        /// </summary>
        /// <param name="asn">ASN.1 reader that points to the beginning of the X.509 extension structure.</param>
        /// <exception cref="ArgumentNullException"><strong>asn</strong> parameter is null.</exception>
        /// <exception cref="Asn1InvalidTagException">Decoder encountered an unexpected ASN.1 type identifier.</exception>
        /// <returns>Decoded extension object.</returns>
        public static X509Extension Decode(Asn1Reader asn)
        {
            if (asn.Tag != 48)
            {
                throw new Asn1InvalidTagException(asn.Offset);
            }
            Int32 offset = asn.Offset;

            asn.MoveNextAndExpectTags((Byte)Asn1Type.OBJECT_IDENTIFIER);
            Oid     oid      = new Asn1ObjectIdentifier(asn).Value;
            Boolean critical = false;

            asn.MoveNextAndExpectTags((Byte)Asn1Type.BOOLEAN, (Byte)Asn1Type.OCTET_STRING);
            if (asn.Tag == (Byte)Asn1Type.BOOLEAN)
            {
                critical = Asn1Utils.DecodeBoolean(asn.GetTagRawData());
                asn.MoveNextAndExpectTags((Byte)Asn1Type.OCTET_STRING);
            }
            // at this point ASN points to OCTET_STRING

            X509Extension retValue = new X509Extension(oid, asn.GetPayload(), critical).ConvertExtension();

            asn.Seek(offset);
            return(retValue);
        }
示例#3
0
        void decode()
        {
            var asn = new Asn1Reader(RawData);

            if (asn.PayloadLength == 0)
            {
                return;
            }

            asn.MoveNext();
            do
            {
                switch (asn.Tag)
                {
                case 0xa0:
                    DistributionPoint = new X509DistributionPoint(Asn1Utils.Encode(asn.GetTagRawData(), 48));
                    break;

                case 0xa1:
                    OnlyUserCerts = Asn1Utils.DecodeBoolean(asn.GetPayload());
                    break;

                case 0xa2:
                    OnlyCaCerts = Asn1Utils.DecodeBoolean(asn.GetPayload());
                    break;

                case 0xa3:
                    var val = new Asn1BitString(asn.GetPayload());
                    if (val.Value.Length > 1)
                    {
                        Reasons = (X509RevocationReasonFlag)BitConverter.ToUInt16(val.Value, 0);
                    }
                    else if (val.Value.Length == 1)
                    {
                        Reasons = (X509RevocationReasonFlag)val.Value[0];
                    }
                    break;

                case 0xa4:
                    IndirectCRL = Asn1Utils.DecodeBoolean(asn.GetPayload());
                    break;

                case 0xa5:
                    OnlyAttributeCerts = Asn1Utils.DecodeBoolean(asn.GetPayload());
                    break;
                }
            } while (asn.MoveNextSibling());
        }