Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion test/fixtures/wpt/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Last update:
- wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi
- wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi
- web-locks: https://github.com/web-platform-tests/wpt/tree/10a122a6bc/web-locks
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/c9e955840a/WebCryptoAPI
- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/e28c952dc7/WebCryptoAPI
- webidl: https://github.com/web-platform-tests/wpt/tree/63ca529a02/webidl
- webidl/ecmascript-binding/es-exceptions: https://github.com/web-platform-tests/wpt/tree/2f96fa1996/webidl/ecmascript-binding/es-exceptions
- webmessaging/broadcastchannel: https://github.com/web-platform-tests/wpt/tree/6495c91853/webmessaging/broadcastchannel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,17 +195,52 @@ Object.keys(digestedData).forEach(function (alg) {

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
return crypto.subtle
var promise = crypto.subtle
.digest({ name: alg, length: length }, buffer)
.then(function (result) {
// Alter the buffer after calling digest
buffer[0] = ~buffer[0];
assert_true(
equalBuffers(result, digestedData[alg][length][size]),
'digest matches expected'
);
});
// Alter the buffer after calling digest
buffer[0] = ~buffer[0];
return promise;
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and altered buffer after call');

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
return crypto.subtle
.digest({
get name() {
// Transfer the buffer while calling digest
buffer.buffer.transfer();
return alg;
},
length
}, buffer)
.then(function (result) {
assert_true(
equalBuffers(result, digestedData[alg][length].empty),
'digest on transferred buffer should match result for empty buffer'
);
});
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer during call');

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
var promise = crypto.subtle
.digest({ name: alg, length: length }, buffer)
.then(function (result) {
assert_true(
equalBuffers(result, digestedData[alg][length][size]),
'digest matches expected'
);
});
// Transfer the buffer after calling digest
buffer.buffer.transfer();
return promise;
}, alg + ' with ' + length + ' bit output and ' + size + ' source data and transferred buffer after call');
}
});
});
Expand Down
24 changes: 24 additions & 0 deletions test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,30 @@
copiedBuffer[0] = 255 - copiedBuffer[0];
return promise;
}, upCase + " with " + size + " source data and altered buffer after call");

promise_test(function(test) {
var copiedBuffer = copyBuffer(sourceData[size]);
copiedBuffer.buffer.transfer();
return subtle.digest({name: upCase}, copiedBuffer)
.then(function(result) {
assert_true(equalBuffers(result, digestedData[alg].empty), "digest() on transferred buffer should yield result for empty buffer for " + alg + ":" + size);
}, function(err) {
assert_unreached("digest() threw an error for transferred buffer for " + alg + ":" + size + ": " + err.message);
});
}, upCase + " with " + size + " source data and transferred buffer during call");

promise_test(function(test) {
var copiedBuffer = copyBuffer(sourceData[size]);
var promise = subtle.digest({name: upCase}, copiedBuffer)
.then(function(result) {
assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size);
}, function(err) {
assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message);
});

copiedBuffer.buffer.transfer();
return promise;
}, upCase + " with " + size + " source data and transferred buffer after call");
}
});
});
Expand Down
38 changes: 35 additions & 3 deletions test/fixtures/wpt/WebCryptoAPI/digest/sha3.tentative.https.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,15 +132,47 @@ Object.keys(sourceData).forEach(function (size) {

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
return crypto.subtle.digest(alg, buffer).then(function (result) {
// Alter the buffer after calling digest
buffer[0] = ~buffer[0];
var promise = crypto.subtle.digest(alg, buffer).then(function (result) {
assert_true(
equalBuffers(result, digestedData[alg][size]),
'digest matches expected'
);
});
// Alter the buffer after calling digest
buffer[0] = ~buffer[0];
return promise;
}, alg + ' with ' + size + ' source data and altered buffer after call');

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
return crypto.subtle
.digest({
get name() {
// Transfer the buffer while calling digest
buffer.buffer.transfer();
return alg;
}
}, buffer)
.then(function (result) {
assert_true(
equalBuffers(result, digestedData[alg].empty),
'digest on transferred buffer should match result for empty buffer'
);
});
}, alg + ' with ' + size + ' source data and transferred buffer during call');

promise_test(function (test) {
var buffer = new Uint8Array(sourceData[size]);
var promise = crypto.subtle.digest(alg, buffer).then(function (result) {
assert_true(
equalBuffers(result, digestedData[alg][size]),
'digest matches expected'
);
});
// Transfer the buffer after calling digest
buffer.buffer.transfer();
return promise;
}, alg + ' with ' + size + ' source data and transferred buffer after call');
}
});
});
Expand Down
126 changes: 126 additions & 0 deletions test/fixtures/wpt/WebCryptoAPI/encrypt_decrypt/aes.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,67 @@ function run_test() {
all_promises.push(promise);
});

// Check for encryption of an empty value if the buffer is transferred while calling encrypt.
passingVectors.forEach(function(vector) {
var plaintext = copyBuffer(vector.plaintext);
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
.then(function(vector) {
promise_test(function(test) {
var operation = subtle.encrypt({
...vector.algorithm,
get name() {
plaintext.buffer.transfer();
return vector.algorithm.name;
}
}, vector.key, plaintext)
.then(function(result) {
var expectedLength =
["AES-GCM", "AES-OCB"].includes(vector.algorithm.name) ? vector.algorithm.tagLength / 8 :
vector.algorithm.name === "AES-CBC" ? 16 :
0;
assert_equals(result.byteLength, expectedLength, "Transferred plaintext yields an empty ciphertext");
}, function(err) {
assert_unreached("encrypt error for test " + vector.name + ": " + err.message);
});
return operation;
}, vector.name + " with transferred plaintext during call");
}, function(err) {
// We need a failed test if the importVectorKey operation fails, so
// we know we never tested encryption
promise_test(function(test) {
assert_unreached("importKey failed for " + vector.name);
}, "importKey step: " + vector.name + " with transferred plaintext during call");
});

all_promises.push(promise);
});

// Check for successful encryption even if the buffer is transferred after calling encrypt.
passingVectors.forEach(function(vector) {
var plaintext = copyBuffer(vector.plaintext);
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
.then(function(vector) {
promise_test(function(test) {
var operation = subtle.encrypt(vector.algorithm, vector.key, plaintext)
.then(function(result) {
assert_true(equalBuffers(result, vector.result), "Should return expected result");
}, function(err) {
assert_unreached("encrypt error for test " + vector.name + ": " + err.message);
});
plaintext.buffer.transfer();
return operation;
}, vector.name + " with transferred plaintext after call");
}, function(err) {
// We need a failed test if the importVectorKey operation fails, so
// we know we never tested encryption
promise_test(function(test) {
assert_unreached("importKey failed for " + vector.name);
}, "importKey step: " + vector.name + " with transferred plaintext after call");
});

all_promises.push(promise);
});

// Check for successful decryption.
passingVectors.forEach(function(vector) {
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
Expand Down Expand Up @@ -174,6 +235,71 @@ function run_test() {
all_promises.push(promise);
});

// Check for decryption when ciphertext is transferred while calling decrypt.
passingVectors.forEach(function(vector) {
var ciphertext = copyBuffer(vector.result);
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
.then(function(vector) {
promise_test(function(test) {
var operation = subtle.decrypt({
...vector.algorithm,
get name() {
ciphertext.buffer.transfer();
return vector.algorithm.name;
}
}, vector.key, ciphertext)
.then(function(result) {
if (vector.algorithm.name === "AES-CTR") {
assert_equals(result.byteLength, 0, "Transferred ciphertext yields empty plaintext");
} else {
assert_unreached("decrypt should not have succeeded for " + vector.name);
}
}, function(err) {
if (vector.algorithm.name === "AES-CTR") {
assert_unreached("decrypt error for test " + vector.name + ": " + err.message);
} else {
assert_equals(err.name, "OperationError", "Should throw an OperationError instead of " + err.message);
}
});
return operation;
}, vector.name + " decryption with transferred ciphertext during call");
}, function(err) {
// We need a failed test if the importVectorKey operation fails, so
// we know we never tested encryption
promise_test(function(test) {
assert_unreached("importKey failed for " + vector.name);
}, "importKey step for decryption: " + vector.name + " with transferred ciphertext during call");
});

all_promises.push(promise);
});

// Check for successful decryption even if ciphertext is transferred after calling encrypt.
passingVectors.forEach(function(vector) {
var ciphertext = copyBuffer(vector.result);
var promise = importVectorKey(vector, ["encrypt", "decrypt"])
.then(function(vector) {
promise_test(function(test) {
var operation = subtle.decrypt(vector.algorithm, vector.key, ciphertext)
.then(function(result) {
assert_true(equalBuffers(result, vector.plaintext), "Should return expected result");
}, function(err) {
assert_unreached("decrypt error for test " + vector.name + ": " + err.message);
});
ciphertext.buffer.transfer();
return operation;
}, vector.name + " decryption with transferred ciphertext after call");
}, function(err) {
// We need a failed test if the importVectorKey operation fails, so
// we know we never tested encryption
promise_test(function(test) {
assert_unreached("importKey failed for " + vector.name);
}, "importKey step for decryption: " + vector.name + " with transferred ciphertext after call");
});

all_promises.push(promise);
});

// Everything that succeeded should fail if no "encrypt" usage.
passingVectors.forEach(function(vector) {
// Don't want to overwrite key being used for success tests!
Expand Down
Loading
Loading