crypto: preserve OpenSSL errors from KDF failures · nodejs/node@3cd1576 · GitHub
Skip to content

Commit 3cd1576

Browse files
panvaaduh95
authored andcommitted
crypto: preserve OpenSSL errors from KDF failures
The ncrypto KDF helpers cleared the OpenSSL error queue on return, and the traits insert their own message, which makes DeriveBitsJob skip errors->Capture(). Argon2, HKDF, PBKDF2 and scrypt failures were therefore bare Errors with no code and no opensslErrorStack. Drop the guard, which DeriveBitsJob already provides, and capture before inserting since Capture() clears the store. Signed-off-by: Filip Skokan <panva.ip@gmail.com> PR-URL: #64776 Backport-PR-URL: #65087 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 74b3023 commit 3cd1576

3 files changed

Lines changed: 35 additions & 16 deletions

File tree

deps/ncrypto/ncrypto.cc

Lines changed: 0 additions & 8 deletions

test/parallel/test-crypto-argon2-job.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,30 @@ const empty = Buffer.alloc(0);
2929

3030
// Parameters that OpenSSL's Argon2 KDF rejects.
3131
const badParams = [
32-
{ lanes: 0, keylen: 32, memcost: 16, iter: 1 }, // lanes < 1
33-
{ lanes: 1, keylen: 32, memcost: 0, iter: 1 }, // memcost == 0
34-
{ lanes: 1, keylen: 32, memcost: 16, iter: 0 }, // iter == 0
32+
{ lanes: 0, keylen: 32, memcost: 16, iter: 1,
33+
reason: /invalid thread pool size/ },
34+
{ lanes: 1, keylen: 32, memcost: 0, iter: 1,
35+
reason: /invalid memory size/ },
36+
{ lanes: 1, keylen: 32, memcost: 16, iter: 0,
37+
reason: /invalid iteration count/ },
3538
];
3639

37-
for (const { lanes, keylen, memcost, iter } of badParams) {
40+
function assertError(err, { reason }) {
41+
assert.ok(err);
42+
const details = [err.message, ...(err.opensslErrorStack ?? [])];
43+
assert.ok(details.some((msg) => reason.test(msg)),
44+
`did not find ${reason} in ${details}`);
45+
}
46+
47+
for (const params of badParams) {
48+
const { lanes, keylen, memcost, iter } = params;
49+
3850
{
3951
const job = new Argon2Job(
4052
kCryptoJobSync, pass, salt, lanes, keylen, memcost, iter,
4153
empty, empty, kTypeArgon2id);
4254
const { 0: err, 1: result } = job.run();
43-
assert.ok(err);
44-
assert.match(err.message, /Deriving bits failed/);
55+
assertError(err, params);
4556
assert.strictEqual(result, undefined);
4657
}
4758

@@ -50,8 +61,7 @@ for (const { lanes, keylen, memcost, iter } of badParams) {
5061
kCryptoJobAsync, pass, salt, lanes, keylen, memcost, iter,
5162
empty, empty, kTypeArgon2id);
5263
job.ondone = common.mustCall((err, result) => {
53-
assert.ok(err);
54-
assert.match(err.message, /Deriving bits failed/);
64+
assertError(err, params);
5565
assert.strictEqual(result, undefined);
5666
});
5767
job.run();

test/parallel/test-crypto-no-algorithm.js

Lines changed: 17 additions & 0 deletions

0 commit comments

Comments
 (0)