void getPublickey() { Oid keyoid = new Oid(reqData.SubjectPublicKeyInfo.Algorithm.pszObjId); pubKeyUnused = reqData.SubjectPublicKeyInfo.PublicKey.cUnusedBits; Byte[] param = new Byte[reqData.SubjectPublicKeyInfo.Algorithm.Parameters.cbData]; Marshal.Copy(reqData.SubjectPublicKeyInfo.Algorithm.Parameters.pbData, param, 0, (Int32)reqData.SubjectPublicKeyInfo.Algorithm.Parameters.cbData); Oid paramOid = keyoid.Value == "1.2.840.10045.2.1" ? Asn1Utils.DecodeObjectIdentifier(param) : new Oid("1.2.840.113549.1.1.1"); AsnEncodedData asnpara = new AsnEncodedData(paramOid, param); Byte[] key = new Byte[reqData.SubjectPublicKeyInfo.PublicKey.cbData]; Marshal.Copy(reqData.SubjectPublicKeyInfo.PublicKey.pbData, key, 0, (Int32)reqData.SubjectPublicKeyInfo.PublicKey.cbData); AsnEncodedData asnkey = new AsnEncodedData(keyoid, key); PublicKey = new PublicKey(keyoid, asnpara, asnkey); curve = PublicKey.EncodedParameters.Oid; if (PublicKey.Oid.Value == "1.2.840.10045.2.1") { getPublicKeyLength(asnpara.Oid.Value); } else { pubKeyLength = PublicKey.Key.KeySize; } }
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(); }
static ECDsaCng bindPublicKey(PublicKey pubKey) { List <Byte> header = new List <Byte>(); // headers from bcrypt.h switch (Asn1Utils.DecodeObjectIdentifier(pubKey.EncodedParameters.RawData).Value) { // ECDH_P256/ECDSA_P256 case "1.2.840.10045.3.1.7": header.AddRange(new Byte[] { 69, 67, 83, 49, 32, 0, 0, 0 }); break; // ECDH_P384/ECDSA_P384 case "1.3.132.0.34": header.AddRange(new Byte[] { 69, 67, 83, 51, 48, 0, 0, 0 }); break; // ECDH_P521/ECDSA_P251 case "1.3.132.0.35": header.AddRange(new Byte[] { 69, 67, 83, 53, 66, 0, 0, 0 }); break; default: throw new CryptographicException("Specified ellyptic curve is not supported."); } header.AddRange(pubKey.EncodedKeyValue.RawData.Skip(1)); CngKey cngKey = CngKey.Import(header.ToArray(), CngKeyBlobFormat.GenericPublicBlob); return(new ECDsaCng(cngKey)); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNextAndExpectTags((Byte)Asn1Type.OBJECT_IDENTIFIER); Oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); asn.MoveNext(); Asn1Type[] types = { Asn1Type.IA5String, Asn1Type.PrintableString, Asn1Type.VisibleString, Asn1Type.UTF8String, Asn1Type.UniversalString, Asn1Type.BMPString, Asn1Type.TeletexString }; encodingTag = (Asn1Type)asn.Tag; Value = Asn1Utils.DecodeAnyString(asn.GetTagRawData(), types); RawData = rawData; }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } if (!asn.MoveNext()) { throw new Asn1InvalidTagException(asn.Offset); } if (asn.Tag != (Byte)Asn1Type.OBJECT_IDENTIFIER) { throw new Asn1InvalidTagException(asn.Offset); } AlgorithmId = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); //Oid2 oid2 = new Oid2(oid.Value, OidGroupEnum.SignatureAlgorithm, false); //AlgorithmId = String.IsNullOrEmpty(oid2.Value) // ? oid // : new Oid(oid2.Value, oid2.FriendlyName); Parameters = asn.MoveNext() ? asn.GetTagRawData() : Asn1Utils.EncodeNull(); RawData = rawData; }
// decoders void decodeOtherName() { try { Asn1Reader asn = new Asn1Reader(rawData); if (!asn.MoveNext()) { throw new ArgumentException("Input data is not valid OtherName."); } Oid oid = new Oid(Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData())); asn.MoveNextAndExpectTags(0xa0); asn.MoveNext(); OID = oid; switch (oid.Value) { // UPN case "1.3.6.1.4.1.311.20.2.3": Type = X509AlternativeNamesEnum.UserPrincipalName; if (asn.PayloadLength == 0) { return; } Value = Encoding.UTF8.GetString(asn.GetPayload()); break; // GUID case "1.3.6.1.4.1.311.25.1": if (asn.PayloadLength == 0) { return; } Guid guid = new Guid(asn.GetPayload()); Type = X509AlternativeNamesEnum.Guid; Value = guid.ToString(); break; default: Value = String.Empty; Type = X509AlternativeNamesEnum.OtherName; foreach (Byte B in asn.GetPayload()) { Value += $"{B:x2}" + " "; } Value = Value.Trim(); break; } } catch { throw new ArgumentException("Input data is not valid OtherName."); } }
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) { 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(); }
static void readEcdsaHeader(List <Byte> blob, PublicKey publicKey) { /* * typedef struct _BCRYPT_ECCKEY_BLOB { * ULONG Magic; * ULONG cbKey; * } BBCRYPT_ECCKEY_BLOB, *PBCRYPT_ECCKEY_BLOB; -- public key only */ // headers from bcrypt.h switch (Asn1Utils.DecodeObjectIdentifier(publicKey.EncodedParameters.RawData).Value) { // P256 case "1.2.840.10045.3.1.7": blob.AddRange(BitConverter.GetBytes(ECDSA_P256_MAGIC)); blob.AddRange(BitConverter.GetBytes(256 / 8)); break; // P384 case "1.3.132.0.34": blob.AddRange(BitConverter.GetBytes(ECDSA_P384_MAGIC)); blob.AddRange(BitConverter.GetBytes(384 / 8)); break; // P521 case "1.3.132.0.35": blob.AddRange(BitConverter.GetBytes(ECDSA_P521_MAGIC)); blob.AddRange(BitConverter.GetBytes(528 / 8)); break; default: throw new CryptographicException("Specified elliptic curve is not supported."); } // skip first byte, it is always 0X04 for ECDSA public key blob.AddRange(publicKey.EncodedKeyValue.RawData.Skip(1)); }
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 decodeRegisteredId() { Type = X509AlternativeNamesEnum.RegisteredId; try { Asn1Reader asn = new Asn1Reader(RawData); Oid oid = Asn1Utils.DecodeObjectIdentifier(Asn1Utils.Encode(asn.GetPayload(), (Byte)Asn1Type.OBJECT_IDENTIFIER)); Value = oid.Value; } catch { throw new ArgumentException("Input data is not valid registered ID."); } }
void m_decode(Byte[] asnData) { Asn1Reader asn = new Asn1Reader(asnData); asn.MoveNext(); IssuerDomainOid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); asn.MoveNext(); SubjectDomainOid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); }
void getConfiguration(Byte[] algIdBlob) { var asn = new Asn1Reader(algIdBlob); asn.MoveNext(); var oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); asn.MoveNext(); mapSignatureAlgorithmToHashAlgorithm(oid.Value, asn); }
void decodeResponseType(Byte[] raw) { Oid oid = Asn1Utils.DecodeObjectIdentifier(raw); switch (oid.Value) { case "1.3.6.1.5.5.7.48.1.1": ResponseType = OCSPResponseType.id_pkix_ocsp_basic; break; case "1.3.6.1.5.5.7.48.1.4": ResponseType = OCSPResponseType.id_pkix_ocsp_response; break; } }
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 m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNextAndExpectTags((Byte)Asn1Type.OBJECT_IDENTIFIER); AlgorithmId = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); Parameters = asn.MoveNext() ? asn.GetTagRawData() : null; RawData = rawData; }
void m_decode(Byte[] raw) { PolicyQualifiers = new X509PolicyQualifierCollection(); Asn1Reader asn = new Asn1Reader(raw); if (asn.Tag != 48) { throw new InvalidDataException("The data is invalid."); } asn.MoveNext(); PolicyOid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); if (asn.MoveNext()) { PolicyQualifiers.Decode(asn.GetTagRawData()); } }
void decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Asn1InvalidTagException(asn.Offset); } asn.MoveNextAndExpectTags((Byte)Asn1Type.OBJECT_IDENTIFIER); algId = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); if (asn.MoveNext()) { param = asn.GetTagRawData(); } _rawData.AddRange(rawData); }
void m_decode(Byte[] rawData) { Asn1Reader asn = new Asn1Reader(rawData); if (asn.Tag != 48) { throw new Exception(); } asn.MoveNext(); if (asn.Tag != 6) { throw new Exception(); } Oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); asn.MoveNext(); Value = Asn1Utils.DecodeAnyString(asn.GetTagRawData(), null); RawData = rawData; }
/// <summary> /// Decodes ASN.1-encoded attribute (with envelope) to an instance of <strong>X509Attribute</strong> class. /// </summary> /// <param name="rawData">ASN.1-encoded attribute full data.</param> /// <exception cref="ArgumentNullException"><strong>rawData</strong> parameter is null.</exception> /// <exception cref="Asn1InvalidTagException">Invalid tag identifier occured.</exception> /// <returns>Instance of <strong>X509Attribute</strong> class</returns> public static X509Attribute Decode(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(); Oid oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData()); asn.MoveNextAndExpectTags(0x31); return(new X509Attribute(oid, asn.GetPayload())); }
// non-default, some platforms may not support all of them public static PublicKey FromRawData(Byte[] rawData) { if (rawData == null) { throw new ArgumentNullException(nameof(rawData)); } Asn1Reader asn = new Asn1Reader(rawData); asn.MoveNext(); Asn1Reader pubKeyOidIdReader = new Asn1Reader(asn.GetTagRawData()); pubKeyOidIdReader.MoveNext(); Oid pubKeyOid = Asn1Utils.DecodeObjectIdentifier(pubKeyOidIdReader.GetTagRawData()); pubKeyOidIdReader.MoveNext(); AsnEncodedData encodedParams = new AsnEncodedData(pubKeyOid, pubKeyOidIdReader.GetTagRawData()); asn.MoveNextCurrentLevel(); AsnEncodedData encodedKey = new AsnEncodedData(pubKeyOid, new Asn1BitString(asn.GetTagRawData()).Value.ToArray()); return(new PublicKey(pubKeyOid, encodedParams, encodedKey)); }
/// <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)); }