Skip to content

Commit 40037b4

Browse files
panvatargos
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 de2b6b9 commit 40037b4

5 files changed

Lines changed: 24 additions & 33 deletions

File tree

‎lib/internal/crypto/cfrg.js‎

Lines changed: 8 additions & 1 deletion
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‎

Lines changed: 4 additions & 4 deletions
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: /baseKeymustbeaprivatekey/
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\.publicmustbeapublickey/
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\.publicmustbeapublickey/
210+
name: 'InvalidAccessError'
211211
});
212212
}
213213
})().then(common.mustCall());

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

Lines changed: 6 additions & 6 deletions
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: /baseKeymustbeaprivatekey/});
153+
{name: 'InvalidAccessError'});
154154
}
155155

156156
{
157-
// Base key is not a private key
157+
// Public is not a public key
158158
awaitassert.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\.publicmustbeapublickey/});
166+
{name: 'InvalidAccessError'});
167167
}
168168

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

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,19 +315,19 @@ async function testImportRaw({ name, publicUsages }) {
315315
constrsaPrivate=crypto.createPrivateKey(
316316
fixtures.readKey('rsa_private_2048.pem'));
317317

318-
for(const[name,[publicUsage,privateUsage]]ofObject.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: /Invalidkeytype/});
326+
true,publicUsages),{message: /Invalidkeytype/});
327327
assert.rejects(subtle.importKey(
328328
'pkcs8',
329329
rsaPrivate.export({format: 'der',type: 'pkcs8'}),
330330
{ name },
331-
true,[privateUsage]),{message: /Invalidkeytype/});
331+
true,privateUsages),{message: /Invalidkeytype/});
332332
}
333333
}

‎test/wpt/status/WebCryptoAPI.json‎

Lines changed: 0 additions & 16 deletions
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)