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 7 forks source link

Ограниченная поддежка EcDSA #67

Closed Fasjeit closed 11 months ago

Fasjeit commented 1 year ago

Интересуют следующие сценарии.

RSA. Linux: Tls, mTls, SignedCms (attached, detached). Как следствие x509.

65

Fasjeit commented 11 months ago

TLS проверил только односторонний. CMS подписывается sha256 и проверяется на sha-1 и sha256. С виндой совместимо (проверка проходит).

В качестве подписи провайдер возвращает в сыром виде (r||t). Для этого используем флаг CP_ECC_PLAIN_SIGNATURE_CNG_REVERSED после чего разворачиваем подпись.

ASN1 в cms формируется руками, по аналогии реализации от ms.

Fasjeit commented 11 months ago

Для формирования cms подписи нужно явно передать закрытый ключ, так как свойство PrivateKey не поддерживается для EcDsa (по изначальной логике ms).

using (var ecDsaCert = ... ) //X509Certificate2
{
    var key = ecDsaCert.GetECDsaPrivateKey();

    var contentInfo = new ContentInfo(bytesToHash);
    var signedCms = new SignedCms(contentInfo, false);
    // Явно указываем закрытый ключ
    CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, ecDsaCert, key);
    cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));
    signedCms.ComputeSignature(cmsSigner);
    signature = signedCms.Encode();
    Console.WriteLine($"CMS Sign: {Convert.ToBase64String(signature)}");
}
Fasjeit commented 11 months ago

Создание нового ключа не поддерживаем (пустой конструктор и создание ключа через CspParams). Если будет нужно - сделаем потом отдельно.