| // Flags: --expose-internals |
| 'use strict'; |
| |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| |
| const { |
| bigIntArrayToUnsignedInt, |
| normalizeAlgorithm, |
| validateKeyOps, |
| } = require('internal/crypto/util'); |
| |
| // bigIntArrayToUnsignedInt must return an unsigned 32-bit value even when |
| // the most significant byte has its top bit set. Otherwise the signed `<<` |
| // operator yields a negative Int32 for inputs like [0x80, 0x00, 0x00, 0x01]. |
| { |
| assert.strictEqual( |
| bigIntArrayToUnsignedInt(new Uint8Array([0x80, 0x00, 0x00, 0x01])), |
| 0x80000001); |
| assert.strictEqual( |
| bigIntArrayToUnsignedInt(new Uint8Array([0xff, 0xff, 0xff, 0xff])), |
| 0xffffffff); |
| assert.strictEqual( |
| bigIntArrayToUnsignedInt(new Uint8Array([1, 0, 1])), |
| 65537); |
| assert.strictEqual( |
| bigIntArrayToUnsignedInt(new Uint8Array([1, 0, 0, 0, 0])), |
| undefined); |
| } |
| |
| { |
| // Check that normalizeAlgorithm does not mutate object inputs. |
| const algorithm = { name: 'ECDSA', hash: 'SHA-256' }; |
| assert.strictEqual(normalizeAlgorithm(algorithm, 'sign') !== algorithm, true); |
| assert.deepStrictEqual(algorithm, { name: 'ECDSA', hash: 'SHA-256' }); |
| } |
| |
| // The algorithm name getter should only be invoked once during |
| // normalizeAlgorithm, including for algorithms with a non-null desiredType |
| // where step 6 runs the specialized dictionary converter. |
| // Refs: https://github.com/web-platform-tests/wpt/pull/57614#pullrequestreview-3808145365 |
| { |
| let nameReadCount = 0; |
| const algorithm = { |
| get name() { |
| nameReadCount++; |
| return 'AES-GCM'; |
| }, |
| iv: new Uint8Array(12), |
| }; |
| const normalized = normalizeAlgorithm(algorithm, 'encrypt'); |
| assert.strictEqual(normalized.name, 'AES-GCM'); |
| assert.strictEqual(nameReadCount, 1); |
| } |
| |
| { |
| let nameReadCount = 0; |
| const algorithm = { |
| get name() { |
| nameReadCount++; |
| return 'ECDSA'; |
| }, |
| hash: 'SHA-256', |
| }; |
| const normalized = normalizeAlgorithm(algorithm, 'sign'); |
| assert.strictEqual(normalized.name, 'ECDSA'); |
| assert.strictEqual(nameReadCount, 1); |
| } |
| |
| { |
| for (const ops of [ |
| ['sign', 'toString', 'constructor'], |
| ['sign', '__proto__', 'constructor'], |
| ]) { |
| validateKeyOps(ops); |
| } |
| } |