Closed Fasjeit closed 11 months ago
TLS проверил только односторонний. CMS подписывается sha256 и проверяется на sha-1 и sha256. С виндой совместимо (проверка проходит).
В качестве подписи провайдер возвращает в сыром виде (r||t)
. Для этого используем флаг CP_ECC_PLAIN_SIGNATURE_CNG_REVERSED
после чего разворачиваем подпись.
ASN1 в cms формируется руками, по аналогии реализации от ms.
Для формирования 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)}");
}
Создание нового ключа не поддерживаем (пустой конструктор и создание ключа через CspParams
). Если будет нужно - сделаем потом отдельно.
Интересуют следующие сценарии.
RSA. Linux: Tls, mTls, SignedCms (attached, detached). Как следствие x509.
65