void m_initialize(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNext(); SerialNumber = Asn1Utils.DecodeInteger(asn.GetTagRawData(), true); asn.MoveNext(); if (asn.Tag != (Byte)Asn1Type.UTCTime && asn.Tag != (Byte)Asn1Type.GeneralizedTime) { throw new Asn1InvalidTagException(asn.Offset); } if (asn.Tag == (Byte)Asn1Type.UTCTime) { RevocationDate = new Asn1UtcTime(asn.GetTagRawData()).Value; } if (asn.Tag == (Byte)Asn1Type.GeneralizedTime) { RevocationDate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); } if (asn.MoveNext()) { var extensions = new X509ExtensionCollection(); extensions.Decode(asn.GetTagRawData()); X509Extension crlReason = extensions[X509CertExtensions.X509CRLReasonCode]; if (crlReason != null) { ReasonCode = crlReason.RawData[2]; } } RawData = rawData; }
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) { 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 decode(Asn1Reader asn) { if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } RawData = asn.GetTagRawData(); Int32 offset = asn.Offset; asn.MoveNext(); SerialNumber = Asn1Utils.DecodeInteger(asn.GetTagRawData(), true); asn.MoveNextAndExpectTags(Asn1Type.UTCTime, Asn1Type.GeneralizedTime); switch (asn.Tag) { case (Byte)Asn1Type.UTCTime: RevocationDate = new Asn1UtcTime(asn.GetTagRawData()).Value; break; case (Byte)Asn1Type.GeneralizedTime: RevocationDate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); break; } if (asn.MoveNextSibling()) { // use high-performant extension decoder instead of generic one. // Since CRLs may store a hundreds of thousands entries, this is // pretty reasonable to save loops whenever possible. readCrlReasonCode(asn); } asn.Seek(offset); }
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 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); asn.MoveNext(); do { var integer = Asn1Utils.Encode(asn.GetPayload(), (Byte)Asn1Type.INTEGER); switch (asn.Tag) { case 0x80: RequireExplicitPolicy = (Int32)Asn1Utils.DecodeInteger(integer); break; case 0x81: InhibitPolicyMapping = (Int32)Asn1Utils.DecodeInteger(integer); break; default: throw new InvalidDataException("The data is invalid"); } } while (asn.MoveNextCurrentLevel()); }
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_initialize(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new InvalidDataException(); } asn.MoveNext(); if (asn.Tag != (Byte)Asn1Type.INTEGER) { throw new InvalidDataException(); } SerialNumber = Asn1Utils.DecodeInteger(asn.GetTagRawData(), true); asn.MoveNext(); if (asn.Tag != (Byte)Asn1Type.UTCTime && asn.Tag != (Byte)Asn1Type.Generalizedtime) { throw new InvalidDataException(); } if (asn.Tag == (Byte)Asn1Type.UTCTime) { RevocationDate = Asn1Utils.DecodeUTCTime(asn.GetTagRawData()); } if (asn.Tag == (Byte)Asn1Type.Generalizedtime) { RevocationDate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); } if (asn.MoveNext()) { foreach (X509Extension item in Crypt32Managed.DecodeX509Extensions(asn.GetTagRawData()).Cast <X509Extension>().Where(item => item.Oid.Value == "2.5.29.21")) { ReasonCode = item.RawData[2]; } } RawData = rawData; }
/// <summary> /// Returns a formatted version of the Abstract Syntax Notation One (ASN.1)-encoded data as a string. /// </summary> /// <param name="multiLine"> /// <strong>True</strong> if the return string should contain carriage returns; otherwise, <strong>False</strong> /// </param> /// <returns> /// A formatted string that represents the Abstract Syntax Notation One (ASN.1)-encoded data /// </returns> /// <remarks>Use this method if you need to print Abstract Syntax Notation One (ASN.1)-encoded data or output the /// information to a text box. Use the <strong>multiLine</strong> parameter to control the layout of the output.</remarks> public override String Format(Boolean multiLine) { if (RawData != null && RawData.Length != 0) { StringBuilder SB = new StringBuilder(); Asn1Reader asn = new Asn1Reader(RawData); switch (Oid.Value) { // Content Type case "1.2.840.113549.1.9.3": Oid value = Asn1Utils.DecodeObjectIdentifier(asn.RawData); SB.Append("Content type (OID=1.2.840.113549.1.9.3): "); if (multiLine) { SB.Append(Environment.NewLine + " " + value.Value); } else { SB.Append(value.Value); } if (!String.IsNullOrEmpty(value.FriendlyName)) { SB.Append("(" + value.FriendlyName + ")"); } break; // Message Digest case "1.2.840.113549.1.9.4": SB.Append("Message Digest (OID=1.2.840.113549.1.9.4): "); if (multiLine) { SB.Append(Environment.NewLine + Asn1Utils.DecodeOctetString(asn.RawData)); } else { SB.Append(Asn1Utils.DecodeOctetString(asn.RawData)); } break; // Renewal certificate case "1.3.6.1.4.1.311.13.1": X509Certificate2 cert = new X509Certificate2(asn.RawData); SB.Append("Renewal Certificate (OID=1.3.6.1.4.1.311.13.1): "); if (multiLine) { SB.Append(Environment.NewLine + " " + cert.ToString().Replace("\r\n", "\r\n ")); } else { SB.Append(cert.ToString().Replace("\r\n", " ").Replace(" ", " ").Replace(" ", ", ")); } break; // Enrollment Name Value Pair case "1.3.6.1.4.1.311.13.2.1": asn.MoveNext(); SB.Append("Enrollment Name Value Pair (OID=1.3.6.1.4.1.311.13.2.1): "); if (multiLine) { SB.Append(Environment.NewLine + " "); } SB.Append(Encoding.BigEndianUnicode.GetString(asn.GetPayload()) + "="); asn.MoveNext(); SB.Append(Encoding.BigEndianUnicode.GetString(asn.GetPayload())); if (multiLine) { SB.Append(Environment.NewLine); } break; // CSP Info case "1.3.6.1.4.1.311.13.2.2": asn.MoveNext(); SB.Append("CSP Info (OID=1.3.6.1.4.1.311.13.2.2): "); if (multiLine) { SB.Append(Environment.NewLine + " "); } if (asn.Tag == (Int32)Asn1Type.INTEGER) { SB.Append("KeySpec: " + asn.GetPayload()[0]); asn.MoveNext(); } if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } if (asn.Tag == (Int32)Asn1Type.BMPString) { SB.Append("Provider: " + Encoding.BigEndianUnicode.GetString(asn.GetPayload())); asn.MoveNext(); } if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } if (asn.Tag == (Int32)Asn1Type.BIT_STRING) { SB.Append("Signature unused bits: " + asn.GetPayload()[0]); } if (multiLine) { SB.Append(Environment.NewLine); } break; //OS version case "1.3.6.1.4.1.311.13.2.3": SB.Append("OS Version (OID=1.3.6.1.4.1.311.13.2.3): " + Asn1Utils.DecodeIA5String(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } break; // client info case "1.3.6.1.4.1.311.21.20": asn.MoveNext(); SB.Append("Client Info (OID=1.3.6.1.4.1.311.21.20): "); if (multiLine) { SB.Append(Environment.NewLine + " "); } if (asn.Tag == (Int32)Asn1Type.INTEGER) { Int64 id = Asn1Utils.DecodeInteger(asn.GetTagRawData()); SB.Append("Client ID: " + (ClientIdEnum)id + " (" + id + ")"); asn.MoveNext(); } if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } if (asn.Tag == (Int32)Asn1Type.UTF8String) { SB.Append("Computer name: " + Asn1Utils.DecodeUTF8String(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } asn.MoveNext(); SB.Append("User name: " + Asn1Utils.DecodeUTF8String(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } asn.MoveNext(); SB.Append("Process name: " + Asn1Utils.DecodeUTF8String(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // szOID_NT_PRINCIPAL_NAME case "1.3.6.1.4.1.311.20.2.3": if (asn.Tag == (Byte)Asn1Type.UTF8String) { SB.Append("User Principal Name (OID=1.3.6.1.4.1.311.20.2.3): " + Asn1Utils.DecodeUTF8String(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // szOID_NTDS_REPLICATION case "1.3.6.1.4.1.311.25.1": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("NTDS Replication GUID (OID=1.3.6.1.4.1.311.25.1): " + new Guid(asn.GetPayload())); if (multiLine) { SB.Append(Environment.NewLine); } } break; #region PropIDs // CERT_SHA1_HASH_PROP_ID case "1.3.6.1.4.1.311.10.11.3": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("SHA1 hash (OID=1.3.6.1.4.1.311.10.11.3): " + Asn1Utils.DecodeOctetString(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // CERT_MD5_HASH_PROP_ID case "1.3.6.1.4.1.311.10.11.4": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("SHA1 hash (OID=1.3.6.1.4.1.311.10.11.4): " + Asn1Utils.DecodeOctetString(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // CERT_ENHKEY_USAGE_PROP_ID case "1.3.6.1.4.1.311.10.11.9": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { asn.MoveNext(); asn.MoveNext(); SB.Append("Enhanced Key Usages (OID=1.3.6.1.4.1.311.10.11.9): "); if (multiLine) { SB.Append(Environment.NewLine + " "); } do { if (Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()).FriendlyName != null) { SB.Append(Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()).Value + " (" + Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()).FriendlyName + ") "); } else { SB.Append(Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()).Value); } if (multiLine) { SB.Append(Environment.NewLine + " "); } else { SB.Append(", "); } } while (asn.MoveNext()); } break; // CERT_FRIENDLY_NAME_PROP_ID case "1.3.6.1.4.1.311.10.11.11": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("Friendly name (OID=1.3.6.1.4.1.311.10.11.11): " + Encoding.Unicode.GetString(asn.GetPayload())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // CERT_KEY_IDENTIFIER_PROP_ID case "1.3.6.1.4.1.311.10.11.20": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("Subject Key Identifier (OID=1.3.6.1.4.1.311.10.11.20): " + Asn1Utils.DecodeOctetString(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; // CERT_SUBJECT_NAME_MD5_HASH_PROP_ID case "1.3.6.1.4.1.311.10.11.29": if (asn.Tag == (Byte)Asn1Type.OCTET_STRING) { SB.Append("Subject name MD5 hash (OID=1.3.6.1.4.1.311.10.11.29): " + Asn1Utils.DecodeOctetString(asn.GetTagRawData())); if (multiLine) { SB.Append(Environment.NewLine); } } break; #endregion default: SB.Append("Unknown attribute (OID=" + Oid.Value); if (!String.IsNullOrEmpty(Oid.FriendlyName)) { SB.Append(" (" + Oid.FriendlyName + ")"); } SB.Append("): "); if (multiLine) { String tempString = AsnFormatter.BinaryToString(RawData, EncodingType.HexAsciiAddress); SB.Append(tempString.Replace("\r\n", "\r\n ") + Environment.NewLine); SB.Append(Environment.NewLine); } else { SB.Append(AsnFormatter.BinaryToString(RawData) + Environment.NewLine); } break; } return(SB.ToString()); } return(base.Format(multiLine)); }
void m_decode(Byte[] rawData) { try { Type = X509CrlType.BaseCrl; var signedInfo = new SignedContentBlob(rawData, ContentBlobType.SignedBlob); // signature and alg signature = signedInfo.Signature.Value; sigUnused = signedInfo.Signature.UnusedBits; SignatureAlgorithm = signedInfo.SignatureAlgorithm.AlgorithmId; // tbs Asn1Reader asn = new Asn1Reader(signedInfo.ToBeSignedData); if (!asn.MoveNext()) { throw new Asn1InvalidTagException(); } // version if (asn.Tag == (Byte)Asn1Type.INTEGER) { Version = (Int32)Asn1Utils.DecodeInteger(asn.GetTagRawData()) + 1; asn.MoveNextCurrentLevel(); } else { Version = 1; } // hash algorithm var h = new AlgorithmIdentifier(asn.GetTagRawData()); if (h.AlgorithmId.Value != SignatureAlgorithm.Value) { throw new CryptographicException("Algorithm mismatch."); } if (!asn.MoveNextCurrentLevel()) { throw new Asn1InvalidTagException(); } // issuer IssuerName = new X500DistinguishedName(asn.GetTagRawData()); // NextUpdate, RevokedCerts and Extensions are optional. Ref: RFC5280, p.118 if (!asn.MoveNextCurrentLevel()) { throw new Asn1InvalidTagException(); } switch (asn.Tag) { case (Byte)Asn1Type.UTCTime: ThisUpdate = Asn1Utils.DecodeUTCTime(asn.GetTagRawData()); break; case (Byte)Asn1Type.Generalizedtime: ThisUpdate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); break; default: throw new Asn1InvalidTagException(); } if (!asn.MoveNextCurrentLevel()) { return; } switch (asn.Tag) { case (Byte)Asn1Type.UTCTime: case (Byte)Asn1Type.Generalizedtime: switch (asn.Tag) { case (Byte)Asn1Type.UTCTime: NextUpdate = Asn1Utils.DecodeUTCTime(asn.GetTagRawData()); break; case (Byte)Asn1Type.Generalizedtime: NextUpdate = Asn1Utils.DecodeGeneralizedTime(asn.GetTagRawData()); break; default: throw new Asn1InvalidTagException(); } if (!asn.MoveNextCurrentLevel()) { return; } if (asn.Tag == 48) { getRevCerts(asn); if (!asn.MoveNextCurrentLevel()) { return; } getExts(asn); } else { getExts(asn); } break; case 48: if (asn.Tag == 48) { getRevCerts(asn); if (!asn.MoveNextCurrentLevel()) { return; } getExts(asn); } else { getExts(asn); } break; default: getExts(asn); break; } } catch (Exception e) { throw new CryptographicException("Cannot find the requested object.", e); } }
void decodeVersion(Wincrypt.CRYPTOAPI_BLOB blob) { Byte[] rawData = new Byte[blob.cbData]; Marshal.Copy(blob.pbData, rawData, 0, (Int32)blob.cbData); Version = (Int32)Asn1Utils.DecodeInteger(rawData); }
void getVersion(Asn1Reader asn) { asn.MoveNextAndExpectTags((Byte)Asn1Type.INTEGER); Version = (Int32)(Asn1Utils.DecodeInteger(asn.GetTagRawData()) + 1); }