Skip to content

Commit dbbe58e

Browse files
committed
fixup! crypto: add KMAC Web Cryptography algorithms
1 parent f227d31 commit dbbe58e

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

src/crypto/crypto_kmac.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "threadpoolwork-inl.h"
55

66
#if OPENSSL_VERSION_NUMBER >= 0x30100000L
7+
#include <openssl/core_names.h>
78
#include <openssl/params.h>
89
#include "crypto/crypto_keys.h"
910
#include "crypto/crypto_sig.h"

test/parallel/test-webcrypto-derivekey.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
// Flags: --expose-internals --no-warnings
21
'use strict';
32

43
const common = require('../common');
54

65
if (!common.hasCrypto)
76
common.skip('missing crypto');
87

8+
const { hasOpenSSL } = require('../common/crypto');
9+
910
const assert = require('assert');
1011
const { subtle } = globalThis.crypto;
1112
const { KeyObject } = require('crypto');
@@ -167,6 +168,15 @@ const { KeyObject } = require('crypto');
167168
// [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512],
168169
];
169170

171+
if (hasOpenSSL(3, 1)) {
172+
vectors.push(
173+
['KMAC128', 'sign', 128],
174+
[{ name: 'KMAC128', length: 384 }, 'sign', 384],
175+
['KMAC256', 'sign', 256],
176+
[{ name: 'KMAC256', length: 384 }, 'sign', 384],
177+
);
178+
}
179+
170180
(async () => {
171181
const keyPair = await subtle.generateKey({ name: 'ECDH', namedCurve: 'P-521' }, false, ['deriveKey']);
172182
for (const [derivedKeyAlgorithm, usage, expected] of vectors) {
@@ -183,7 +193,7 @@ const { KeyObject } = require('crypto');
183193
} else {
184194
assert.strictEqual(result.status, 'fulfilled');
185195
const derived = result.value;
186-
if (derived.algorithm.name === 'HMAC') {
196+
if (derived.algorithm.name === 'HMAC' || derived.algorithm.name.startsWith('KMAC')) {
187197
assert.strictEqual(derived.algorithm.length, expected);
188198
} else {
189199
// KDFs cannot be exportable and do not indicate their length
@@ -211,6 +221,15 @@ const { KeyObject } = require('crypto');
211221
// [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512],
212222
];
213223

224+
if (hasOpenSSL(3, 1)) {
225+
vectors.push(
226+
['KMAC128', 'sign', 128],
227+
[{ name: 'KMAC128', length: 384 }, 'sign', 384],
228+
['KMAC256', 'sign', 256],
229+
[{ name: 'KMAC256', length: 384 }, 'sign', 384],
230+
);
231+
}
232+
214233
(async () => {
215234
for (const [derivedKeyAlgorithm, usage, expected] of vectors) {
216235
const derived = await subtle.deriveKey(

test/parallel/test-webcrypto-export-import.js

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ const { createPrivateKey, createPublicKey, createSecretKey } = require('crypto')
9999
hash: 'SHA-256'
100100
}, true, ['sign', 'verify']);
101101

102-
103102
assert.strictEqual(key.algorithm, key.algorithm);
104103
assert.strictEqual(key.usages, key.usages);
105104

@@ -113,11 +112,44 @@ const { createPrivateKey, createPublicKey, createSecretKey } = require('crypto')
113112
assert.deepStrictEqual(jwk.key_ops, ['sign', 'verify']);
114113
assert(jwk.ext);
115114
assert.strictEqual(jwk.kty, 'oct');
115+
assert.strictEqual(jwk.alg, 'HS256');
116116

117117
assert.deepStrictEqual(
118118
Buffer.from(jwk.k, 'base64').toString('hex'),
119119
Buffer.from(raw).toString('hex'));
120120

121+
await subtle.importKey(
122+
'jwk',
123+
jwk,
124+
{
125+
name: 'HMAC',
126+
hash: 'SHA-256'
127+
},
128+
true,
129+
['sign', 'verify']);
130+
131+
await subtle.importKey(
132+
'jwk',
133+
{ ...jwk, alg: undefined },
134+
{
135+
name: 'HMAC',
136+
hash: 'SHA-256'
137+
},
138+
true,
139+
['sign', 'verify']);
140+
141+
await assert.rejects(
142+
subtle.importKey(
143+
'jwk',
144+
{ ...jwk, alg: 'HS384' },
145+
{
146+
name: 'HMAC',
147+
hash: 'SHA-256'
148+
},
149+
true,
150+
['sign', 'verify']),
151+
{ name: 'DataError', message: 'JWK "alg" does not match the requested algorithm' });
152+
121153
await assert.rejects(
122154
subtle.importKey(
123155
'raw',
@@ -161,6 +193,35 @@ if (hasOpenSSL(3, 1)) {
161193
Buffer.from(jwk.k, 'base64').toString('hex'),
162194
Buffer.from(raw).toString('hex'));
163195

196+
await subtle.importKey(
197+
'jwk',
198+
jwk,
199+
name,
200+
true,
201+
['sign', 'verify']);
202+
203+
await subtle.importKey(
204+
'jwk',
205+
{ ...jwk, alg: undefined },
206+
name,
207+
true,
208+
['sign', 'verify']);
209+
210+
await assert.rejects(
211+
subtle.importKey(
212+
'jwk',
213+
{ ...jwk, alg: name === 'KMAC128' ? 'K256' : 'K128' },
214+
name,
215+
true,
216+
['sign', 'verify']),
217+
{ name: 'DataError', message: 'JWK "alg" does not match the requested algorithm' });
218+
219+
await assert.rejects(
220+
subtle.importKey(
221+
'raw',
222+
keyData, name, true, ['sign', 'verify']),
223+
{ name: 'NotSupportedError', message: `Unable to import ${name} using raw format` });
224+
164225
await assert.rejects(
165226
subtle.importKey(
166227
'raw-secret',

0 commit comments

Comments
 (0)