101 lines
4.0 KiB
HTML
101 lines
4.0 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<script src="../../resources/js-test-pre.js"></script>
|
|
<script src="../resources/common.js"></script>
|
|
</head>
|
|
<body>
|
|
<p id="description"></p>
|
|
<div id="console"></div>
|
|
|
|
<script type="text/javascript">
|
|
description("Test HKDF deriveBits operation for corner-case length values");
|
|
|
|
jsTestIsAsync = true;
|
|
|
|
var nonExtractable = false;
|
|
var rawKey = asciiToUint8Array("jnOw99oOZFLIEPMr");
|
|
var info = asciiToUint8Array("jnOw99oO");
|
|
var salt = asciiToUint8Array("jnOw99oO");
|
|
|
|
crypto.subtle.importKey("raw", rawKey, "HKDF", nonExtractable, ["deriveBits"]).then(function(result) {
|
|
baseKey = result;
|
|
|
|
deriveBits = function(hash, length) {
|
|
return crypto.subtle.deriveBits({name: "HKDF", info: info, salt: salt, hash: hash}, baseKey, length);
|
|
};
|
|
|
|
// For each SHA algorithm and the corresponding HashLen length, we check that:
|
|
// - deriving with zero length rejects,
|
|
// - deriving with 8, HashLen * 8 and 255 * HashLen * 8 resolves,
|
|
// - deriving with 256 * HashLen * 8 rejects.
|
|
|
|
return Promise.resolve().then(function(result) {
|
|
// SHA-1, hash output length is 20 bytes
|
|
return shouldReject('deriveBits("sha-1", 0)').then(function(result) {
|
|
return Promise.all([
|
|
deriveBits("sha-1", 8),
|
|
deriveBits("sha-1", 20 * 8),
|
|
deriveBits("sha-1", 255 * 20 * 8)
|
|
]).then(function(result) {
|
|
testPassed("Bit derivations for SHA-1 with minimum, maximum and HashLen lengths all passed");
|
|
return shouldReject('deriveBits("sha-1", 256 * 20 * 8)');
|
|
});
|
|
});
|
|
}).then(function(result) {
|
|
// SHA-224, hash output length is 28 bytes
|
|
return shouldReject('deriveBits("sha-224", 0)').then(function(result) {
|
|
return Promise.all([
|
|
deriveBits("sha-224", 8),
|
|
deriveBits("sha-224", 28 * 8),
|
|
deriveBits("sha-224", 255 * 28 * 8)
|
|
]).then(function(result) {
|
|
testPassed("Bit derivations for SHA-224 with minimum, maximum and HashLen lengths all passed");
|
|
return shouldReject('deriveBits("sha-224", 256 * 28 * 8)');
|
|
});
|
|
});
|
|
}).then(function(result) {
|
|
// SHA-256, hash output length is 32 bytes
|
|
return shouldReject('deriveBits("sha-256", 0)').then(function(result) {
|
|
return Promise.all([
|
|
deriveBits("sha-256", 8),
|
|
deriveBits("sha-256", 32 * 8),
|
|
deriveBits("sha-256", 255 * 32 * 8)
|
|
]).then(function(result) {
|
|
testPassed("Bit derivations for SHA-256 with minimum, maximum and HashLen lengths all passed");
|
|
return shouldReject('deriveBits("sha-256", 256 * 32 * 8)');
|
|
});
|
|
});
|
|
}).then(function(result) {
|
|
// SHA-384, hash output length is 48 bytes
|
|
return shouldReject('deriveBits("sha-384", 0)').then(function(result) {
|
|
return Promise.all([
|
|
deriveBits("sha-384", 8),
|
|
deriveBits("sha-384", 48 * 8),
|
|
deriveBits("sha-384", 255 * 48 * 8)
|
|
]).then(function(result) {
|
|
testPassed("Bit derivations for SHA-384 with minimum, maximum and HashLen lengths all passed");
|
|
return shouldReject('deriveBits("sha-384", 256 * 48 * 8)');
|
|
});
|
|
});
|
|
}).then(function(result) {
|
|
// SHA-512, hash output length is 64 bytes
|
|
return shouldReject('deriveBits("sha-512", 0)').then(function(result) {
|
|
return Promise.all([
|
|
deriveBits("sha-512", 8),
|
|
deriveBits("sha-512", 64 * 8),
|
|
deriveBits("sha-512", 255 * 64 * 8)
|
|
]).then(function(result) {
|
|
testPassed("Bit derivations for SHA-512 with minimum, maximum and HashLen lengths all passed");
|
|
return shouldReject('deriveBits("sha-512", 256 * 64 * 8)');
|
|
});
|
|
});
|
|
});
|
|
}).then(finishJSTest, finishJSTest);
|
|
|
|
</script>
|
|
|
|
<script src="../../resources/js-test-post.js"></script>
|
|
</body>
|
|
</html>
|