<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebAuthn getPublicKey</title>
<meta name="timeout" content="long">
<link rel="help" href="https://w3c.github.io/webauthn/#sctn-public-key-easy">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="helpers.js"></script>
<script src="resources/utils.js"></script>
<script>
function testGetPublicKey() {
    standardSetup(function() {
        promise_test(async t => {
            let cred = await createCredential();
            const response = cred.response;
            assert_equals(response.getPublicKeyAlgorithm(),
                          cose_alg_ECDSA_w_SHA256);

            const attestationObject =
                new Cbor(response.attestationObject).getCBOR();
            const claimedAuthDataHex = uint8ArrayToHex(
                new Uint8Array(response.getAuthenticatorData()));
            const actualAuthDataHex = uint8ArrayToHex(attestationObject.authData);
            assert_equals(actualAuthDataHex, claimedAuthDataHex);

            // Check that the x and y coordinates of the public key appear in
            // the claimed SPKI, at least.
            const spkiHex = uint8ArrayToHex(
                new Uint8Array(response.getPublicKey()));
            const authData = parseAuthenticatorData(attestationObject.authData);
            const pubKey = authData.attestedCredentialData.credentialPublicKey;
            const xHex = uint8ArrayToHex(pubKey.x);
            const yHex = uint8ArrayToHex(pubKey.y);
            assert_not_equals(-1, spkiHex.indexOf(xHex));
            assert_not_equals(-1, spkiHex.indexOf(yHex));

            t.done();
        });
    });
}

testGetPublicKey();
/* JSHINT */
/* globals standardSetup, createCredential */
</script>
</head>
<body></body>
</html>
