void m_decode(Byte[] rawData)
        {
            Asn1Reader asn = new Asn1Reader(rawData);

            if (asn.Tag != 48)
            {
                throw new Asn1InvalidTagException(asn.Offset);
            }
            asn.MoveNext();
            IncludedComponents = AuthorityKeyIdentifierFlags.None;
            do
            {
                switch (asn.Tag)
                {
                case 0x80:
                    KeyIdentifier       = AsnFormatter.BinaryToString(asn.GetPayload(), EncodingType.HexRaw, EncodingFormat.NOCRLF);
                    IncludedComponents |= AuthorityKeyIdentifierFlags.KeyIdentifier;
                    break;

                case 0xa1:
                    IssuerNames = new X509AlternativeNameCollection();
                    var bytes = Asn1Utils.Encode(asn.GetPayload(), 48);
                    IssuerNames.Decode(bytes);
                    IssuerNames.Close();
                    IncludedComponents |= AuthorityKeyIdentifierFlags.AlternativeNames;
                    break;

                case 0x82:
                    SerialNumber        = AsnFormatter.BinaryToString(asn.GetPayload());
                    IncludedComponents |= AuthorityKeyIdentifierFlags.SerialNumber;
                    break;
                }
            } while (asn.MoveNextCurrentLevel());
        }
        void initializeAsn1(Byte[] bytes)
        {
            switch (PropertyName)
            {
            case X509CertificatePropertyType.EnhancedKeyUsage:
                UnderlyingType = typeof(X509EnhancedKeyUsageExtension);
                AsnEncodedData asn = new AsnEncodedData(bytes);
                PropertyValue = new X509EnhancedKeyUsageExtension(asn, false);
                break;

            case X509CertificatePropertyType.RootProgramCertificatePolicies:
                UnderlyingType = typeof(X509CertificatePoliciesExtension);
                PropertyValue  = new X509CertificatePoliciesExtension(bytes, false);
                break;

            case X509CertificatePropertyType.OcspResponse:
                UnderlyingType = typeof(OCSPResponse);
                PropertyValue  = new OCSPResponse(bytes);
                break;

            case X509CertificatePropertyType.CrossCertificateDistributionPoints:
            case X509CertificatePropertyType.CTLNextUpdateLocation:
                UnderlyingType = typeof(X509AlternativeNameCollection);
                PropertyValue  = new X509AlternativeNameCollection();
                ((X509AlternativeNameCollection)PropertyValue).Decode(bytes);
                ((X509AlternativeNameCollection)PropertyValue).Close();
                break;
            }
        }
        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();
        }
 /// <summary>
 /// Intitializes a new instance of <strong>X509NameConstraintsExtension</strong> class from
 /// a collection of explicitly permitted and excluded subtrees. Name Constraints extension is
 /// always marked critical.
 /// </summary>
 /// <exception cref="ArgumentException">
 /// <strong>permittedSubtree</strong> and <strong>excludedSubtree</strong> parameters are null;
 /// </exception>
 /// <param name="permittedSubtree">A collection of explicitly permitted names and name patterns.</param>
 /// <param name="excludedSubtree">A collection of explicitly disallowed names and name patterns.</param>
 /// <remarks>Each subtree alone is optional. However, at least one subtree must be provided.</remarks>
 public X509NameConstraintsExtension(X509AlternativeNameCollection permittedSubtree, X509AlternativeNameCollection excludedSubtree)
 {
     if (permittedSubtree == null && excludedSubtree == null)
     {
         throw new ArgumentException("Both, 'permittedSubtree' and 'excludedSubtree' cannot be null.");
     }
     m_initialize(permittedSubtree, excludedSubtree);
 }
Пример #5
0
 /// <summary>
 ///		Initializes a new instance of the <strong>X509SubjectAlternativeNamesExtension</strong> class using a
 ///		collection of alternative names and a value that identifies whether the extension is critical.
 /// </summary>
 /// <param name="altNames">A collection of alternative name objects.</param>
 /// <param name="critical">
 ///		<strong>True</strong> if the extension is critical; otherwise, <strong>False</strong>.
 /// </param>
 public X509SubjectAlternativeNamesExtension(X509AlternativeNameCollection altNames, Boolean critical)
 {
     if (altNames.Count == 0)
     {
         throw new ArgumentException("Empty arrays are not supported.");
     }
     m_initizlize(altNames, critical);
 }
        static X509AlternativeNameCollection decodeNamesFromAsn(Byte[] rawData)
        {
            X509AlternativeNameCollection altNames = new X509AlternativeNameCollection();
            Asn1Reader asn = new Asn1Reader(rawData);

            asn.MoveNext();
            do
            {
                altNames.Add(new X509AlternativeName(asn.GetPayload()));
            } while (asn.MoveNextCurrentLevel());
            altNames.Close();
            return(altNames);
        }
Пример #7
0
        void m_encode(Uri[] uris)
        {
            X509AlternativeNameCollection altnames = new X509AlternativeNameCollection();

            foreach (Uri uri in uris)
            {
                altnames.Add(new X509AlternativeName(X509AlternativeNamesEnum.URL, uri.AbsoluteUri));
            }
            FullName = altnames;
            Asn1Reader asn = new Asn1Reader(altnames.Encode());

            RawData = Asn1Utils.Encode(asn.GetPayload(), 160);
        }
Пример #8
0
 void m_initizlize(X509AlternativeNameCollection altNames, Boolean critical)
 {
     foreach (X509AlternativeName altName in altNames)
     {
         if (String.IsNullOrEmpty(altName.Value))
         {
             throw new ArgumentException($"Empty value for {altName.Type} is not allowed.");
         }
     }
     Critical         = critical;
     Oid              = _oid;
     RawData          = altNames.Encode();
     alternativeNames = altNames;
 }
        void m_decode(Byte[] rawData)
        {
            Asn1Reader asn = new Asn1Reader(rawData);

            asn.MoveNext();
            do
            {
                switch (asn.Tag)
                {
                case 0xa0: PermittedSubtree = decodeNamesFromAsn(asn.GetTagRawData()); break;

                case 0xa1: ExcludedSubtree = decodeNamesFromAsn(asn.GetTagRawData()); break;
                }
            } while (asn.MoveNextCurrentLevel());
        }
        static X509AlternativeNameCollection encodeAltNames(X509AlternativeNameCollection permittedSubtree, List <Byte> rawData, Byte tag)
        {
            X509AlternativeNameCollection altNames = new X509AlternativeNameCollection();
            List <Byte> tempRawData = new List <Byte>();

            foreach (X509AlternativeName name in permittedSubtree
                     .Where(x => x.Type != X509AlternativeNamesEnum.RegisteredId))
            {
                altNames.Add(name);
                tempRawData.AddRange(Asn1Utils.Encode(name.RawData, 48));
            }
            rawData.AddRange(Asn1Utils.Encode(tempRawData.ToArray(), tag));
            altNames.Close();
            return(altNames);
        }
        void m_initialize(X509AlternativeNameCollection permittedSubtree, X509AlternativeNameCollection excludedSubtree)
        {
            Oid      = _oid;
            Critical = true;

            List <Byte> rawData = new List <Byte>();

            if (permittedSubtree != null)
            {
                PermittedSubtree = encodeAltNames(permittedSubtree, rawData, 0xa0);
            }
            if (excludedSubtree != null)
            {
                ExcludedSubtree = encodeAltNames(excludedSubtree, rawData, 0xa1);
            }
            RawData = Asn1Utils.Encode(rawData.ToArray(), 48);
        }
        void m_initialize(IEnumerable <String> urls, Int32?syncDeltaTime, Boolean critical)
        {
            Oid      = _oid;
            Critical = critical;
            DeltaSyncTimeInSeconds = syncDeltaTime;

            List <Byte> rawData = new List <Byte>();

            if (DeltaSyncTimeInSeconds != null)
            {
                rawData.AddRange(new Asn1Integer(DeltaSyncTimeInSeconds.Value).RawData);
            }
            Uri[] uris = urls.Select(url => new Uri(url)).ToArray();
            CrossCertDistributionPoints = new X509AlternativeNameCollection();
            foreach (Uri url in uris)
            {
                CrossCertDistributionPoints.Add(new X509AlternativeName(X509AlternativeNamesEnum.URL, url));
            }
            CrossCertDistributionPoints.Close();
            rawData.AddRange(Asn1Utils.Encode(CrossCertDistributionPoints.Encode(), 48));
            RawData = rawData.ToArray();
        }
Пример #13
0
        void m_decode(Byte[] rawData)
        {
            Asn1Reader asn = new Asn1Reader(rawData);

            asn.MoveNext();
            if (asn.PayloadLength == 0)
            {
                return;
            }
            do
            {
                Byte[] altNames;
                switch (asn.Tag)
                {
                case 0xA0:
                    Asn1Reader distName = new Asn1Reader(asn.GetPayload());
                    do
                    {
                        switch (distName.Tag)
                        {
                        case 0xA0:
                            // full name
                            altNames = Asn1Utils.Encode(distName.GetPayload(), 48);
                            FullName = new X509AlternativeNameCollection();
                            FullName.Decode(altNames);
                            break;

                        case 0xA1:
                            // relative to issuer name
                            Byte[] relativeName = Asn1Utils.Encode(distName.GetPayload(), 48);
                            RelativeToIssuerName = new X500DistinguishedName(relativeName);
                            break;

                        default:
                            throw new InvalidDataException("The data is invalid");
                        }
                    } while (distName.MoveNextCurrentLevel());
                    break;

                case 0xA1:
                    // reasons
                    Asn1BitString bs = new Asn1BitString(asn.GetPayload());
                    if (bs.Value[0] == 0)
                    {
                        Reasons = X509RevocationReasons.Unspecified;
                        break;
                    }
                    Byte mask = 1;
                    do
                    {
                        if ((bs.Value[0] & mask) > 0)
                        {
                            switch (mask)
                            {
                            case 1: Reasons += (Int32)X509RevocationReasons.AACompromise; break;

                            case 2: Reasons += (Int32)X509RevocationReasons.PrivilegeWithdrawn; break;

                            case 4: Reasons += (Int32)X509RevocationReasons.CertificateHold; break;

                            case 8: Reasons += (Int32)X509RevocationReasons.CeaseOfOperation; break;

                            case 16: Reasons += (Int32)X509RevocationReasons.Superseded; break;

                            case 32: Reasons += (Int32)X509RevocationReasons.ChangeOfAffiliation; break;

                            case 64: Reasons += (Int32)X509RevocationReasons.CACompromise; break;

                            case 128: Reasons += (Int32)X509RevocationReasons.KeyCompromise; break;
                            }
                        }
                        mask <<= 1;
                    } while (mask != 128);
                    break;

                case 0xA2:
                    // crl issuer
                    altNames  = Asn1Utils.Encode(asn.GetPayload(), 48);
                    CRLIssuer = new X509AlternativeNameCollection();
                    CRLIssuer.Decode(altNames);
                    break;

                default:
                    throw new InvalidDataException("The data is invalid.");
                }
            } while (asn.MoveNextCurrentLevel());
            RawData = rawData;
        }
Пример #14
0
 internal X509AlternativeNameCollectionEnumerator(X509AlternativeNameCollection entries)
 {
     _entries  = entries;
     m_current = -1;
 }