Как заставить CmsSigner использовать RSASSA-PSS (RsaPss) при подписи с помощью сертификата X509 с асимметричными параметрами RSA - PullRequest
1 голос
/ 22 мая 2019

Я создаю подписанные и зашифрованные данные pkcs 7. Сертификаты, которые я использую для генерации подписей, выдаются внешней стороной (государственным агентством).

«Другая сторона» поддерживает только подписи, основанные на дайджесте SHA256, вычисленном с использованием RSASSA-PSS, но CmsSigner (внутренне используемый в SignedCms) автоматически выбирает «простой RSA».

Создание подписи RSASSA-PSS (или RsaPss) не будет проблемой. Проблема заключается в том, что CmsSigner, похоже, выбирает алгоритм подписи на основе алгоритма пары ключей сертификата.

Фрагмент кода:

public static byte[] EncryptDotNet(P12Keystore p12KeyStore, byte[] secret, params Etk[] etks)
    {
        if (etks == null || etks?.Any() == false)
        {
            throw new ArgumentNullException(nameof(etks));
        }

        var authenticationCertificate = p12KeyStore.AuthenticationCert;

        var cmsSigner = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, authenticationCertificate)
        {
            IncludeOption = X509IncludeOption.EndCertOnly,
            DigestAlgorithm = new Oid(oidDigestAlgoSHA256)
        };

        var content = new ContentInfo(secret);
        var innerSignedCms = new SignedCms(content);
        innerSignedCms.ComputeSignature(cmsSigner, true);

        if (innerSignedCms.SignerInfos[0].SignatureAlgorithm.Value != signatureAlgorithmRSASSAPSS)
        {
            //---> does not comply with expectation.
        }

Я пытался использовать отражение для установки алгоритма oid для RSASSA-PSS на открытый / закрытый ключ сертификата, похоже, не оказало влияния. Теперь мне интересно, могу ли я взять выход RSA и сделать заполнение PSS самостоятельно? Во всяком случае, я открыт для всех предложений ...

...