Skip to content

Commit

Permalink
crypto: fix webcrypto deriveBits validations
Browse files Browse the repository at this point in the history
PR-URL: #44173
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Backport-PR-URL: #44872
  • Loading branch information
panva authored and juanarbol committed Oct 11, 2022
1 parent 7ad2a26 commit 7e705d8
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 521 deletions.
4 changes: 3 additions & 1 deletion lib/internal/crypto/hkdf.js
Expand Up @@ -142,7 +142,6 @@ function hkdfSync(hash, key, salt, info, length) {
}

async function hkdfDeriveBits(algorithm, baseKey, length) {
validateUint32(length, 'length');
const { hash } = algorithm;
const salt = getArrayBufferOrView(algorithm.salt, 'algorithm.salt');
const info = getArrayBufferOrView(algorithm.info, 'algorithm.info');
Expand All @@ -153,6 +152,9 @@ async function hkdfDeriveBits(algorithm, baseKey, length) {
if (length !== undefined) {
if (length === 0)
throw lazyDOMException('length cannot be zero', 'OperationError');
if (length === null)
throw lazyDOMException('length cannot be null', 'OperationError');
validateUint32(length, 'length');
if (length % 8) {
throw lazyDOMException(
'length must be a multiple of 8',
Expand Down
10 changes: 8 additions & 2 deletions lib/internal/crypto/pbkdf2.js
Expand Up @@ -101,13 +101,16 @@ function check(password, salt, iterations, keylen, digest) {
}

async function pbkdf2DeriveBits(algorithm, baseKey, length) {
validateUint32(length, 'length');
const { iterations } = algorithm;
let { hash } = algorithm;
const salt = getArrayBufferOrView(algorithm.salt, 'algorithm.salt');
if (hash === undefined)
throw new ERR_MISSING_OPTION('algorithm.hash');
validateInteger(iterations, 'algorithm.iterations', 1);
validateInteger(iterations, 'algorithm.iterations');
if (iterations === 0)
throw lazyDOMException(
'iterations cannot be zero',
'OperationError');

hash = normalizeHashName(hash.name);

Expand All @@ -117,6 +120,9 @@ async function pbkdf2DeriveBits(algorithm, baseKey, length) {
if (length !== undefined) {
if (length === 0)
throw lazyDOMException('length cannot be zero', 'OperationError');
if (length === null)
throw lazyDOMException('length cannot be null', 'OperationError');
validateUint32(length, 'length');
if (length % 8) {
throw lazyDOMException(
'length must be a multiple of 8',
Expand Down
9 changes: 6 additions & 3 deletions test/parallel/test-webcrypto-derivebits-hkdf.js
Expand Up @@ -259,15 +259,18 @@ async function testDeriveBitsBadLengths(
return Promise.all([
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], 0), {
message: /length cannot be zero/
message: /length cannot be zero/,
name: 'OperationError',
}),
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], null), {
code: 'ERR_INVALID_ARG_TYPE'
message: 'length cannot be null',
name: 'OperationError',
}),
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], 15), {
message: /length must be a multiple of 8/
message: /length must be a multiple of 8/,
name: 'OperationError',
}),
]);
}
Expand Down
9 changes: 6 additions & 3 deletions test/pummel/test-webcrypto-derivebits-pbkdf2.js
Expand Up @@ -448,15 +448,18 @@ async function testDeriveBitsBadLengths(
return Promise.all([
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], 0), {
message: /length cannot be zero/
message: /length cannot be zero/,
name: 'OperationError',
}),
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], null), {
code: 'ERR_INVALID_ARG_TYPE'
message: 'length cannot be null',
name: 'OperationError',
}),
assert.rejects(
subtle.deriveBits(algorithm, baseKeys[size], 15), {
message: /length must be a multiple of 8/
message: /length must be a multiple of 8/,
name: 'OperationError',
}),
]);
}
Expand Down

0 comments on commit 7e705d8

Please sign in to comment.