예제 #1
0
 // 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."); }
 }
예제 #2
0
        /// <summary>
        /// Encodes current object to a ASN.1-encoded byte array.
        /// </summary>
        /// <returns>ASN.1-encoded byte array.</returns>
        /// <remarks>
        /// Explicit notice text is always encoded as a <strong>BMPString</strong>.
        /// <para>Notice reference is encoded in the following sequence: attempts to encode a string as a
        /// <strong>VisibleString</strong> and then as a <strong>BMPString</strong> if <strong>VisibleString</strong> fails.</para>
        /// </remarks>
        public Byte[] Encode()
        {
            switch (Type)
            {
            case X509PolicyQualifierType.CpsUrl:
                if (String.IsNullOrEmpty(PolicyUrl.AbsoluteUri))
                {
                    throw new UninitializedObjectException();
                }
                List <Byte> rawData = new List <Byte>();
                rawData.AddRange(Asn1Utils.EncodeObjectIdentifier(new Oid("1.3.6.1.5.5.7.2.1")));
                rawData.AddRange(Asn1Utils.EncodeIA5String(PolicyUrl.AbsoluteUri));
                return(Asn1Utils.Encode(rawData.ToArray(), 48));

            case X509PolicyQualifierType.UserNotice:
                List <Byte> refpart = new List <Byte>();
                if (!String.IsNullOrEmpty(NoticeReference))
                {
                    refpart.AddRange(EncodeString(NoticeReference));
                    refpart.AddRange(Asn1Utils.Encode(new Asn1Integer(NoticeNumber).RawData, 48));
                    refpart = new List <Byte>(Asn1Utils.Encode(refpart.ToArray(), 48));
                }
                if (!String.IsNullOrEmpty(NoticeText))
                {
                    refpart.AddRange(Asn1Utils.EncodeBMPString(NoticeText));
                }
                List <Byte> oid = new List <Byte>();
                oid.AddRange(Asn1Utils.EncodeObjectIdentifier(new Oid("1.3.6.1.5.5.7.2.2")));
                oid.AddRange(Asn1Utils.Encode(refpart.ToArray(), 48));
                return(Asn1Utils.Encode(oid.ToArray(), 48));

            default: throw new UninitializedObjectException();
            }
        }
        X509Certificate2 build(X509Certificate2 signer)
        {
            MessageSigner signerInfo = signer == null
                ? new MessageSigner(PrivateKeyInfo, HashingAlgorithm)
                : new MessageSigner(signer, HashingAlgorithm);

            signerInfo.PaddingScheme = AlternateSignatureFormat
                ? SignaturePadding.PSS
                : SignaturePadding.PKCS1;
            // initialize from v3 version
            var rawData = new List <Byte>(_versionBytes);

            // serial number
            rawData.AddRange(Asn1Utils.Encode(serialNumber, (Byte)Asn1Type.INTEGER));
            // algorithm identifier
            rawData.AddRange(signerInfo.GetAlgorithmIdentifier(AlternateSignatureFormat).RawData);
            // issuer
            rawData.AddRange(signer == null
                ? SubjectName.RawData
                : signer.SubjectName.RawData);
            // NotBefore and NotAfter
            List <Byte> date = Asn1Utils.EncodeDateTime(NotBefore).ToList();

            date.AddRange(Asn1Utils.EncodeDateTime(NotAfter));
            rawData.AddRange(Asn1Utils.Encode(date.ToArray(), 48));
            // subject
            rawData.AddRange(SubjectName.RawData);
            rawData.AddRange(PrivateKeyInfo.GetPublicKey().Encode());
            rawData.AddRange(Asn1Utils.Encode(finalExtensions.Encode(), 0xa3));
            var blob = new SignedContentBlob(Asn1Utils.Encode(rawData.ToArray(), 48), ContentBlobType.ToBeSignedBlob);

            blob.Sign(signerInfo);
            return(new X509Certificate2(blob.Encode()));
        }
예제 #4
0
        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());
        }
예제 #5
0
        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);
        }
예제 #6
0
        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;
        }
예제 #7
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;
        }
예제 #8
0
        public static void Main()
        {
            byte[] dataBytes = new byte[] { 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x32, 0x30, 0x34, 0x32, 0x37, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x32, 0x30, 0x34, 0x32, 0x35, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A };
            Asn1Logger.LogByteArray("Input Byte Array: ", dataBytes);

            Asn1Data asn1Data = Asn1Parser.ParseFromRawData(dataBytes);

            bool isMovedNext = Asn1Parser.MoveNext(asn1Data);

            if (isMovedNext)
            {
                byte[] notBeforeByte = Asn1Utils.DecodeDateTime(asn1Data);
                Asn1Logger.LogByteArray("Validity-NotBefore: ", notBeforeByte);
                isMovedNext = Asn1Parser.MoveNext(asn1Data);
                if (isMovedNext)
                {
                    byte[] notAfterByte = Asn1Utils.DecodeDateTime(asn1Data);
                    Asn1Logger.LogByteArray("Validity-NotAfter: ", notAfterByte);
                }
                else
                {
                    Logger.writeLog("ERROR-Can not move to EndDate");
                }
            }
            else
            {
                Logger.writeLog("ERROR-Can not move to StartDate");
            }
        }
예제 #9
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;
        }
예제 #10
0
        void encode()
        {
            var rawData = new List <Byte>(IssuerName.RawData);

            rawData.AddRange(Asn1Utils.Encode(AsnFormatter.StringToBinary(SerialNumber, EncodingType.HexRaw), (Byte)Asn1Type.INTEGER));
            _rawData.AddRange(Asn1Utils.Encode(rawData.ToArray(), 48));
        }
예제 #11
0
        /// <summary>
        /// Initializes a new instance of the Oid2 class using the specified Oid friendly name or value, OID registration group and search conditions.
        /// </summary>
        /// <param name="oid">Specifies the object identifier friendly name or value to search.</param>
        /// <param name="group">Specifies the OID registration group to search.</param>
        /// <param name="searchInDirectory">Specifies whether to search for an object identifier in Active Directory. If the machine is not
        /// domain-joined, an OID is searched by using local registration information.</param>
        public Oid2(String oid, OidGroupEnum group, Boolean searchInDirectory)
        {
            var flatOid = new Oid(oid);

            try {
                // try to validate if input OID contains OID value instead of friendly name
                Asn1Utils.EncodeObjectIdentifier(flatOid);
                oid       = flatOid.Value;
                _searchBy = "ByValue";
            } catch {
                _searchBy = "ByName";
            }

            if (Environment.OSVersion.Version.Major >= 6)
            {
                _cng = true;
            }
            if (searchInDirectory)
            {
                if (DsUtils.Ping())
                {
                    initializeDS(oid, group);
                }
                else
                {
                    initializeLocal(oid, group);
                }
            }
            else
            {
                initializeLocal(oid, group);
            }
        }
        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 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());
        }
예제 #14
0
        public static void Main()
        {
            byte[]   dataBytes = new byte[] { 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x32, 0x30, 0x34, 0x32, 0x37, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x32, 0x30, 0x34, 0x32, 0x35, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A };
            Asn1Data asn1Data  = Asn1Parser.ParseFromRawData(dataBytes);

            Asn1Logger.LogCurrentNodeValues(asn1Data, "Validity");

            bool isMovedNext = Asn1Parser.MoveNext(asn1Data);

            if (isMovedNext)
            {
                byte[] notBeforeByte = Asn1Utils.DecodeDateTime(asn1Data);
                Asn1Logger.LogCurrentNodeValues(asn1Data, "StartDate");
                isMovedNext = Asn1Parser.MoveNext(asn1Data);
                if (isMovedNext)
                {
                    Asn1Logger.LogCurrentNodeValues(asn1Data, "EndDate");
                }
                else
                {
                    Logger.writeLog("ERROR-Can not move to EndDate");
                }
            }
            else
            {
                Logger.writeLog("ERROR-Can not move to StartDate");
            }
        }
예제 #15
0
        void encodeRegisteredId(Object value)
        {
            if (value == null)
            {
                RawData = new Byte[] { 136, 0 };
            }
            else
            {
                Asn1Reader asn;
                switch (value.GetType().FullName)
                {
                case "System.String":
                    Value = (String)value;
                    Oid oid = new Oid((String)value);
                    asn   = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier(oid));
                    Value = oid.Value;
                    break;

                case "System.Security.Oid":
                    asn   = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier((Oid)value));
                    Value = ((Oid)value).Value;
                    break;

                case "System.Security.Oid2":
                    asn   = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier(new Oid(((Oid2)value).Value)));
                    Value = ((Oid2)value).Value;
                    break;

                default: throw new ArgumentException("The input data is not valid registered ID.");
                }
                RawData = Asn1Utils.Encode(asn.GetPayload(), 136);
            }
        }
예제 #16
0
        void encode()
        {
            List <Byte> rawData = new List <Byte>(IssuerName.RawData);

            rawData.AddRange(Asn1Utils.Encode(AsnFormatter.StringToBinary(SerialNumber, EncodingType.HexRaw), 4));
            RawData = rawData.ToArray();
        }
예제 #17
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));
        }
예제 #18
0
 void encodeDnsName(String value)
 {
     try {
         Value   = value;
         RawData = Asn1Utils.Encode(Encoding.UTF8.GetBytes(Value), 130);
     } catch { throw new ArgumentException("The string is not valid DNS name"); }
 }
예제 #19
0
        void m_encode(Boolean fValue)
        {
            Value = fValue;
            Byte value = (Byte)(fValue ? 255 : 0);

            Initialize(new Asn1Reader(Asn1Utils.Encode(new[] { value }, TAG)));
        }
예제 #20
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));
        }
예제 #21
0
        /// <summary>
        /// Encodes current object to ASN.1-encoded byte array.
        /// </summary>
        /// <returns>ASN.1-encoded byte array.</returns>
        public Byte[] Encode()
        {
            List <Byte> list = new List <Byte>(Asn1Utils.Encode(RawData, 49));

            list.InsertRange(0, Asn1Utils.EncodeObjectIdentifier(Oid));
            return(Asn1Utils.Encode(list.ToArray(), 48));
        }
예제 #22
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();
        }
예제 #23
0
        public static void Main()
        {
            byte[] validityDataBytes = new byte[] { 0x30, 0x1E, 0x17, 0x0D, 0x31, 0x32, 0x30, 0x34, 0x32, 0x37, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x32, 0x30, 0x34, 0x32, 0x35, 0x31, 0x30, 0x33, 0x31, 0x31, 0x38, 0x5A };
            Storage.Put(Storage.CurrentContext, "Validity Data Encoded", validityDataBytes);

            Asn1Data asn1Data = Asn1Parser.ParseFromRawData(validityDataBytes);

            bool isMovedNext = Asn1Parser.MoveNext(asn1Data);

            if (isMovedNext)
            {
                byte[] notBeforeByte = Asn1Utils.DecodeDateTime(asn1Data);
                Storage.Put(Storage.CurrentContext, "notBefore", notBeforeByte);
                isMovedNext = Asn1Parser.MoveNext(asn1Data);
                if (isMovedNext)
                {
                    byte [] notAfterByte = Asn1Utils.DecodeDateTime(asn1Data);
                    Storage.Put(Storage.CurrentContext, "notAfter", notAfterByte);
                }
                else
                {
                    Logger.writeLog("ERROR-Can not move to EndDate");
                }
            }
            else
            {
                Logger.writeLog("ERROR-Can not move to StartDate");
            }
        }
예제 #24
0
        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;
        }
예제 #25
0
        void m_encode(Boolean fValue)
        {
            Value = fValue;
            var value = fValue ? 255 : 0;

            Initialize(new Asn1Reader(Asn1Utils.Encode(new Byte[value], TAG)));
        }
예제 #26
0
 void encodeDirectoryName(Object value)
 {
     if (value == null)
     {
         RawData = new Byte[] { 164, 2, 48, 0 };
     }
     else
     {
         X500DistinguishedName name;
         if (value as String != null)
         {
             try {
                 name = new X500DistinguishedName((String)value);
             } catch { throw new ArgumentException("The string is not valid X.500 name."); }
         }
         else
         {
             try {
                 name = new X500DistinguishedName((X500DistinguishedName)value);
             } catch { throw new ArgumentException("The string is not valid X500DistinguishedName object."); }
         }
         Value   = name.Name;
         RawData = Asn1Utils.Encode(name.RawData, 164);
     }
 }
예제 #27
0
        void m_initialize(Oid oid, Int32 majorVersion, Int32 minorVersion)
        {
            Oid = _eoid;
            Asn1Utils.EncodeObjectIdentifier(oid);
            Wincrypt.CERT_TEMPLATE_EXT pvStructInfo = new Wincrypt.CERT_TEMPLATE_EXT {
                pszObjId       = oid.Value,
                dwMajorVersion = (UInt32)majorVersion,
                dwMinorVersion = (UInt32)minorVersion,
                fMinorVersion  = true
            };
            UInt32 pcbEncoded = 0;

            if (Crypt32.CryptEncodeObject(1, "1.3.6.1.4.1.311.21.7", ref pvStructInfo, null, ref pcbEncoded))
            {
                RawData = new Byte[pcbEncoded];
                Crypt32.CryptEncodeObject(1, "1.3.6.1.4.1.311.21.7", ref pvStructInfo, RawData, ref pcbEncoded);
                TemplateOid  = new Oid(pvStructInfo.pszObjId);
                MajorVersion = majorVersion;
                MinorVersion = minorVersion;
            }
            else
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
        }
예제 #28
0
 void encodeUrl(Object value)
 {
     if (value == null)
     {
         RawData = new Byte[] { 134, 0 };
     }
     else
     {
         Uri url;
         if (value as String != null)
         {
             try {
                 url = new Uri((String)value);
             } catch { throw new ArgumentException("The string is not valid URL."); }
         }
         else
         {
             try {
                 url = (Uri)value;
             } catch { throw new ArgumentException("The string is not valid Uri object."); }
         }
         Value   = url.AbsoluteUri;
         RawData = Asn1Utils.Encode(Encoding.UTF8.GetBytes(Value), 134);
     }
 }
예제 #29
0
        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());
        }
예제 #30
0
 void encodeRegisteredId(Object value) {
     if (value == null) {
         rawData = new Byte[] { 136, 0 };
     } else {
         Asn1Reader asn;
         switch (value) {
             case String sValue:
                 Value = sValue;
                 Oid oid = new Oid(sValue);
                 asn = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier(oid));
                 Value = oid.Value;
                 break;
             case Oid oid1:
                 asn = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier(oid1));
                 Value = oid1.Value;
                 break;
             case Oid2 oid2:
                 asn = new Asn1Reader(Asn1Utils.EncodeObjectIdentifier(new Oid(oid2.Value)));
                 Value = oid2.Value;
                 break;
             default: throw new ArgumentException("The input data is not valid registered ID.");
         }
         rawData = Asn1Utils.Encode(asn.GetPayload(), 136);
     }
 }