Skip to content

Commit 47a2132

Browse files
nodejs-github-botaduh95
authored andcommitted
test: update WPT for WebCryptoAPI to 6a1c545d77
PR-URL: #62187 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Filip Skokan <panva.ip@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 6c8fa42 commit 47a2132

File tree

14 files changed

+1187
-81
lines changed

14 files changed

+1187
-81
lines changed

test/fixtures/wpt/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Last update:
3434
- wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi
3535
- wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi
3636
- web-locks: https://github.com/web-platform-tests/wpt/tree/10a122a6bc/web-locks
37-
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/c9e955840a/WebCryptoAPI
37+
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/6a1c545d77/WebCryptoAPI
3838
- webidl: https://github.com/web-platform-tests/wpt/tree/63ca529a02/webidl
3939
- webidl/ecmascript-binding/es-exceptions: https://github.com/web-platform-tests/wpt/tree/2f96fa1996/webidl/ecmascript-binding/es-exceptions
4040
- webmessaging/broadcastchannel: https://github.com/web-platform-tests/wpt/tree/6495c91853/webmessaging/broadcastchannel

test/fixtures/wpt/WebCryptoAPI/digest/cshake.tentative.https.any.js

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,52 @@ Object.keys(digestedData).forEach(function (alg) {
195195

196196
promise_test(function (test) {
197197
var buffer = new Uint8Array(sourceData[size]);
198-
return crypto.subtle
198+
var promise = crypto.subtle
199199
.digest({ name: alg, length: length }, buffer)
200200
.then(function (result) {
201-
// Alter the buffer after calling digest
202-
buffer[0] = ~buffer[0];
203201
assert_true(
204202
equalBuffers(result, digestedData[alg][length][size]),
205203
'digest matches expected'
206204
);
207205
});
206+
// Alter the buffer after calling digest
207+
buffer[0] = ~buffer[0];
208+
return promise;
208209
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and altered buffer after call');
210+
211+
promise_test(function (test) {
212+
var buffer = new Uint8Array(sourceData[size]);
213+
return crypto.subtle
214+
.digest({
215+
get name() {
216+
// Transfer the buffer while calling digest
217+
buffer.buffer.transfer();
218+
return alg;
219+
},
220+
length
221+
}, buffer)
222+
.then(function (result) {
223+
assert_true(
224+
equalBuffers(result, digestedData[alg][length].empty),
225+
'digest on transferred buffer should match result for empty buffer'
226+
);
227+
});
228+
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer during call');
229+
230+
promise_test(function (test) {
231+
var buffer = new Uint8Array(sourceData[size]);
232+
var promise = crypto.subtle
233+
.digest({ name: alg, length: length }, buffer)
234+
.then(function (result) {
235+
assert_true(
236+
equalBuffers(result, digestedData[alg][length][size]),
237+
'digest matches expected'
238+
);
239+
});
240+
// Transfer the buffer after calling digest
241+
buffer.buffer.transfer();
242+
return promise;
243+
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer after call');
209244
}
210245
});
211246
});

test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,30 @@
113113
copiedBuffer[0] = 255 - copiedBuffer[0];
114114
return promise;
115115
}, upCase + " with " + size + " source data and altered buffer after call");
116+
117+
promise_test(function(test) {
118+
var copiedBuffer = copyBuffer(sourceData[size]);
119+
copiedBuffer.buffer.transfer();
120+
return subtle.digest({name: upCase}, copiedBuffer)
121+
.then(function(result) {
122+
assert_true(equalBuffers(result, digestedData[alg].empty), "digest() on transferred buffer should yield result for empty buffer for " + alg + ":" + size);
123+
}, function(err) {
124+
assert_unreached("digest() threw an error for transferred buffer for " + alg + ":" + size + ": " + err.message);
125+
});
126+
}, upCase + " with " + size + " source data and transferred buffer during call");
127+
128+
promise_test(function(test) {
129+
var copiedBuffer = copyBuffer(sourceData[size]);
130+
var promise = subtle.digest({name: upCase}, copiedBuffer)
131+
.then(function(result) {
132+
assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size);
133+
}, function(err) {
134+
assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message);
135+
});
136+
137+
copiedBuffer.buffer.transfer();
138+
return promise;
139+
}, upCase + " with " + size + " source data and transferred buffer after call");
116140
}
117141
});
118142
});

test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,47 @@ Object.keys(sourceData).forEach(function (size) {
132132

133133
promise_test(function (test) {
134134
var buffer = new Uint8Array(sourceData[size]);
135-
return crypto.subtle.digest(alg, buffer).then(function (result) {
136-
// Alter the buffer after calling digest
137-
buffer[0] = ~buffer[0];
135+
var promise = crypto.subtle.digest(alg, buffer).then(function (result) {
138136
assert_true(
139137
equalBuffers(result, digestedData[alg][size]),
140138
'digest matches expected'
141139
);
142140
});
141+
// Alter the buffer after calling digest
142+
buffer[0] = ~buffer[0];
143+
return promise;
143144
}, alg + ' with ' + size + ' source data and altered buffer after call');
145+
146+
promise_test(function (test) {
147+
var buffer = new Uint8Array(sourceData[size]);
148+
return crypto.subtle
149+
.digest({
150+
get name() {
151+
// Transfer the buffer while calling digest
152+
buffer.buffer.transfer();
153+
return alg;
154+
}
155+
}, buffer)
156+
.then(function (result) {
157+
assert_true(
158+
equalBuffers(result, digestedData[alg].empty),
159+
'digest on transferred buffer should match result for empty buffer'
160+
);
161+
});
162+
}, alg + ' with ' + size + ' source data and transferred buffer during call');
163+
164+
promise_test(function (test) {
165+
var buffer = new Uint8Array(sourceData[size]);
166+
var promise = crypto.subtle.digest(alg, buffer).then(function (result) {
167+
assert_true(
168+
equalBuffers(result, digestedData[alg][size]),
169+
'digest matches expected'
170+
);
171+
});
172+
// Transfer the buffer after calling digest
173+
buffer.buffer.transfer();
174+
return promise;
175+
}, alg + ' with ' + size + ' source data and transferred buffer after call');
144176
}
145177
});
146178
});

test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,67 @@ function run_test() {
9393
all_promises.push(promise);
9494
});
9595

96+
// Check for encryption of an empty value if the buffer is transferred while calling encrypt.
97+
passingVectors.forEach(function(vector) {
98+
var plaintext = copyBuffer(vector.plaintext);
99+
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
100+
.then(function(vector) {
101+
promise_test(function(test) {
102+
var operation = subtle.encrypt({
103+
...vector.algorithm,
104+
get name() {
105+
plaintext.buffer.transfer();
106+
return vector.algorithm.name;
107+
}
108+
}, vector.key, plaintext)
109+
.then(function(result) {
110+
var expectedLength =
111+
["AES-GCM", "AES-OCB"].includes(vector.algorithm.name) ? vector.algorithm.tagLength / 8 :
112+
vector.algorithm.name === "AES-CBC" ? 16 :
113+
0;
114+
assert_equals(result.byteLength, expectedLength, "Transferred plaintext yields an empty ciphertext");
115+
}, function(err) {
116+
assert_unreached("encrypt error for test " + vector.name + ": " + err.message);
117+
});
118+
return operation;
119+
}, vector.name + " with transferred plaintext during call");
120+
}, function(err) {
121+
// We need a failed test if the importVectorKey operation fails, so
122+
// we know we never tested encryption
123+
promise_test(function(test) {
124+
assert_unreached("importKey failed for " + vector.name);
125+
}, "importKey step: " + vector.name + " with transferred plaintext during call");
126+
});
127+
128+
all_promises.push(promise);
129+
});
130+
131+
// Check for successful encryption even if the buffer is transferred after calling encrypt.
132+
passingVectors.forEach(function(vector) {
133+
var plaintext = copyBuffer(vector.plaintext);
134+
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
135+
.then(function(vector) {
136+
promise_test(function(test) {
137+
var operation = subtle.encrypt(vector.algorithm, vector.key, plaintext)
138+
.then(function(result) {
139+
assert_true(equalBuffers(result, vector.result), "Should return expected result");
140+
}, function(err) {
141+
assert_unreached("encrypt error for test " + vector.name + ": " + err.message);
142+
});
143+
plaintext.buffer.transfer();
144+
return operation;
145+
}, vector.name + " with transferred plaintext after call");
146+
}, function(err) {
147+
// We need a failed test if the importVectorKey operation fails, so
148+
// we know we never tested encryption
149+
promise_test(function(test) {
150+
assert_unreached("importKey failed for " + vector.name);
151+
}, "importKey step: " + vector.name + " with transferred plaintext after call");
152+
});
153+
154+
all_promises.push(promise);
155+
});
156+
96157
// Check for successful decryption.
97158
passingVectors.forEach(function(vector) {
98159
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
@@ -174,6 +235,71 @@ function run_test() {
174235
all_promises.push(promise);
175236
});
176237

238+
// Check for decryption when ciphertext is transferred while calling decrypt.
239+
passingVectors.forEach(function(vector) {
240+
var ciphertext = copyBuffer(vector.result);
241+
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
242+
.then(function(vector) {
243+
promise_test(function(test) {
244+
var operation = subtle.decrypt({
245+
...vector.algorithm,
246+
get name() {
247+
ciphertext.buffer.transfer();
248+
return vector.algorithm.name;
249+
}
250+
}, vector.key, ciphertext)
251+
.then(function(result) {
252+
if (vector.algorithm.name === "AES-CTR") {
253+
assert_equals(result.byteLength, 0, "Transferred ciphertext yields empty plaintext");
254+
} else {
255+
assert_unreached("decrypt should not have succeeded for " + vector.name);
256+
}
257+
}, function(err) {
258+
if (vector.algorithm.name === "AES-CTR") {
259+
assert_unreached("decrypt error for test " + vector.name + ": " + err.message);
260+
} else {
261+
assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message);
262+
}
263+
});
264+
return operation;
265+
}, vector.name + " decryption with transferred ciphertext during call");
266+
}, function(err) {
267+
// We need a failed test if the importVectorKey operation fails, so
268+
// we know we never tested encryption
269+
promise_test(function(test) {
270+
assert_unreached("importKey failed for " + vector.name);
271+
}, "importKey step for decryption: " + vector.name + " with transferred ciphertext during call");
272+
});
273+
274+
all_promises.push(promise);
275+
});
276+
277+
// Check for successful decryption even if ciphertext is transferred after calling encrypt.
278+
passingVectors.forEach(function(vector) {
279+
var ciphertext = copyBuffer(vector.result);
280+
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
281+
.then(function(vector) {
282+
promise_test(function(test) {
283+
var operation = subtle.decrypt(vector.algorithm, vector.key, ciphertext)
284+
.then(function(result) {
285+
assert_true(equalBuffers(result, vector.plaintext), "Should return expected result");
286+
}, function(err) {
287+
assert_unreached("decrypt error for test " + vector.name + ": " + err.message);
288+
});
289+
ciphertext.buffer.transfer();
290+
return operation;
291+
}, vector.name + " decryption with transferred ciphertext after call");
292+
}, function(err) {
293+
// We need a failed test if the importVectorKey operation fails, so
294+
// we know we never tested encryption
295+
promise_test(function(test) {
296+
assert_unreached("importKey failed for " + vector.name);
297+
}, "importKey step for decryption: " + vector.name + " with transferred ciphertext after call");
298+
});
299+
300+
all_promises.push(promise);
301+
});
302+
177303
// Everything that succeeded should fail if no "encrypt" usage.
178304
passingVectors.forEach(function(vector) {
179305
// Don't want to overwrite key being used for success tests!

0 commit comments

Comments
 (0)