Skip to content

Commit a976a63

Browse files
panvadanielleadams
authored andcommitted
crypto: fix X25519 and X448 webcrypto public CryptoKey usages
PR-URL: #45569 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
1 parent 27adcc9 commit a976a63

File tree

5 files changed

+24
-33
lines changed

5 files changed

+24
-33
lines changed

lib/internal/crypto/cfrg.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,14 @@ function verifyAcceptableCfrgKeyUse(name, type, usages) {
5353
case 'X25519':
5454
// Fall through
5555
case 'X448':
56-
checkSet = ['deriveKey', 'deriveBits'];
56+
switch (type) {
57+
case 'private':
58+
checkSet = ['deriveKey', 'deriveBits'];
59+
break;
60+
case 'public':
61+
checkSet = [];
62+
break;
63+
}
5764
break;
5865
case 'Ed25519':
5966
// Fall through

test/parallel/test-webcrypto-derivebits-cfrg.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ async function prepareKeys() {
5252
Buffer.from(spki, 'hex'),
5353
{ name },
5454
true,
55-
['deriveKey', 'deriveBits']),
55+
[]),
5656
]);
5757
keys[name] = {
5858
privateKey,
@@ -180,7 +180,7 @@ async function prepareKeys() {
180180
name: 'X448',
181181
public: keys.X448.publicKey
182182
}, keys.X448.publicKey, null), {
183-
message: /baseKey must be a private key/
183+
name: 'InvalidAccessError'
184184
});
185185
}
186186

@@ -190,7 +190,7 @@ async function prepareKeys() {
190190
name: 'X448',
191191
public: keys.X448.privateKey
192192
}, keys.X448.publicKey, null), {
193-
message: /algorithm\.public must be a public key/
193+
name: 'InvalidAccessError'
194194
});
195195
}
196196

@@ -207,7 +207,7 @@ async function prepareKeys() {
207207
name: 'X448',
208208
public: key
209209
}, keys.X448.publicKey, null), {
210-
message: /algorithm\.public must be a public key/
210+
name: 'InvalidAccessError'
211211
});
212212
}
213213
})().then(common.mustCall());

test/parallel/test-webcrypto-derivekey-cfrg.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async function prepareKeys() {
5151
Buffer.from(spki, 'hex'),
5252
{ name },
5353
true,
54-
['deriveKey', 'deriveBits']),
54+
[]),
5555
]);
5656
keys[name] = {
5757
privateKey,
@@ -150,20 +150,20 @@ async function prepareKeys() {
150150
},
151151
keys.X448.publicKey,
152152
...otherArgs),
153-
{ message: /baseKey must be a private key/ });
153+
{ name: 'InvalidAccessError' });
154154
}
155155

156156
{
157-
// Base key is not a private key
157+
// Public is not a public key
158158
await assert.rejects(
159159
subtle.deriveKey(
160160
{
161161
name: 'X448',
162162
public: keys.X448.privateKey
163163
},
164-
keys.X448.publicKey,
164+
keys.X448.privateKey,
165165
...otherArgs),
166-
{ message: /algorithm\.public must be a public key/ });
166+
{ name: 'InvalidAccessError' });
167167
}
168168

169169
{
@@ -183,6 +183,6 @@ async function prepareKeys() {
183183
},
184184
keys.X448.publicKey,
185185
...otherArgs),
186-
{ message: /algorithm\.public must be a public key/ });
186+
{ name: 'InvalidAccessError' });
187187
}
188188
})().then(common.mustCall());

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -315,19 +315,19 @@ async function testImportRaw({ name, publicUsages }) {
315315
const rsaPrivate = crypto.createPrivateKey(
316316
fixtures.readKey('rsa_private_2048.pem'));
317317

318-
for (const [name, [publicUsage, privateUsage]] of Object.entries({
319-
'Ed25519': ['verify', 'sign'],
320-
'X448': ['deriveBits', 'deriveBits'],
321-
})) {
318+
for (const [name, publicUsages, privateUsages] of [
319+
['Ed25519', ['verify'], ['sign']],
320+
['X448', [], ['deriveBits']],
321+
]) {
322322
assert.rejects(subtle.importKey(
323323
'spki',
324324
rsaPublic.export({ format: 'der', type: 'spki' }),
325325
{ name },
326-
true, [publicUsage]), { message: /Invalid key type/ });
326+
true, publicUsages), { message: /Invalid key type/ });
327327
assert.rejects(subtle.importKey(
328328
'pkcs8',
329329
rsaPrivate.export({ format: 'der', type: 'pkcs8' }),
330330
{ name },
331-
true, [privateUsage]), { message: /Invalid key type/ });
331+
true, privateUsages), { message: /Invalid key type/ });
332332
}
333333
}

test/wpt/status/WebCryptoAPI.json

-16
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,6 @@
5959
"import_export/okp_importKey_failures_X25519.https.any.js": {
6060
"fail": {
6161
"expected": [
62-
"Bad usages: importKey(spki, {name: X25519}, true, [deriveKey])",
63-
"Bad usages: importKey(spki, {name: X25519}, false, [deriveKey])",
64-
"Bad usages: importKey(spki, {name: X25519}, true, [deriveBits])",
65-
"Bad usages: importKey(spki, {name: X25519}, false, [deriveBits])",
66-
"Bad usages: importKey(jwk (public) , {name: X25519}, true, [deriveKey])",
67-
"Bad usages: importKey(jwk (public) , {name: X25519}, false, [deriveKey])",
68-
"Bad usages: importKey(jwk (public) , {name: X25519}, true, [deriveBits])",
69-
"Bad usages: importKey(jwk (public) , {name: X25519}, false, [deriveBits])",
7062
"Bad key length: importKey(spki, {name: X25519}, true, [])",
7163
"Bad key length: importKey(spki, {name: X25519}, false, [])",
7264
"Bad key length: importKey(pkcs8, {name: X25519}, true, [deriveKey])",
@@ -97,14 +89,6 @@
9789
"import_export/okp_importKey_failures_X448.https.any.js": {
9890
"fail": {
9991
"expected": [
100-
"Bad usages: importKey(spki, {name: X448}, true, [deriveKey])",
101-
"Bad usages: importKey(spki, {name: X448}, false, [deriveKey])",
102-
"Bad usages: importKey(spki, {name: X448}, true, [deriveBits])",
103-
"Bad usages: importKey(spki, {name: X448}, false, [deriveBits])",
104-
"Bad usages: importKey(jwk (public) , {name: X448}, true, [deriveKey])",
105-
"Bad usages: importKey(jwk (public) , {name: X448}, false, [deriveKey])",
106-
"Bad usages: importKey(jwk (public) , {name: X448}, true, [deriveBits])",
107-
"Bad usages: importKey(jwk (public) , {name: X448}, false, [deriveBits])",
10892
"Bad key length: importKey(spki, {name: X448}, true, [])",
10993
"Bad key length: importKey(spki, {name: X448}, false, [])",
11094
"Bad key length: importKey(pkcs8, {name: X448}, true, [deriveKey])",

0 commit comments

Comments
 (0)