Esempio n. 1
0
        /// <summary>
        /// Constructs the <see cref="CertificateRevocationListSequence"/> from <see cref="RevokedCertificate"/>.
        /// </summary>
        /// <param name="crl">The data use in order to load the sequence</param>
        public CertificateRevocationListSequence(CertificateRevocationList crl) : base(new DerAsnType[0])
        {
            //var container = new List<DerAsnType>();
            var details = new List <DerAsnType>();
            var list    = new List <DerAsnSequence>();

            foreach (var cert in crl.Items)
            {
                var definition     = new List <DerAsnType>();
                var serialNumber   = new DerAsnInteger(BigInteger.Parse(cert.SerialNumber.ToUpper(), NumberStyles.AllowHexSpecifier));
                var revocationDate = new DerAsnUtcTime(cert.RevocationDate);
                var reason         = new DerAsnSequence(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType [] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_CRL_Reason.OidToArray()),
                        new OctetStringSequence(new [] { new DerAsnEnumerated((byte)cert.ReasonCode) })
                    })
                });
                definition.Add(serialNumber);
                definition.Add(revocationDate);
                definition.Add(reason);
                list.Add(new DerAsnSequence(definition.ToArray()));
            }
            details.Add(new DerAsnInteger(new BigInteger(1)));
            details.Add(new DerAsnSequence(new DerAsnType[] {
                new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_sha256RSA.OidToArray()),
                new DerAsnNull()
            }));
            details.Add(new DerAsnSequence(new DerAsnType[] {
                new DerAsnSet(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType[] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_Issuer_C.OidToArray()),
                        new DerAsnPrintableString(crl.Country)
                    })
                }),
                new DerAsnSet(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType[] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_Issuer_O.OidToArray()),
                        new DerAsnPrintableString(crl.Organization)
                    })
                }),
                new DerAsnSet(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType[] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_Issuer_CN.OidToArray()),
                        new DerAsnPrintableString(crl.IssuerCommonName)
                    })
                })
            }));
            details.Add(new DerAsnUtcTime(crl.EffectiveDate));
            details.Add(new DerAsnUtcTime(crl.NextUpdate));
            details.Add(new DerAsnSequence(list.ToArray()));
            details.Add(new ContextSpecificSequence(new DerAsnType[] {
                new DerAsnSequence(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType[] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_AuthorityKey.OidToArray()),
                        new OctetStringSequence(new DerAsnType[] {
                            new DerAsnSequence(new DerAsnType[] {
                                new DerAsnOctetString(new DerAsnIdentifier(DerAsnTagClass.ContextSpecific, DerAsnEncodingType.Primitive, 0x0), crl.AuthorizationKeyId.HexToBytes())
                            })
                        })
                    })
                }),
                new DerAsnSequence(new DerAsnType[] {
                    new DerAsnSequence(new DerAsnType[] {
                        new DerAsnObjectIdentifier(DerAsnIdentifiers.Primitive.ObjectIdentifier, Oid_CRLNumber.OidToArray()),
                        new OctetStringSequence(new DerAsnType[] {
                            new DerAsnInteger(new BigInteger(crl.CrlNumber))
                        })
                    })
                })
            }));
            Value = details.ToArray();
            //container.Add(new DerAsnSequence(details.ToArray()));
            //Value = container.ToArray();
        }
Esempio n. 2
0
        /// <summary>
        /// Deserializes the raw data into the list.
        /// </summary>
        /// <returns>Deserilized contents</returns>
        public CertificateRevocationList Extract()
        {
            var crl       = new CertificateRevocationList();
            var details   = Value[0] as DerAsnSequence;
            var version   = details.Value[0] as DerAsnInteger;
            var algorithm = ((DerAsnSequence)details.Value[1]).Value[0] as DerAsnObjectIdentifier;
            var subject   = ((DerAsnSequence)details.Value[2]).Value.Cast <DerAsnSet>();

            crl.EffectiveDate = ((DerAsnUtcTime)details.Value[3]).Value.DateTime;
            crl.NextUpdate    = ((DerAsnUtcTime)details.Value[4]).Value.DateTime;
            var list = ((DerAsnSequence)details.Value[5]).Value.Cast <DerAsnSequence>();
            var info = ((DerAsnSequence)((ContextSpecificSequence)details.Value[6]).Value[0]).Value;

            foreach (var part in subject)
            {
                var seq       = ((DerAsnSequence)part.Value[0]);
                var oid       = seq.Value[0] as DerAsnObjectIdentifier;
                var text      = seq.Value[1] as DerAsnPrintableString;
                var oidString = string.Join(".", oid.Value);
                switch (oidString)
                {
                case Oid_Issuer_C: crl.Country = text.Value; break;

                case Oid_Issuer_O: crl.Organization = text.Value; break;

                case Oid_Issuer_CN: crl.IssuerCommonName = text.Value; break;
                }
            }
            foreach (var item in list)
            {
                var serialNumber   = item.Value[0] as DerAsnInteger;
                var revocationDate = item.Value[1] as DerAsnUtcTime;
                var reasonData     = ((DerAsnSequence)((DerAsnSequence)item.Value[2]).Value[0]).Value[1];
                var reason         = default(RevokedCertificate.CRLReasonCode);
                if (reasonData is OctetStringSequence)
                {
                    var reasonSeq = reasonData as OctetStringSequence;
                    reason = (RevokedCertificate.CRLReasonCode)((DerAsnEnumerated)reasonSeq.Value[0]).Value;
                }
                else if (reasonData is DerAsnOctetString)
                {
                    reason = (RevokedCertificate.CRLReasonCode)((DerAsnOctetString)reasonData).Value[2];
                }
                crl.Items.Add(new RevokedCertificate {
                    RevocationDate = revocationDate.Value.DateTime,
                    SerialNumber   = serialNumber.Value.ToString("x16"),
                    ReasonCode     = reason
                });
            }
            foreach (DerAsnSequence item in info)
            {
                var oid       = item.Value[0] as DerAsnObjectIdentifier;
                var oidString = string.Join(".", oid.Value);
                var data      = item.Value[1] as DerAsnOctetString;
                switch (oidString)
                {
                case Oid_AuthorityKey: crl.AuthorizationKeyId = string.Join("", data.Value.Skip(4).Select(x => x.ToString("X2"))); break;

                case Oid_CRLNumber: crl.CrlNumber = (int)new BigInteger(data.Value.Skip(3).ToArray()); break;
                }
            }
            return(crl);
        }