diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc index b4fa65daa78c..d731e823b39d 100644 --- a/deps/ncrypto/ncrypto.cc +++ b/deps/ncrypto/ncrypto.cc @@ -5650,9 +5650,11 @@ DataPointer RSA_Cipher(const EVPKeyPointer& key, if (!key) return {}; EVPKeyCtxPointer ctx = key.newCtx(); + const Digest& mgf1_digest = + params.mgf1_digest != nullptr ? params.mgf1_digest : params.digest; if (!ctx || init(ctx.get()) <= 0 || !ctx.setRsaPadding(params.padding) || - (params.digest != nullptr && (!ctx.setRsaOaepMd(params.digest) || - !ctx.setRsaMgf1Md(params.digest)))) { + (params.digest != nullptr && + (!ctx.setRsaOaepMd(params.digest) || !ctx.setRsaMgf1Md(mgf1_digest)))) { return {}; } @@ -5691,7 +5693,9 @@ DataPointer CipherImpl(const EVPKeyPointer& key, if (!key) return {}; EVPKeyCtxPointer ctx = key.newCtx(); if (!ctx || init(ctx.get()) <= 0 || !ctx.setRsaPadding(params.padding) || - (params.digest != nullptr && !ctx.setRsaOaepMd(params.digest))) { + (params.digest != nullptr && !ctx.setRsaOaepMd(params.digest)) || + (params.mgf1_digest != nullptr && + !ctx.setRsaMgf1Md(params.mgf1_digest))) { return {}; } diff --git a/deps/ncrypto/ncrypto.h b/deps/ncrypto/ncrypto.h index 53302394f38b..a11d67ae460a 100644 --- a/deps/ncrypto/ncrypto.h +++ b/deps/ncrypto/ncrypto.h @@ -508,6 +508,7 @@ class Cipher final { struct CipherParams { int padding; Digest digest; + Digest mgf1_digest; const Buffer label; }; diff --git a/doc/api/crypto.md b/doc/api/crypto.md index dcef80701f1d..179e5ac30c30 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -5340,6 +5340,9 @@ An array of supported digest functions can be retrieved using * `privateKey` {Object|string|ArrayBuffer|Buffer|TypedArray|DataView|KeyObject|URL} - * `oaepHash` {string} The hash function to use for OAEP padding and MGF1. - **Default:** `'sha1'` + * `oaepHash` {string} The hash function to use for OAEP padding and, unless + `mgf1Hash` is set, MGF1. **Default:** `'sha1'` + * `mgf1Hash` {string} The hash function to use for the MGF1 mask generation + function of OAEP padding. If not specified, the value of `oaepHash` is used. + This allows the OAEP digest and the MGF1 digest to differ. * `oaepLabel` {string|ArrayBuffer|Buffer|TypedArray|DataView} The label to use for OAEP padding. If not specified, no label is used. * `padding` {crypto.constants} An optional padding value defined in @@ -5491,6 +5497,9 @@ be passed instead of a public key.