From d78c975058272e54c2a290eb1336a7cda1dc2151 Mon Sep 17 00:00:00 2001 From: Adam Mcgrath Date: Thu, 6 Aug 2026 09:20:28 +0100 Subject: [PATCH 1/3] crypto: add mgf1Hash for RSA-OAEP Signed-off-by: Adam Mcgrath --- deps/ncrypto/ncrypto.cc | 8 +- deps/ncrypto/ncrypto.h | 1 + doc/api/crypto.md | 20 ++- lib/internal/crypto/cipher.js | 6 +- src/crypto/crypto_cipher.cc | 13 +- src/crypto/crypto_cipher.h | 1 + test/parallel/test-crypto-rsa-oaep-mgf1.js | 145 +++++++++++++++++++++ typings/internalBinding/crypto.d.ts | 1 + 8 files changed, 186 insertions(+), 9 deletions(-) create mode 100644 test/parallel/test-crypto-rsa-oaep-mgf1.js diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc index b4fa65daa78c..6c4c7b1e3cf9 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)))) { + !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.