Я создаю подписанные и зашифрованные данные 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 самостоятельно?
Во всяком случае, я открыт для всех предложений ...