diff --git a/src/crypto/public_key/rsa.js b/src/crypto/public_key/rsa.js index bdbf36c3..2343eb3e 100644 --- a/src/crypto/public_key/rsa.js +++ b/src/crypto/public_key/rsa.js @@ -140,8 +140,15 @@ export async function encrypt(data, n, e) { * @async */ export async function decrypt(data, n, e, d, p, q, u, randomPayload) { - if (util.getNodeCrypto()) { - return nodeDecrypt(data, n, e, d, p, q, u, randomPayload); + // Node v18.19.1, 20.11.1 and 21.6.2 have disabled support for PKCS#1 decryption, + // and we want to avoid checking the error type to decide if the random payload + // should indeed be returned. + if (util.getNodeCrypto() && !randomPayload) { + try { + return await nodeDecrypt(data, n, e, d, p, q, u); + } catch (err) { + util.printDebugError(err); + } } return bnDecrypt(data, n, e, d, p, q, u, randomPayload); } @@ -443,7 +450,7 @@ async function bnEncrypt(data, n, e) { return data.modExp(e, n).toUint8Array('be', n.byteLength()); } -async function nodeDecrypt(data, n, e, d, p, q, u, randomPayload) { +async function nodeDecrypt(data, n, e, d, p, q, u) { const { default: BN } = await import('bn.js'); const pBNum = new BN(p); @@ -477,9 +484,6 @@ async function nodeDecrypt(data, n, e, d, p, q, u, randomPayload) { try { return new Uint8Array(nodeCrypto.privateDecrypt(key, data)); } catch (err) { - if (randomPayload) { - return randomPayload; - } throw new Error('Decryption error'); } } diff --git a/test/general/signature.js b/test/general/signature.js index 914a13e3..25fc119d 100644 --- a/test/general/signature.js +++ b/test/general/signature.js @@ -1188,7 +1188,7 @@ Fk7EflUZzngwY4lBzYAfnNBjEjc30xD/ddo+rwE= ], config }); - expect(openpgp.decrypt({ + await expect(openpgp.decrypt({ message: await openpgp.readMessage({ armoredMessage: message_with_notation }), decryptionKeys: privKey, verificationKeys: privKey,