Skip to content

Commit 8237346

Browse files
panvamarco-ippolito
authored andcommitted
test,crypto: update WebCryptoAPI WPT
Refs: #54572 Refs: #54468 PR-URL: #54593 Backport-PR-URL: #58589 Refs: #54572 Refs: #54468 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent d09008a commit 8237346

20 files changed

Lines changed: 576 additions & 501 deletions

‎test/common/wpt.js‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,16 @@ class StatusLoader {
451451

452452
load(){
453453
constdir=path.join(__dirname,'..','wpt');
454-
conststatusFile=path.join(dir,'status',`${this.path}.json`);
455-
constresult=JSON.parse(fs.readFileSync(statusFile,'utf8'));
454+
letstatusFile=path.join(dir,'status',`${this.path}.json`);
455+
letresult;
456+
457+
if(fs.existsSync(statusFile)){
458+
result=JSON.parse(fs.readFileSync(statusFile,'utf8'));
459+
}else{
460+
statusFile=path.join(dir,'status',`${this.path}.cjs`);
461+
result=require(statusFile);
462+
}
463+
456464
this.rules.addRules(result);
457465

458466
constsubDir=fixtures.path('wpt',this.path);

‎test/fixtures/wpt/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Last update:
3131
- user-timing: https://github.com/web-platform-tests/wpt/tree/5ae85bf826/user-timing
3232
- wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi
3333
- wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi
34-
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/5e042cbc4e/WebCryptoAPI
34+
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/6748a0a246/WebCryptoAPI
3535
- webidl/ecmascript-binding/es-exceptions: https://github.com/web-platform-tests/wpt/tree/a370aad338/webidl/ecmascript-binding/es-exceptions
3636
- webmessaging/broadcastchannel: https://github.com/web-platform-tests/wpt/tree/e97fac4791/webmessaging/broadcastchannel
3737

‎test/fixtures/wpt/WebCryptoAPI/derive_bits_keys/cfrg_curves_bits.js‎

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ function define_tests() {
66
// Verify the derive functions perform checks against the all-zero value results,
77
// ensuring small-order points are rejected.
88
// https://www.rfc-editor.org/rfc/rfc7748#section-6.1
9-
// TODO: The spec states that the check must be done on use, but there is discussion about doing it on import.
10-
// https://github.com/WICG/webcrypto-secure-curves/pull/13
119
Object.keys(kSmallOrderPoint).forEach(function(algorithmName){
1210
kSmallOrderPoint[algorithmName].forEach(function(test){
1311
promise_test(async()=>{
@@ -23,8 +21,8 @@ function define_tests() {
2321
false,[])
2422
derived=awaitsubtle.deriveBits({name: algorithmName,public: publicKey},privateKey,8*sizes[algorithmName]);
2523
}catch(err){
26-
assert_false(privateKey===undefined,"Private key should be valid.");
27-
assert_false(publicKey===undefined,"Public key should be valid.");
24+
assert_true(privateKey!==undefined,"Private key should be valid.");
25+
assert_true(publicKey!==undefined,"Public key should be valid.");
2826
assert_equals(err.name,"OperationError","Should throw correct error, not "+err.name+": "+err.message+".");
2927
}
3028
assert_equals(derived,undefined,"Operation succeeded, but should not have.");
@@ -59,25 +57,6 @@ function define_tests() {
5957
});
6058
},algorithmName+" mixed case parameters");
6159

62-
// Null length
63-
// "Null" is not valid per the current spec
64-
// - https://github.com/w3c/webcrypto/issues/322
65-
// - https://github.com/w3c/webcrypto/issues/329
66-
//
67-
// Proposal for a spec change:
68-
// - https://github.com/w3c/webcrypto/pull/345
69-
//
70-
// This test case may be replaced by these new tests:
71-
// - https://github.com/web-platform-tests/wpt/pull/43400
72-
promise_test(function(test){
73-
returnsubtle.deriveBits({name: algorithmName,public: publicKeys[algorithmName]},privateKeys[algorithmName],null)
74-
.then(function(derivation){
75-
assert_true(equalBuffers(derivation,derivations[algorithmName]),"Derived correct bits");
76-
},function(err){
77-
assert_unreached("deriveBits failed with error "+err.name+": "+err.message);
78-
});
79-
},algorithmName+" with null length");
80-
8160
// Shorter than entire derivation per algorithm
8261
promise_test(function(test){
8362
returnsubtle.deriveBits({name: algorithmName,public: publicKeys[algorithmName]},privateKeys[algorithmName],8*sizes[algorithmName]-32)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// META: title=WebCryptoAPI: deriveBits() tests for the 'length' parameter
2+
// META: script=derived_bits_length.js
3+
// META: script=derived_bits_length_vectors.js
4+
// META: script=derived_bits_length_testcases.js
5+
6+
// Define subtests from a `promise_test` to ensure the harness does not
7+
// complete before the subtests are available. `explicit_done` cannot be used
8+
// for this purpose because the global `done` function is automatically invoked
9+
// by the WPT infrastructure in dedicated worker tests defined using the
10+
// "multi-global" pattern.
11+
promise_test(define_tests,'setup - define tests');
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
functiondefine_tests(){
2+
// May want to test prefixed implementations.
3+
varsubtle=self.crypto.subtle;
4+
5+
Object.keys(testCases).forEach(algorithm=>{
6+
lettestData=algorithms[algorithm];
7+
testCases[algorithm].forEach(testParam=>{
8+
promise_test(async()=>{
9+
letderivedBits,privateKey,publicKey;
10+
try{
11+
privateKey=awaitsubtle.importKey(testData.privateKey.format,testData.privateKey.data,testData.importAlg,false,["deriveBits"]);
12+
if(testData.deriveAlg.public!==undefined){
13+
publicKey=awaitsubtle.importKey(testData.publicKey.format,testData.publicKey.data,testData.importAlg,false,[]);
14+
testData.deriveAlg.public=publicKey;
15+
}
16+
if(testParam.length==="omitted")
17+
derivedBits=awaitsubtle.deriveBits(testData.deriveAlg,privateKey);
18+
else
19+
derivedBits=awaitsubtle.deriveBits(testData.deriveAlg,privateKey,testParam.length);
20+
if(testParam.expected===undefined){
21+
assert_unreached("deriveBits should have thrown an OperationError exception.");
22+
}
23+
assert_array_equals(newUint8Array(derivedBits),testParam.expected,"Derived bits do not match the expected result.");
24+
}catch(err){
25+
if(errinstanceofAssertionError||testParam.expected!==undefined){
26+
throwerr;
27+
}
28+
assert_true(privateKey!==undefined,"Key should be valid.");
29+
assert_equals(err.name,"OperationError","deriveBits correctly threw OperationError: "+err.message);
30+
}
31+
},algorithm+" derivation with "+testParam.length+" as 'length' parameter");
32+
});
33+
});
34+
35+
returnPromise.resolve("define_tests");
36+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
vartestCases={
2+
"HKDF": [
3+
{length: 256,expected: algorithms["HKDF"].derivation},
4+
{length: 0,expected: undefined},// explicitly disallowed, so should throw
5+
{length: null,expected: undefined},// should throw an exception
6+
{length: undefined,expected: undefined},// should throw an exception
7+
{length: "omitted",expected: undefined},// default value is null, so should throw
8+
],
9+
"PBKDF2": [
10+
{length: 256,expected: algorithms["PBKDF2"].derivation},
11+
{length: 0,expected: undefined},// explicitly disallowed, so should throw
12+
{length: null,expected: undefined},// should throw an exception
13+
{length: undefined,expected: undefined},// should throw an exception
14+
{length: "omitted",expected: undefined},// default value is null, so should throw
15+
],
16+
"ECDH": [
17+
{length: 256,expected: algorithms["ECDH"].derivation},
18+
{length: 0,expected: emptyArray},
19+
{length: null,expected: algorithms["ECDH"].derivation},
20+
{length: undefined,expected: algorithms["ECDH"].derivation},
21+
{length: "omitted",expected: algorithms["ECDH"].derivation},// default value is null
22+
],
23+
"X25519": [
24+
{length: 256,expected: algorithms["X25519"].derivation},
25+
{length: 0,expected: emptyArray},
26+
{length: null,expected: algorithms["X25519"].derivation},
27+
{length: undefined,expected: algorithms["X25519"].derivation},
28+
{length: "omitted",expected: algorithms["X25519"].derivation},// default value is null
29+
],
30+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
constemptyArray=newUint8Array([]);
2+
constrawKey=newUint8Array([85,115,101,114,115,32,115,104,111,117,108,100,32,112,105,99,107,32,108,111,110,103,32,112,97,115,115,112,104,114,97,115,101,115,32,40,110,111,116,32,117,115,101,32,115,104,111,114,116,32,112,97,115,115,119,111,114,100,115,41,33]);
3+
constsalt=newUint8Array([83,111,100,105,117,109,32,67,104,108,111,114,105,100,101,32,99,111,109,112,111,117,110,100]);
4+
constinfo=newUint8Array([72,75,68,70,32,101,120,116,114,97,32,105,110,102,111]);
5+
6+
varalgorithms={
7+
"HKDF": {
8+
importAlg: {name: "HKDF"},
9+
privateKey: {format: "raw",data: rawKey},
10+
deriveAlg: {name: "HKDF",salt: salt,hash: "SHA-256",info: info},
11+
derivation: newUint8Array([49,183,214,133,48,168,99,231,23,192,129,202,105,23,182,134,80,179,221,154,41,243,6,6,226,202,209,153,190,193,77,19]),
12+
},
13+
"PBKDF2": {
14+
importAlg: {name: "PBKDF2"},
15+
privateKey: {format: "raw",data: rawKey},
16+
deriveAlg: {name: "PBKDF2",salt: salt,hash: "SHA-256",iterations: 100000},
17+
derivation: newUint8Array([17,153,45,139,129,51,17,36,76,84,75,98,41,41,69,226,8,212,3,206,189,107,149,82,161,165,98,6,93,153,88,234]),
18+
},
19+
"ECDH": {
20+
importAlg: {name: "ECDH",namedCurve: "P-256"},
21+
privateKey: {format: "pkcs8",data: newUint8Array([48,129,135,2,1,0,48,19,6,7,42,134,72,206,61,2,1,6,8,42,134,72,206,61,3,1,7,4,109,48,107,2,1,1,4,32,15,247,79,232,241,202,175,97,92,206,241,29,217,53,114,87,98,217,216,65,236,186,185,94,170,38,68,123,52,100,245,113,161,68,3,66,0,4,140,96,11,44,102,25,45,97,158,39,210,37,107,59,151,118,178,141,30,5,246,13,234,189,98,174,123,154,211,157,224,217,59,4,102,109,199,119,14,126,207,13,211,203,203,211,110,221,107,94,220,153,81,7,55,161,237,104,46,205,112,244,10,47])},
22+
publicKey: {format: "spki",data: newUint8Array([48,89,48,19,6,7,42,134,72,206,61,2,1,6,8,42,134,72,206,61,3,1,7,3,66,0,4,154,116,32,120,126,95,77,105,211,232,34,114,115,1,109,56,224,71,129,133,223,127,238,156,142,103,60,202,211,79,126,128,254,49,141,182,221,107,119,218,99,32,165,246,151,89,9,68,23,177,52,239,138,139,116,193,101,4,57,198,115,0,90,61])},
23+
deriveAlg: {name: "ECDH",public: newUint8Array([])},
24+
derivation: newUint8Array([14,143,60,77,177,178,162,131,115,90,0,220,87,31,26,232,151,28,227,35,250,17,131,137,203,95,65,196,59,61,181,161]),
25+
},
26+
"X25519": {
27+
importAlg: {name: "X25519"},
28+
privateKey: {format: "pkcs8",data: newUint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32,200,131,142,118,208,87,223,183,216,201,90,105,225,56,22,10,221,99,115,253,113,164,210,118,187,86,227,168,27,100,255,97])},
29+
publicKey: {format: "spki",data: newUint8Array([48,42,48,5,6,3,43,101,110,3,33,0,28,242,177,230,2,46,197,55,55,30,215,245,62,84,250,17,84,216,62,152,235,100,234,81,250,229,179,48,124,254,151,6])},
30+
deriveAlg: {name: "X25519",public: newUint8Array([])},
31+
derivation: newUint8Array([39,104,64,157,250,185,158,194,59,140,137,185,63,245,136,2,149,247,97,118,8,143,137,228,61,254,190,126,161,149,0,8]),
32+
}
33+
};

‎test/fixtures/wpt/WebCryptoAPI/derive_bits_keys/ecdh_bits.js‎

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,25 +55,6 @@ function define_tests() {
5555
});
5656
},namedCurve+" mixed case parameters");
5757

58-
// Null length
59-
// "Null" is not valid per the current spec
60-
// - https://github.com/w3c/webcrypto/issues/322
61-
// - https://github.com/w3c/webcrypto/issues/329
62-
//
63-
// Proposal for a spec change:
64-
// - https://github.com/w3c/webcrypto/pull/345
65-
//
66-
// This test case may be replaced by these new tests:
67-
// - https://github.com/web-platform-tests/wpt/pull/43400
68-
promise_test(function(test){
69-
returnsubtle.deriveBits({name: "ECDH",public: publicKeys[namedCurve]},privateKeys[namedCurve],null)
70-
.then(function(derivation){
71-
assert_true(equalBuffers(derivation,derivations[namedCurve]),"Derived correct bits");
72-
},function(err){
73-
assert_unreached("deriveBits failed with error "+err.name+": "+err.message);
74-
});
75-
},namedCurve+" with null length");
76-
7758
// Shorter than entire derivation per algorithm
7859
promise_test(function(test){
7960
returnsubtle.deriveBits({name: "ECDH",public: publicKeys[namedCurve]},privateKeys[namedCurve],8*sizes[namedCurve]-32)

‎test/fixtures/wpt/WebCryptoAPI/derive_bits_keys/hkdf.js‎

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -139,25 +139,6 @@ function define_tests() {
139139
});
140140
},testName+" with missing info");
141141

142-
// length null (OperationError)
143-
// "Null" is not valid per the current spec
144-
// - https://github.com/w3c/webcrypto/issues/322
145-
// - https://github.com/w3c/webcrypto/issues/329
146-
//
147-
// Proposal for a spec change:
148-
// - https://github.com/w3c/webcrypto/pull/345
149-
//
150-
// This test case may be replaced by these new tests:
151-
// - https://github.com/web-platform-tests/wpt/pull/43400
152-
subsetTest(promise_test,function(test){
153-
returnsubtle.deriveBits(algorithm,baseKeys[derivedKeySize],null)
154-
.then(function(derivation){
155-
assert_unreached("null length should have thrown an OperationError");
156-
},function(err){
157-
assert_equals(err.name,"OperationError","deriveBits with null length correctly threw OperationError: "+err.message);
158-
});
159-
},testName+" with null length");
160-
161142
// length not multiple of 8 (OperationError)
162143
subsetTest(promise_test,function(test){
163144
returnsubtle.deriveBits(algorithm,baseKeys[derivedKeySize],44)

‎test/fixtures/wpt/WebCryptoAPI/derive_bits_keys/pbkdf2.js‎

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,26 +103,6 @@ function define_tests() {
103103

104104
});
105105

106-
// Test various error conditions for deriveBits below:
107-
// length null (OperationError)
108-
// "Null" is not valid per the current spec
109-
// - https://github.com/w3c/webcrypto/issues/322
110-
// - https://github.com/w3c/webcrypto/issues/329
111-
//
112-
// Proposal for a spec change:
113-
// - https://github.com/w3c/webcrypto/pull/345
114-
//
115-
// This test case may be replaced by these new tests:
116-
// - https://github.com/web-platform-tests/wpt/pull/43400
117-
subsetTest(promise_test,function(test){
118-
returnsubtle.deriveBits({name: "PBKDF2",salt: salts[saltSize],hash: hashName,iterations: parseInt(iterations)},baseKeys[passwordSize],null)
119-
.then(function(derivation){
120-
assert_unreached("null length should have thrown an OperationError");
121-
},function(err){
122-
assert_equals(err.name,"OperationError","deriveBits with null length correctly threw OperationError: "+err.message);
123-
});
124-
},testName+" with null length");
125-
126106
// 0 length (OperationError)
127107
subsetTest(promise_test,function(test){
128108
returnsubtle.deriveBits({name: "PBKDF2",salt: salts[saltSize],hash: hashName,iterations: parseInt(iterations)},baseKeys[passwordSize],0)

0 commit comments

Comments
 (0)