From d6dbc3cc596953c6cb53688172bf3b2d36bcd263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Sun, 5 Sep 2021 10:27:41 +0000 Subject: [PATCH] crypto: fix RSA-PSS default saltLength --- src/crypto/crypto_rsa.cc | 9 +++++-- test/parallel/test-crypto-keygen.js | 37 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/crypto/crypto_rsa.cc b/src/crypto/crypto_rsa.cc index 1bbf9a1753e4e2..3aa80b00d1a1f1 100644 --- a/src/crypto/crypto_rsa.cc +++ b/src/crypto/crypto_rsa.cc @@ -70,10 +70,15 @@ EVPKeyCtxPointer RsaKeyGenTraits::Setup(RsaKeyPairGenConfig* params) { return EVPKeyCtxPointer(); } - if (params->params.saltlen >= 0 && + int saltlen = params->params.saltlen; + if (saltlen < 0 && params->params.md != nullptr) { + saltlen = EVP_MD_size(params->params.md); + } + + if (saltlen >= 0 && EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen( ctx.get(), - params->params.saltlen) <= 0) { + saltlen) <= 0) { return EVPKeyCtxPointer(); } } diff --git a/test/parallel/test-crypto-keygen.js b/test/parallel/test-crypto-keygen.js index d35eeae5b98ed5..e57e9bcac507d3 100644 --- a/test/parallel/test-crypto-keygen.js +++ b/test/parallel/test-crypto-keygen.js @@ -369,6 +369,43 @@ const sec1EncExp = (cipher) => getRegExpForPEM('EC PRIVATE KEY', cipher); })); } +{ + // RFC 8017, A.2.3.: "For a given hashAlgorithm, the default value of + // saltLength is the octet length of the hash value." + + generateKeyPair('rsa-pss', { + modulusLength: 512, + hashAlgorithm: 'sha512' + }, common.mustSucceed((publicKey, privateKey) => { + const expectedKeyDetails = { + modulusLength: 512, + publicExponent: 65537n, + hashAlgorithm: 'sha512', + mgf1HashAlgorithm: 'sha512', + saltLength: 64 + }; + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); + })); + + // It is still possible to explicitly set saltLength to 0. + generateKeyPair('rsa-pss', { + modulusLength: 512, + hashAlgorithm: 'sha512', + saltLength: 0 + }, common.mustSucceed((publicKey, privateKey) => { + const expectedKeyDetails = { + modulusLength: 512, + publicExponent: 65537n, + hashAlgorithm: 'sha512', + mgf1HashAlgorithm: 'sha512', + saltLength: 0 + }; + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); + })); +} + { const privateKeyEncoding = { type: 'pkcs8',