// TODO(eroman): Use known test vectors. The samples I used here I generated myself.
[
  // Test key derivation using ECDH (P-256), using a public and private key from
  // different key pairs.
  {
    "public_key": {
      "crv": "P-256",
      "kty":"EC",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE"
    },

    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "d":"uN2YSQvxuxhQQ9Y1XXjYi1vr2ZTdzuoDX18PYu4LU-0",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    // This is the maximum length for P-256.
    "length_bits": 256,
    "derived_bytes": "163FAA3FC4815D47345C8E959F707B2F1D3537E7B2EA1DAEC23CA8D0A242CFF3"
  },

  // Same as the test above, but in reverse (choosing public/private from the
  // opposite keypair).
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    // This is the maximum length for P-256.
    "length_bits": 256,
    "derived_bytes": "163FAA3FC4815D47345C8E959F707B2F1D3537E7B2EA1DAEC23CA8D0A242CFF3"
  },

  // This is the same test as above, however the length is 2 bytes shorter.
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    // This is the maximum length for P-256.
    "length_bits": 240,
    "derived_bytes": "163FAA3FC4815D47345C8E959F707B2F1D3537E7B2EA1DAEC23CA8D0A242"
  },

  // Try deriving zero bits.
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    "length_bits": 0,
    "derived_bytes": ""
  },

  // Try deriving a single bit.
  // Note that the full byte would be 0x16, however the remaining bits in the
  // byte will be zero-ed.
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    "length_bits": 1,
    "derived_bytes": "00"
  },

  // This is the same as an earlier test, however 253 bits instead of 256.
  // Notice how the last byte went from 0xF3 --> 0xF0, because the unused bits
  // have been zeroed.
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    "length_bits": 253,
    "derived_bytes": "163FAA3FC4815D47345C8E959F707B2F1D3537E7B2EA1DAEC23CA8D0A242CFF0"
  },


  // A test using P-521.
  {
    "private_key": {
      "crv":"P-521",
      "d":"AI_Zu5xisuK-IIz85dTSoqaQSTxN1I88l05myJJ0ZYFMdQ2VmjFOIUTonKGG97yOGmikyid-6F48d7iI1zF6VRk7",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 521,
    "derived_bytes": "0117D54D84379D0FD385BE068455A77A5366AB534FF172AB0A121F37D180DCCD19607ABB0C41CB9F6F12B01303AC4A69DC2D1D05180181FD496D9769B46BFFEC3400",
    "valid_p521_keys": true // Special variable use by ecdh_unittest.cc::LoadTestKeys
  },

  // Same as above but with the public/private switched.
  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "crv":"P-521",
      "kty":"EC",
      "d":"AU3LVJK4dtlbOEFb018ry-D-kYF7J7oQxXLpXcnQXbTh42FORGGGtySTA83gT_GiHJ0tnvgVrDdUMK1muJBGPrRf",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 521,
    "derived_bytes": "0117D54D84379D0FD385BE068455A77A5366AB534FF172AB0A121F37D180DCCD19607ABB0C41CB9F6F12B01303AC4A69DC2D1D05180181FD496D9769B46BFFEC3400"
  },

  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "crv":"P-521",
      "kty":"EC",
      "d":"AU3LVJK4dtlbOEFb018ry-D-kYF7J7oQxXLpXcnQXbTh42FORGGGtySTA83gT_GiHJ0tnvgVrDdUMK1muJBGPrRf",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 522,
    "derived_bytes": "0117D54D84379D0FD385BE068455A77A5366AB534FF172AB0A121F37D180DCCD19607ABB0C41CB9F6F12B01303AC4A69DC2D1D05180181FD496D9769B46BFFEC3400"
  },

  // Ask for 528 bits using P-521, which is the rounded up byte length of the
  // field size.
  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "crv":"P-521",
      "kty":"EC",
      "d":"AU3LVJK4dtlbOEFb018ry-D-kYF7J7oQxXLpXcnQXbTh42FORGGGtySTA83gT_GiHJ0tnvgVrDdUMK1muJBGPrRf",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 528,
    "derived_bytes": "0117D54D84379D0FD385BE068455A77A5366AB534FF172AB0A121F37D180DCCD19607ABB0C41CB9F6F12B01303AC4A69DC2D1D05180181FD496D9769B46BFFEC3425"
  },

  // The first 7 bits for P-521 will always be zero.
  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "crv":"P-521",
      "kty":"EC",
      "d":"AU3LVJK4dtlbOEFb018ry-D-kYF7J7oQxXLpXcnQXbTh42FORGGGtySTA83gT_GiHJ0tnvgVrDdUMK1muJBGPrRf",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 7,
    "derived_bytes": "00"
  },

  // Using different key pairs, verify again that the first 7 bits are zero.
  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "kty": "EC",
      "crv": "P-521",
      "d": "Ab1WvRBhGO2iRhVb1DtCuOE_Cm4l3TuzdgJvq03JK2FXvG3-wtFd09DPKjmqaElAQq9IupYBEY2oLG8hCKOiA610",
      "x": "AS-8rv-mpR8-5NPStRxd7G18cmyjU_wBTqK_fPu5uRDTLL-moA_jm2zbiUbyJ3U5iy4jPAzxRNeMindCtceju10j",
      "y": "AJze-CPde_mnnozOrNLkUnwjHQrllnrwlY6THX3czygFo-YY3DA5_sn-u9MwUv5MD-6Y8DMQYGSYLYj04DVJ1KZN"
    },

    "length_bits": 7,
    "derived_bytes": "00"
  },

  // Same as an earlier test, however the public key specifies the extraneous
  // {"use": "sig"}. This doesn't make sense for ECDH; however, it is allowed
  // by the implementation. This is not spec compliant, see:
  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27601
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o",
      "use": "sig"
    },

    "length_bits": 0,
    "derived_bytes": ""
  },

  // Same test as above, but instead of "use" it uses "key_ops" with bogus
  // values for ECDH
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o",
      "key_ops": ["encrypt", "decrypt"]
    },

    "length_bits": 0,
    "derived_bytes": ""
  },

  // -----------------------------------------
  // Errors
  // -----------------------------------------

  // The length is too long, by 1 bit
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    "length_bits": 257,
    "error": "OperationError: Length specified for ECDH key derivation is too large. Maximum allowed is 256 bits"
  },

  // The length is too long, by 1 byte
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },
    "public_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o"
    },

    "length_bits": 264,
    "error": "OperationError: Length specified for ECDH key derivation is too large. Maximum allowed is 256 bits"
  },

  // Curve mismatch (public key is for P-521 however private key was for P-256).
  {
    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE",
      "d":"CQ8uF_-zB1NftLO6ytwKM3Cnuol64PQw5qOuCzQJeFU"
    },

    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "length_bits": 256,
    "error": "InvalidAccess: The public parameter for ECDH key derivation is for a different named curve"
  },

  // Ask for 529 bits using P-521, which is too much.
  {
    "public_key": {
      "crv":"P-521",
      "kty":"EC",
      "x":"ACw6DX7wqwHVO-JzyOet0B-r10YVLv5R5q_IfiWCzclg0u_x57NCtOcFCFpM2ZnS22tyYjZb0gBHGcgUE_I-h-6s",
      "y":"Actm2tCHBPOKLZMpJV3DaVOluln9zBsE2I0g6iV73I4M-liqA1rLSJN8q-vcSQtZF0JvzwuvGkGuTbvT_DaRQ2pf"
    },

    "private_key": {
      "crv":"P-521",
      "kty":"EC",
      "d":"AU3LVJK4dtlbOEFb018ry-D-kYF7J7oQxXLpXcnQXbTh42FORGGGtySTA83gT_GiHJ0tnvgVrDdUMK1muJBGPrRf",
      "x":"ADRllQ0B7icrnJ7ib2r-CXvymGFiC_3f6_o0SzLMBIggM8ndQm9l768SToMy1hUo64JsofGSQ37P4CRqT_QeivBD",
      "y":"ALKEzew1Xe4Sv86lZVqb2xxZ0l7WrE3DPJ93fUtSPih5iH8jg0GPDKMVoA5ffFmqPwbdgS2BK18PBFIT7QDGb2Zx"
    },

    "length_bits": 529,
    "error": "OperationError: Length specified for ECDH key derivation is too large. Maximum allowed is 528 bits"
  },

  // Test derivation using a JWK that sets "use": "enc".
  // Regression test for https://crbug.com/641499
  {
    "public_key": {
      "crv": "P-256",
      "kty":"EC",
      "x":"u6dWhaRHrvFF0CiFVuUUFafU6ixveQf9trHDXJ8hgV8",
      "y":"thSm4LIY35vDD-5LE454eB7TShn919DVVGZ_7tWdjTE"
    },

    "private_key": {
      "kty":"EC",
      "crv":"P-256",
      "d":"uN2YSQvxuxhQQ9Y1XXjYi1vr2ZTdzuoDX18PYu4LU-0",
      "x":"S2S3tjygMB0DkM-N9jYUgGLt_9_H6km5P9V6V_KS4_4",
      "y":"03j8Tyqgrc4R4FAUV2C7-im96yMmfmO_5Om6Kr8YP3o",
      "use": "enc"
    },

    "length_bits": 256,
    "derived_bytes": "163FAA3FC4815D47345C8E959F707B2F1D3537E7B2EA1DAEC23CA8D0A242CFF3"
  }
]

