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();
        }
示例#3
0
        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));
        }
示例#4
0
        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;
        }
示例#5
0
        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());
        }
示例#8
0
        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();
        }
示例#9
0
        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));
        }
示例#10
0
		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());
		}
示例#11
0
 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."); }
 }
示例#12
0
        void m_decode(Byte[] asnData)
        {
            Asn1Reader asn = new Asn1Reader(asnData);

            asn.MoveNext();
            IssuerDomainOid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData());
            asn.MoveNext();
            SubjectDomainOid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData());
        }
示例#13
0
        void getConfiguration(Byte[] algIdBlob)
        {
            var asn = new Asn1Reader(algIdBlob);

            asn.MoveNext();
            var oid = Asn1Utils.DecodeObjectIdentifier(asn.GetTagRawData());

            asn.MoveNext();
            mapSignatureAlgorithmToHashAlgorithm(oid.Value, asn);
        }
示例#14
0
        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;
            }
        }
示例#15
0
        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;
            }
        }
示例#16
0
        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;
        }
示例#17
0
        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());
            }
        }
示例#18
0
        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);
        }
示例#19
0
        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;
        }
示例#20
0
        /// <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()));
        }
示例#21
0
        // 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));
        }
示例#22
0
        /// <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));
        }