blob: b9a1c1be4808c1c0ba48845bf4bd107fce6e79af [file] [log] [blame]
<!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>
description("Test importing keys with various uses from JWK.");
jsTestIsAsync = true;
var extractable = true;
var aesKeyAsJSON = {
"alg": "A192CBC",
"ext": true,
"kty": "oct",
"k": "jnOw99oOZFLIEPMrgJB55WL46tJSLGt7"
};
var hmacKeyAsJSON = {
"alg": "HS256",
"ext": true,
"kty": "oct",
"k": "ahjkn-_387fgnsibf23qsvahjkn-_387fgnsibf23qs"
};
function testWithAESCBC(expectedUsages, jwkUsages)
{
if (jwkUsages.key_ops) {
aesKeyAsJSON.key_ops = jwkUsages.key_ops;
delete aesKeyAsJSON.use;
} else {
delete aesKeyAsJSON.key_ops;
aesKeyAsJSON.use = jwkUsages.use;
}
return crypto.webkitSubtle.importKey("jwk", asciiToUint8Array(JSON.stringify(aesKeyAsJSON)), "AES-CBC", extractable, ["encrypt", "decrypt", "wrapKey", "unwrapKey"]).then(function(result) {
key = result;
debug(JSON.stringify(jwkUsages) + ":");
shouldBe("key.usages", JSON.stringify(expectedUsages));
debug("");
});
}
function testWithHMAC(expectedUsages, jwkUsages)
{
if (jwkUsages.key_ops) {
hmacKeyAsJSON.key_ops = jwkUsages.key_ops;
delete hmacKeyAsJSON.use;
} else {
delete hmacKeyAsJSON.key_ops;
hmacKeyAsJSON.use = jwkUsages.use;
}
return crypto.webkitSubtle.importKey("jwk", asciiToUint8Array(JSON.stringify(hmacKeyAsJSON)), {name: 'hmac', hash: {name: 'sha-256'}}, extractable, ["sign", "verify"]).then(function(result) {
key = result;
debug(JSON.stringify(jwkUsages) + ":");
shouldBe("key.usages", JSON.stringify(expectedUsages));
debug("");
});
}
// Duplicates are not allowed. We currently raise an exception, although we should reject the promise instead.
shouldThrow('testWithAESCBC(["encrypt"], {key_ops: ["encrypt", "encrypt"]})');
debug("");
Promise.all([
testWithAESCBC(["encrypt"], {key_ops: ["encrypt"]}),
testWithAESCBC(["decrypt"], {key_ops: ["decrypt"]}),
testWithAESCBC(["decrypt", "encrypt"], {key_ops: ["encrypt", "decrypt"]}),
testWithAESCBC(["wrapKey"], {key_ops: ["wrapKey"]}),
testWithAESCBC(["unwrapKey"], {key_ops: ["unwrapKey"]}),
testWithAESCBC(["unwrapKey", "wrapKey"], {key_ops: ["wrapKey", "unwrapKey"]}),
testWithAESCBC(["decrypt", "encrypt", "wrapKey"], {key_ops: ["encrypt", "decrypt", "wrapKey"]}),
testWithAESCBC(["decrypt", "encrypt", "unwrapKey", "wrapKey"], {use: "enc"}),
testWithHMAC(["sign"], {key_ops: ["sign"]}),
testWithHMAC(["verify"], {key_ops: ["verify"]}),
testWithHMAC(["sign", "verify"], {use: "sig"}),
// Unknown key_ops strings are ignored.
testWithAESCBC([], {key_ops: ["'encrypt'"]}),
testWithAESCBC([], {key_ops: ["encrypt "]}),
testWithAESCBC([], {key_ops: ["Encrypt"]}),
]).then(function() { finishJSTest(); } );
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>