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 9 months ago

Fasjeit commented 11 months ago

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

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

65

Fasjeit commented 9 months ago

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

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

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

Fasjeit commented 9 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 9 months ago

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