void initializeFromAsn(Byte[] rawData) { Asn1Reader asn1 = new Asn1Reader(rawData); if (asn1.Tag != 48) { throw new Exception("Unable to decode. Input data is not valid ASN.1 encoded data."); } asn1.MoveNext(); HashingAlgorithm = new AlgorithmIdentifier(Asn1Utils.Encode(asn1.GetPayload(), 48)).AlgorithmId; asn1.MoveNextCurrentLevel(); // issuerNameHash if (asn1.Tag != 4) { throw new Exception("Unable to decode. The data is invalid"); } IssuerNameId = AsnFormatter.BinaryToString(asn1.GetPayload()).Trim(); asn1.MoveNextCurrentLevel(); // issuerKeyId if (asn1.Tag != 4) { throw new Exception("Unable to decode. The data is invalid"); } IssuerKeyId = AsnFormatter.BinaryToString(asn1.GetPayload()).Trim(); asn1.MoveNextCurrentLevel(); // serialnumber if (asn1.Tag != 2) { throw new Exception("Unable to decode. The data is invalid"); } serialNumber = asn1.GetPayload(); IsReadOnly = true; }
void decode(Byte[] rawData) { reset(); _rawData.AddRange(rawData); cms = new DefaultSignedPkcs7(rawData); if (cms.ContentType.Value != ctlOid.Value) { throw new ArgumentException("Decoded data is not valid certificate trust list."); } var asn = new Asn1Reader(Asn1Utils.Encode(cms.Content, 48)); asn.MoveNextAndExpectTags(48); decodeUsages(asn); Boolean reachedEnd = false; while (asn.MoveNextCurrentLevel()) { if (reachedEnd) { break; } switch (asn.Tag) { case (Byte)Asn1Type.OCTET_STRING: decodeListIdentifier(asn); break; case (Byte)Asn1Type.INTEGER: decodeSequenceNumber(asn); break; case (Byte)Asn1Type.UTCTime: case (Byte)Asn1Type.GeneralizedTime: decodeValidity(asn); reachedEnd = true; break; default: reachedEnd = true; break; } } decodeAlgId(asn); asn.MoveNextCurrentLevel(); decodeEntries(asn); if (asn.MoveNextCurrentLevel()) { decodeExtensions(asn); } }
void m_initialize(Asn1Reader response) { response.MoveNext(); CertId = new CertID(Asn1Utils.Encode(response.GetPayload(), 48)); response.MoveNextCurrentLevel(); switch (response.Tag) { case 128: CertStatus = CertificateStatus.Good; response.MoveNextCurrentLevel(); break; case 161: CertStatus = CertificateStatus.Revoked; response.MoveNext(); DateTime revokedWhen = Asn1Utils.DecodeGeneralizedTime(response.GetTagRawData()); response.MoveNext(); Int16 reason = 0; if (response.Tag == 160) { response.MoveNext(); reason = response.GetPayload()[0]; response.MoveNext(); } RevocationInfo = new X509CRLEntry(CertId.SerialNumber, revokedWhen, reason); break; case 130: CertStatus = CertificateStatus.Unknown; response.MoveNextCurrentLevel(); break; } //response.MoveNextCurrentLevel(); ThisUpdate = Asn1Utils.DecodeGeneralizedTime(response.GetTagRawData()); while (response.MoveNextCurrentLevel()) { switch (response.Tag) { case 160: Asn1Reader asn = new Asn1Reader(response.GetPayload()); NextUpdate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); break; case 161: Extensions.Decode(response.GetPayload()); break; } } }
/// <summary> /// Decodes ASN.1-encoded byte array that represents a collection of <see cref="X509Extension"/> objects. /// </summary> /// <param name="extensions">Destination collection where decoded extensions will be added.</param> /// <param name="rawData">ASN.1-encoded byte array that represents extension collection.</param> /// <exception cref="Asn1InvalidTagException">Decoder encountered an unexpected ASN.1 type identifier.</exception> /// <exception cref="ArgumentNullException"> /// <strong>extensions</strong> and/or <strong>rawData</strong> parameter is null. /// </exception> /// <remarks>If current collection contains items, decoded items will be appended to existing items.</remarks> public static void Decode(this X509ExtensionCollection extensions, Byte[] rawData) { if (extensions == null) { throw new ArgumentNullException(nameof(extensions)); } if (rawData == null) { throw new ArgumentNullException(nameof(rawData)); } Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(); } if (!asn.MoveNext() || asn.NextOffset == 0) { return; } do { extensions.Add(X509ExtensionExtensions.Decode(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); }
void decode(Asn1Reader asn) { asn.MoveNextAndExpectTags((Byte)Asn1Type.INTEGER); Version = (Int32) new Asn1Integer(asn).Value; asn.MoveNextAndExpectTags(48); RequestMessage = new TspMessageImprint(asn.GetTagRawData()); while (asn.MoveNextCurrentLevel()) { switch (asn.Tag) { case (Byte)Asn1Type.OBJECT_IDENTIFIER: PolicyID = new Asn1ObjectIdentifier(asn).Value; break; case (Byte)Asn1Type.INTEGER: UseNonce = true; nonce = new Asn1Integer(asn).Value.ToByteArray(); break; case (Byte)Asn1Type.BOOLEAN: RequestCertificates = new Asn1Boolean(asn).Value; break; case 0xa0: var extList = new X509ExtensionCollection(); extList.Decode(asn.GetTagRawData()); foreach (X509Extension extension in extList) { _extensions.Add(extension); } break; } } }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); IncludedComponents = AuthorityKeyIdentifierFlags.None; do { switch (asn.Tag) { case 0x80: KeyIdentifier = AsnFormatter.BinaryToString(asn.GetPayload(), EncodingType.HexRaw, EncodingFormat.NOCRLF); IncludedComponents |= AuthorityKeyIdentifierFlags.KeyIdentifier; break; case 0xa1: IssuerNames = new X509AlternativeNameCollection(); var bytes = Asn1Utils.Encode(asn.GetPayload(), 48); IssuerNames.Decode(bytes); IssuerNames.Close(); IncludedComponents |= AuthorityKeyIdentifierFlags.AlternativeNames; break; case 0x82: SerialNumber = AsnFormatter.BinaryToString(asn.GetPayload()); IncludedComponents |= AuthorityKeyIdentifierFlags.SerialNumber; break; } } while (asn.MoveNextCurrentLevel()); }
void m_decode(Byte[] rawData) { CrossCertDistributionPoints = new X509AlternativeNameCollection(); Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new ArgumentException("The data is invalid"); } asn.MoveNext(); if (asn.Tag == (Byte)Asn1Type.INTEGER) { DeltaSyncTimeInSeconds = (Int32)Asn1Utils.DecodeInteger(asn.GetTagRawData()); asn.MoveNext(); } asn.MoveNext(); do { var altNames = new X509AlternativeNameCollection(); altNames.Decode(asn.GetTagRawData()); CrossCertDistributionPoints.AddRange(altNames); } while (asn.MoveNextCurrentLevel()); CrossCertDistributionPoints.Close(); }
void m_decode(Byte[] rawData) { var aiaUrls = new List <String>(); var ocspUrls = new List <String>(); var asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); do { Int32 offset = asn.Offset; if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); String oidString = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()).Value; asn.MoveNextAndExpectTags(0x86); switch (oidString) { case "1.3.6.1.5.5.7.48.2": aiaUrls.Add(Encoding.ASCII.GetString(asn.GetPayload())); break; case "1.3.6.1.5.5.7.48.1": ocspUrls.Add(Encoding.ASCII.GetString(asn.GetPayload())); break; } asn.MoveToPosition(offset); } while (asn.MoveNextCurrentLevel()); CertificationAuthorityIssuer = aiaUrls.ToArray(); OnlineCertificateStatusProtocol = ocspUrls.ToArray(); }
/// <summary> /// Decodes ASN.1 encoded byte array to an array of <see cref="X500RdnAttribute"/> objects. /// </summary> /// <param name="rawData">ASN.1-encoded byte array.</param> /// <exception cref="ArgumentNullException"> /// <strong>rawData</strong> parameter is null. /// </exception> /// <exception cref="AccessViolationException"> /// The collection is read-only and cannot be modified. /// </exception> /// <exception cref="Asn1InvalidTagException"> /// The data in the <strong>rawData</strong> parameter is not valid array of <see cref="X500RdnAttribute"/> objects. /// </exception> public void Decode(Byte[] rawData) { if (IsReadOnly) { throw new AccessViolationException("An object is encoded and is write-protected."); } if (rawData == null) { throw new ArgumentNullException(nameof(rawData)); } InternalList.Clear(); Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); do { if (asn.Tag != 49) { throw new Asn1InvalidTagException(asn.Offset); } InternalList.Add(new X500RdnAttribute(asn.GetPayload())); } while (asn.MoveNextCurrentLevel()); // reverse list to get attributes from leaf to root. InternalList.Reverse(); }
void getAttributes(Asn1Reader asn) { asn.MoveNext(); if (asn.PayloadLength == 0) { return; } do { X509Attribute attribute = X509Attribute.Decode(asn.GetTagRawData()); if (attribute.Oid.Value == X509ExtensionOid.CertificateExtensions) { //Extensions var extensions = new X509ExtensionCollection(); extensions.Decode(attribute.RawData); foreach (X509Extension extension in extensions) { _extensions.Add(extension); } } else { _attributes.Add(attribute); } } while (asn.MoveNextCurrentLevel()); }
void decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); ContentType = new Asn1ObjectIdentifier(asn.GetTagRawData()).Value; asn.MoveNextAndExpectTags(0xa0); // [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL, 0xa0 asn.MoveNextAndExpectTags(0x30); // SEQUENCE OF ANY asn.MoveNextAndExpectTags((Byte)Asn1Type.INTEGER); // version Version = (Int32)new Asn1Integer(asn.GetTagRawData()).Value; asn.MoveNextCurrentLevelAndExpectTags(0x31); decodeDigestAlgorithms(asn); asn.MoveNextCurrentLevelAndExpectTags(0x30); // ContentInfo Byte[] content = extractContent(asn); while (asn.MoveNextCurrentLevel()) { switch (asn.Tag) { case 0xa0: decodeCertificates(asn); break; case 0xa1: decodeCrls(asn); break; case 0x31: decodeSignerInfos(asn); break; default: throw new ArgumentException("Invalid type."); } } RawData = rawData; DecodeContent(content); }
/// <summary> /// /// </summary> /// <param name="rawData"></param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidDataException"></exception> public static X509ExtensionCollection DecodeX509Extensions(Byte[] rawData) { if (rawData == null) { throw new ArgumentNullException("rawData"); } Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new InvalidDataException(); } X509ExtensionCollection exts = new X509ExtensionCollection(); if (!asn.MoveNext()) { throw new Asn1InvalidTagException(); } if (asn.NextOffset == 0) { return(exts); } do { exts.Add(DecodeX509Extension(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); return(exts); }
public static X500RdnAttribute[] GetRdnAttributes(this X500DistinguishedName name) { if (name == null) { throw new ArgumentNullException("name"); } if (name.RawData == null || name.RawData.Length == 0) { return(null); } Asn1Reader asn = new Asn1Reader(name.RawData); if (!asn.MoveNext()) { return(null); } if (asn.NextCurrentLevelOffset == 0) { return(null); } var retValue = new List <X500RdnAttribute>(); do { Asn1Reader asn2 = new Asn1Reader(asn.GetPayload()); asn2.MoveNext(); Oid oid = Asn1Utils.DecodeObjectIdentifier(asn2.GetTagRawData()); asn2.MoveNext(); String value = Asn1Utils.DecodeAnyString(asn2.GetTagRawData(), null); retValue.Add(new X500RdnAttribute(oid, value)); } while (asn.MoveNextCurrentLevel()); return(retValue.ToArray()); }
void m_decode(Byte[] rawData) { List <String> aiaUrls = new List <String>(); List <String> ocspUrls = new List <String>(); Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new ArgumentException("The data is invalid"); } asn.MoveNext(); do { Asn1Reader asnurl = new Asn1Reader(asn.GetTagRawData()); if (asnurl.Tag != 48) { throw new ArgumentException("The data is invalid"); } asnurl.MoveNext(); String oidString = Asn1Utils.DecodeObjectIdentifier(asnurl.GetTagRawData()).Value; asnurl.MoveNext(); if (asnurl.Tag != 134) { throw new ArgumentException("The data is invalid"); } switch (oidString) { case "1.3.6.1.5.5.7.48.2": aiaUrls.Add(Encoding.ASCII.GetString(asnurl.GetPayload())); break; case "1.3.6.1.5.5.7.48.1": ocspUrls.Add(Encoding.ASCII.GetString(asnurl.GetPayload())); break; } } while (asn.MoveNextCurrentLevel()); CertificationAuthorityIssuer = aiaUrls.ToArray(); OnlineCertificateStatusProtocol = ocspUrls.ToArray(); }
void decodeResponse() { asn = new Asn1Reader(RawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException("Response data is not valid ASN.1 encoded data."); } //response status asn.MoveNextAndExpectTags((Byte)Asn1Type.ENUMERATED); ResponseStatus = (OCSPResponseStatus)asn.GetPayload()[0]; if (asn.NextOffset == 0) { return; } //responseBytesCS asn.MoveNextAndExpectTags(0xa0); asn.MoveNext(); asn.MoveNext(); decodeResponseType(new Asn1ObjectIdentifier(asn.GetTagRawData()).Value); asn.MoveNextAndExpectTags((Byte)Asn1Type.OCTET_STRING); //BasicOCSPResponse asn.MoveNextAndExpectTags(0x30); asn.MoveNext(); //tbsResponseData Asn1Reader tbsResponseData = new Asn1Reader(asn.GetTagRawData()); //decodetbsResponse(tbsResponseData); //signatureAlgorithm asn.MoveNextCurrentLevel(); SignatureAlgorithm = new AlgorithmIdentifier(Asn1Utils.Encode(asn.GetPayload(), 48)).AlgorithmId; //signature asn.MoveNextCurrentLevel(); Byte[] signature = asn.GetPayload().Skip(1).ToArray(); // GenericArray.GetSubArray(asn1.Payload, 1, asn1.Payload.Length - 1); SignerCertificates = new X509Certificate2Collection(); if (asn.MoveNext()) { asn.MoveNext(); Asn1Reader cert = new Asn1Reader(asn.GetPayload()); do { SignerCertificates.Add(new X509Certificate2(Asn1Utils.Encode(cert.GetPayload(), 48))); } while (cert.MoveNextCurrentLevel()); verifySigner(SignerCertificates[0], true); } // optional. Find cert in store. verifyAll(tbsResponseData, signature, SignatureAlgorithm); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new ArgumentException("The data is invalid."); } asn.MoveNext(); do { _oids.Add(Asn1Utils.DecodeObjectIdentifier(asn.GetPayload())); } while (asn.MoveNextCurrentLevel()); }
void decodeCrls(Asn1Reader asn) { if (asn.PayloadLength == 0) { return; } Int32 offset = asn.Offset; asn.MoveNext(); do { _crls.Add(new X509CRL2(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); asn.MoveToPoisition(offset); }
void decodeSignerInfos(Asn1Reader asn) { if (asn.PayloadLength == 0) { return; } Int32 offset = asn.Offset; asn.MoveNext(); do { _signerInfos.Add(new PkcsSignerInfo(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); asn.MoveToPoisition(offset); }
void decodeDigestAlgorithms(Asn1Reader asn) { // asn tag -> SET (0x31) Int32 offset = asn.Offset; if (asn.PayloadLength == 0) { return; } asn.MoveNext(); do { _digestAlgorithms.Add(new AlgorithmIdentifier(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); asn.MoveToPoisition(offset); }
Byte[] extractContent(Asn1Reader asn) { Int32 offset = asn.Offset; asn.MoveNext(); ContentType = new Asn1ObjectIdentifier(asn.GetTagRawData()).Value; if (asn.MoveNextCurrentLevel()) { // content [0] EXPLICIT ANY DEFINED BY contentType asn.MoveNextAndExpectTags((Byte)Asn1Type.OCTET_STRING); // octet string return asn.GetPayload(); } asn.MoveToPoisition(offset); return null; }
void decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); Version = (Int32)Asn1Utils.DecodeInteger(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); Issuer = new SubjectIdentifier2(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); HashAlgorithm = new AlgorithmIdentifier(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); if (asn.Tag == 0xa0) { AuthenticatedAttributes.Decode(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); } EncryptedHashAlgorithm = new AlgorithmIdentifier(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); EncryptedHash = asn.GetPayload(); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); Oid oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); switch (oid.Value) { case "1.3.6.1.5.5.7.2.1": Type = X509PolicyQualifierType.CpsUrl; asn.MoveNext(); PolicyUrl = new Uri(Asn1Utils.DecodeIA5String(asn.GetTagRawData()).Replace("\0", null)); break; case "1.3.6.1.5.5.7.2.2": Type = X509PolicyQualifierType.UserNotice; if (!asn.MoveNext()) { return; } if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); if (asn.Tag == 48) { Int32 offset = asn.Offset; asn.MoveNext(); NoticeReference = Asn1Utils.DecodeAnyString(asn.GetTagRawData(), new[] { Asn1Type.IA5String, Asn1Type.VisibleString, Asn1Type.BMPString, Asn1Type.UTF8String }); asn.MoveNext(); asn.MoveNext(); NoticeNumber = (Int32)Asn1Utils.DecodeInteger(asn.GetTagRawData()); asn.MoveToPosition(offset); if (asn.MoveNextCurrentLevel()) { NoticeText = Asn1Utils.DecodeAnyString(asn.GetTagRawData(), new[] { Asn1Type.IA5String, Asn1Type.VisibleString, Asn1Type.BMPString, Asn1Type.UTF8String }); } } else { NoticeText = Asn1Utils.DecodeAnyString(asn.GetTagRawData(), new[] { Asn1Type.IA5String, Asn1Type.VisibleString, Asn1Type.BMPString, Asn1Type.UTF8String }); } break; default: m_reset(); return; } }
void decode(Byte[] rawData) { var asn = new Asn1Reader(rawData); asn.MoveNext(); Version = (Int32)Asn1Utils.DecodeInteger(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); Issuer = new PkcsSubjectIdentifier(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); HashAlgorithm = new AlgorithmIdentifier(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); if (asn.Tag == 0xa0) { _authAttributes.Decode(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); } EncryptedHashAlgorithm = new AlgorithmIdentifier(asn.GetTagRawData()); asn.MoveNextCurrentLevel(); EncryptedHash = asn.GetPayload(); if (asn.MoveNextCurrentLevel() && asn.Tag == 0xa1) { _unauthAttributes.Decode(asn.GetTagRawData()); } _rawData.AddRange(rawData); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); List <OidMapping> mappings = new List <OidMapping>(); do { mappings.Add(new OidMapping(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); OidMappings = mappings.ToArray(); }
static X509AlternativeNameCollection decodeNamesFromAsn(Byte[] rawData) { X509AlternativeNameCollection altNames = new X509AlternativeNameCollection(); Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); do { altNames.Add(new X509AlternativeName(asn.GetPayload())); } while (asn.MoveNextCurrentLevel()); altNames.Close(); return(altNames); }
void decodeRsaPss(Asn1Reader asn) { PaddingScheme = SignaturePadding.PSS; asn.MoveNext(); HashingAlgorithm = asn.Tag == 0xa0 ? new Oid2(new AlgorithmIdentifier(asn.GetPayload()).AlgorithmId, false) : new Oid2(AlgorithmOids.SHA1, false); // feed asn reader to salt identifier while (asn.MoveNextCurrentLevel() && asn.Tag != 0xa2) { } PssSaltByteCount = asn.Tag == 0xa2 ? (Int32)Asn1Utils.DecodeInteger(asn.GetPayload()) : 20; }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new ArgumentException("The data is invalid"); } if (!asn.MoveNext()) { throw new ArgumentException("The data is invalid"); } ToBeSignedData = asn.GetTagRawData(); if (!asn.MoveNextCurrentLevel()) { throw new ArgumentException("The data is invalid"); } SignatureAlgorithm = new AlgorithmIdentifier(asn.GetTagRawData()); if (!asn.MoveNextCurrentLevel()) { throw new ArgumentException("The data is invalid"); } Signature = new Asn1BitString(asn); }
/// <summary> /// Decodes ASN.1 encoded byte array to an array of <see cref="X509PolicyQualifier"/> objects. /// </summary> /// <param name="rawData">ASN.1-encoded byte array.</param> /// <exception cref="Asn1InvalidTagException"> /// The data in the <strong>rawData</strong> parameter is not valid array of <see cref="X509PolicyQualifier"/> objects. /// </exception> public void Decode(Byte[] rawData) { InternalList.Clear(); Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); do { InternalList.Add(new X509PolicyQualifier(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); do { switch (asn.Tag) { case 0xa0: PermittedSubtree = decodeNamesFromAsn(asn.GetTagRawData()); break; case 0xa1: ExcludedSubtree = decodeNamesFromAsn(asn.GetTagRawData()); break; } } while (asn.MoveNextCurrentLevel()); }
/// <summary> /// Decodes ASN.1 encoded byte array to an array of <see cref="X509PolicyQualifier"/> objects. /// </summary> /// <param name="rawData">ASN.1-encoded byte array.</param> /// <exception cref="InvalidDataException"> /// The data in the <strong>rawData</strong> parameter is not valid array of <see cref="X509PolicyQualifier"/> objects. /// </exception> public void Decode(Byte[] rawData) { _list.Clear(); Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new InvalidDataException("The data is invalid."); } asn.MoveNext(); do { _list.Add(new X509PolicyQualifier(asn.GetTagRawData())); } while (asn.MoveNextCurrentLevel()); }