/// <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(); }
/// <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); }