CryptoPro / corefx

This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others. We welcome contributions.
https://github.com/dotnet/core
MIT License
27 stars 8 forks source link

ComputeSignature не формирует cades-bes подпись #41

Open mshamito opened 3 years ago

mshamito commented 3 years ago

debian 10, csp 5.0.11998 при использовании ComputeSignature в подписи отсутствуют необходимые обязательные подписанные аттрибуты cades-bes. время подписания можно добавить указав cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now)); но для добавления подписанного аттрибута Signing certificate V2 (1.2.840.113549.1.9.16.2.47) нет удобных способов

maxdm commented 3 years ago

Спасибо, за замечание. Мы начали перенос в capilite магии из Windows, думаю, через пару месяцев будет готово для Linux в рамках предварительной версии КриптоПро CSP 5r3.

tolyanich commented 3 years ago

Создание аттрибутов нужно в сам Net Core добавлять. Т.к. из нативного кода там вызывается CryptSignHash и он не знает ни чего про CMS.

maxdm commented 3 years ago

Да, родной .NET меня ввёл в заблуждение. В .NET Core работа с CMS сделана не через CryptMsg, поэтому магия не срабатывает. В capilite она уже есть.

mshamito commented 3 years ago

спасибо. единственное рабочее решение которое нашел: делать cades-bes через p/invoke libcades.so но кол-во кода выростает в разы. особенно если нужно только cades-bes. было бы удобно если бы существовал интерфейс от Крипто-Про который к примеру возвращал объекты AsnEncodedData/CryptographicAttributeObject для последующего добавления их в cmsSigner.SignedAttributes.Add()

mshamito commented 3 years ago

Удобнее кодировать аттрибут через Bouncy Castle. если не ветвить код на алгоритмы, то примерно выглядит так:

        static AsnEncodedData SigningCertV2(X509Certificate2 cert)
        {
            var bouncyCert = new Org.BouncyCastle.X509.X509CertificateParser().ReadCertificate(cert.GetRawCertData());
            HashAlgorithm gost = new Gost3411_2012_256CryptoServiceProvider();
            byte[] hashValue = gost.ComputeHash(cert.RawData);
            EssCertIDv2 essCertIDv2 = new EssCertIDv2(
                //P.S. using AlgorithmIdentifier = Org.BouncyCastle.Asn1.X509.AlgorithmIdentifier;
                new AlgorithmIdentifier("1.2.643.7.1.1.2.2"), //szOID_CP_GOST_R3411_12_256
                hashValue,
                new IssuerSerial(
                    new GeneralNames(new GeneralName(bouncyCert.IssuerDN)),
                    new DerInteger(new BigInteger(bouncyCert.SerialNumber.ToString()))
                    )
            );
            SigningCertificateV2 signingCertificateV2 = new SigningCertificateV2(essCertIDv2);
            return new AsnEncodedData(new Oid("1.2.840.113549.1.9.16.2.47"), signingCertificateV2.GetEncoded());
        }

будет ли в будущем использоваться BC как в JCP?