<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
<script src="resources/common.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>

<script>
description("Tests that a string can be passed in place of an AlgorithmIdentifier");

jsTestIsAsync = true;

Promise.resolve(null).then(function() {
    // Use a string algorithm identifier ("aes-cbc") as a parameter to importKey().
    return crypto.subtle.importKey("raw", new Uint8Array(16), "aes-cbc", true, ["encrypt"]);
}).then(function(result) {
    // Verify that the key was imported correctly.
    key = result;
    shouldEvaluateAs("key.type", "secret");
    shouldEvaluateAs("key.algorithm.name", "AES-CBC");
    shouldEvaluateAs("key.algorithm.length", 128);

    // Use a string algorithm identifier ("sha-1") as a parameter to digest().
    return crypto.subtle.digest("sha-1", new Uint8Array(0));
}).then(function(result) {
    bytesShouldMatchHexString("sha-1 of empty string", "da39a3ee5e6b4b0d3255bfef95601890afd80709", result);

    // Use a string algorithm identifier ("sha-256") for the hash property to hmac key import.
    return crypto.subtle.importKey("raw", new Uint8Array(15), {name: "hmac", hash: "sha-256"}, false, ["sign"]);
}).then(function(result) {
    // Verify that the key was imported correctly.
    key = result;
    shouldEvaluateAs("key.type", "secret");
    shouldEvaluateAs("key.algorithm.name", "HMAC");
    shouldEvaluateAs("key.algorithm.hash.name", "SHA-256");
    shouldEvaluateAs("key.algorithm.length", 120);
}).then(finishJSTest, failAndFinishJSTest);

</script>

</body>
</html>
