<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../../../resources/js-test-pre.js"></script>
<script src="../../resources/common.js"></script>
</head>
<body>
<script>

description("Test sending ec crypto keys via postMessage to a worker.");

jsTestIsAsync = true;

var publicKeyJSON = {
    kty: "EC",
    use: "enc",
    ext: true,
    crv: "P-256",
    x: "1FSVWieTvikFkG1NOyhkUCaMbdQhxwH6aCu4Ez-sRtA",
    y: "9jmNTLqM4cjBhdAnHcNI9YQV3O8LFmo-EdZWk8ntAaI",
};

var privateKeyJSON = {
    kty: "EC",
    ext: true,
    key_ops: ["deriveBits", "deriveKey"],
    crv: "P-256",
    x: "1FSVWieTvikFkG1NOyhkUCaMbdQhxwH6aCu4Ez-sRtA",
    y: "9jmNTLqM4cjBhdAnHcNI9YQV3O8LFmo-EdZWk8ntAaI",
    d: "ppxBSov3N8_AUcisAuvmLV4yE8e_L_BLE8bZb9Z1Xjg",
};

var count = 0;
var worker = new Worker("resources/ec-postMessage-worker.js");
worker.onmessage = function(evt) {
    if (!evt.data.result) {
        testFailed("Check failed in worker: " + evt.data.message);
        finishJSTest();
    } else {
        if (publicKey = evt.data.publicKey) {
            testPassed("All checks passed in worker for public key");
            shouldBe("publicKey.type", "'public'");
            shouldBe("publicKey.extractable", "true");
            shouldBe("publicKey.algorithm.name", "'ECDH'");
            shouldBe("publicKey.algorithm.namedCurve", "'P-256'");
            shouldBe("publicKey.usages", "[ ]");

            crypto.subtle.exportKey("jwk", publicKey).then(function(result) {
                count = count + 1;
                exportedKey = result;

                shouldBe("exportedKey.x", "publicKeyJSON.x");
                shouldBe("exportedKey.y", "publicKeyJSON.y");

                if (count == 2)
                    finishJSTest();
            });
        } else if (privateKey = evt.data.privateKey) {
            testPassed("All checks passed in worker for private key");
            shouldBe("privateKey.type", "'private'");
            shouldBe("privateKey.extractable", "true");
            shouldBe("privateKey.algorithm.name", "'ECDH'");
            shouldBe("privateKey.algorithm.namedCurve", "'P-256'");
            shouldBe("privateKey.usages", "['deriveBits']");

            crypto.subtle.exportKey("jwk", privateKey).then(function(result) {
                count = count + 1;
                exportedKey = result;

                shouldBe("exportedKey.x", "privateKeyJSON.x");
                shouldBe("exportedKey.y", "privateKeyJSON.y");
                shouldBe("exportedKey.d", "privateKeyJSON.d");

                if (count == 2)
                    finishJSTest();
            });
        }
    }
}

crypto.subtle.importKey("jwk", publicKeyJSON, { name:"ECDH", namedCurve:"P-256" }, true, [ ]).then(function(localPublicKey) {
    worker.postMessage({ publicKey: localPublicKey });
    crypto.subtle.importKey("jwk", privateKeyJSON, { name:"ECDH", namedCurve:"P-256" }, true, ['deriveBits']).then(function(localPrivateKey) {
        worker.postMessage({ privateKey: localPrivateKey });
    });
});
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
