| 'use strict'; |
| |
| const common = require('../common'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const { hasOpenSSL } = require('../common/crypto'); |
| |
| if (!hasOpenSSL(3, 2)) |
| common.skip('requires OpenSSL >= 3.2'); |
| |
| const assert = require('assert'); |
| const { createSecretKey } = require('crypto'); |
| const { subtle } = globalThis.crypto; |
| |
| const vectors = [ |
| // https://www.rfc-editor.org/rfc/rfc9106#name-argon2d-test-vectors |
| { |
| algorithm: 'Argon2d', |
| length: 256, |
| password: Buffer.alloc(32, 0x01), |
| params: { |
| memory: 32, |
| passes: 3, |
| parallelism: 4, |
| nonce: Buffer.alloc(16, 0x02), |
| secretValue: Buffer.alloc(8, 0x03), |
| associatedData: Buffer.alloc(12, 0x04), |
| }, |
| tag: Buffer.alloc(32, |
| '512b391b6f1162975371d30919734294f868e3be3984f3c1a13a4db9fabe4acb', |
| 'hex').buffer, |
| }, |
| // https://www.rfc-editor.org/rfc/rfc9106#name-argon2i-test-vectors |
| { |
| algorithm: 'Argon2i', |
| length: 256, |
| password: Buffer.alloc(32, 0x01), |
| params: { |
| memory: 32, |
| passes: 3, |
| parallelism: 4, |
| nonce: Buffer.alloc(16, 0x02), |
| secretValue: Buffer.alloc(8, 0x03), |
| associatedData: Buffer.alloc(12, 0x04), |
| }, |
| tag: Buffer.alloc(32, |
| 'c814d9d1dc7f37aa13f0d77f2494bda1c8de6b016dd388d29952a4c4672b6ce8', |
| 'hex').buffer, |
| }, |
| // https://www.rfc-editor.org/rfc/rfc9106#name-argon2id-test-vectors |
| { |
| algorithm: 'Argon2id', |
| length: 256, |
| password: Buffer.alloc(32, 0x01), |
| params: { |
| memory: 32, |
| passes: 3, |
| parallelism: 4, |
| nonce: Buffer.alloc(16, 0x02), |
| secretValue: Buffer.alloc(8, 0x03), |
| associatedData: Buffer.alloc(12, 0x04), |
| }, |
| tag: Buffer.alloc(32, |
| '0d640df58d78766c08c037a34a8b53c9d01ef0452d75b65eb52520e96b01e659', |
| 'hex').buffer, |
| }, |
| ]; |
| |
| for (const { algorithm, length, password, params, tag } of vectors) { |
| (async () => { |
| const parameters = { name: algorithm, ...params }; |
| const usages = ['deriveBits', 'deriveKey']; |
| { |
| const key = await subtle.importKey('raw-secret', password, algorithm, false, usages); |
| |
| const result = await subtle.deriveBits(parameters, key, length); |
| assert.deepStrictEqual(result, tag); |
| } |
| { |
| const derivedKeyType = { name: 'HMAC', length, hash: 'SHA-256' }; |
| |
| const key = createSecretKey(password) |
| .toCryptoKey(algorithm, false, usages); |
| const hmac = await subtle.deriveKey(parameters, key, derivedKeyType, true, ['sign', 'verify']); |
| |
| const result = await subtle.exportKey('raw', hmac); |
| assert.deepStrictEqual(result, tag); |
| } |
| })().then(common.mustCall()); |
| } |