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); }
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()); }