erlang-jose icon indicating copy to clipboard operation
erlang-jose copied to clipboard

Test vectors for ECDH-1PU+XC20PKW

Open awoie opened this issue 3 years ago • 2 comments

We have an implementation of ECDH-1PU+XC20PKW here and I'm looking for test vectors. I'm not an Erlang developer and was wondering if someone could provide one very quick.

awoie avatar Apr 29 '21 22:04 awoie

@awoie If by "very quick" you mean "within 2 years", then yes 😄

The API in this library for ECDH-1PU is still pretty bad, but here's a quick script that can generate test vectors:

defmodule GenEcdh1puXc20pkw do
  def run() do
    v_static_secret_key = :jose_jwk.from_binary(~S|
      {
        "crv": "P-256",
        "d": "JPUl6o2Or-ez1P6xErxJvgvDcqz-gIOCdTmc14Kw0Dw",
        "kty": "EC",
        "x": "48QU3Q0CySxwJbEwWrJrYXlp88_dVpHTxq4avc66h5Q",
        "y": "ZzqrINtMMxHxQ-QB72RMcdlmDsOIwlKhMqVm_gYWC14"
      }
    |)
    v_static_public_key = :jose_jwk.to_public(v_static_secret_key)
    u_static_secret_key = :jose_jwk.from_binary(~S|
      {
        "crv": "P-256",
        "d": "gAB0DCnhFTox6hFClrfcD0SqW_WSL1lGZ3uxRU31yGI",
        "kty": "EC",
        "x": "imSaSn_lsP9WDa59yomGvyOiUHxcLTAQnaMpxfPe46w",
        "y": "4cSJ174j4JiKAfC_W66hs004QoIAUsPorNfKSEYsflI"
      }
    |)
    u_static_public_key = :jose_jwk.to_public(u_static_secret_key)
    u_ephemeral_secret_key = :jose_jwk.from_binary(~S|
      {
        "crv": "P-256",
        "d": "N7nGE9ZLZAuNbMt-DtlLZG2fejXEol9PIrfwp6TFS4Y",
        "kty": "EC",
        "x": "QwCbIiIqmocZhQ2yIT2FXX4NdHJlT35ODth2FYILUa8",
        "y": "yWnU05BUZPh91jOz4D_gYCPZPqecJenY4Zx9P4bI9jw"
      }
    |)
    u_ephemeral_public_key = :jose_jwk.to_public(u_ephemeral_secret_key)
    # v_box = {u_static_public_key, v_static_secret_key}
    # u_box = {v_static_public_key, u_static_secret_key, u_ephemeral_secret_key}
    plaintext = "abc"
    jwe_map = %{
      "alg" => "ECDH-1PU+XC20PKW",
      "enc" => "XC20P"
    }
    {_, encrypted_map} = :jose_jwk.box_encrypt_ecdh_1pu(plaintext, jwe_map, v_static_public_key, u_static_secret_key, u_ephemeral_secret_key)
    {_, encrypted_string} = :jose_jwe.compact(encrypted_map)
    {^plaintext, jwe} = :jose_jwk.box_decrypt_ecdh_1pu(encrypted_string, u_static_public_key, v_static_secret_key)
    IO.puts(OJSON.encode!(%{
      keys: %{
        v_static_secret_key: elem(:jose_jwk.to_map(v_static_secret_key), 1),
        v_static_public_key: elem(:jose_jwk.to_map(v_static_public_key), 1),
        u_static_secret_key: elem(:jose_jwk.to_map(u_static_secret_key), 1),
        u_static_public_key: elem(:jose_jwk.to_map(u_static_public_key), 1),
        u_ephemeral_secret_key: elem(:jose_jwk.to_map(u_ephemeral_secret_key), 1),
        u_ephemeral_public_key: elem(:jose_jwk.to_map(u_ephemeral_public_key), 1),
      },
      plaintext: plaintext,
      encrypted_map: encrypted_map,
      encrypted_string: encrypted_string,
      jwe: elem(JOSE.JWE.to_map(jwe), 1)
    }, [pretty: true]))
  end
end

Here's the JSON output from running GenEcdh1puXc20pkw.run():

{
  "encrypted_map": {
    "ciphertext": "ZOdY",
    "encrypted_key": "vUtaLQFbT7UXYcXXe7upLY5TvDEZcQf1a4iNn-hJK9c",
    "iv": "4dM9gT-fw1VpA9vXhrXG_DJNsV8nNcxH",
    "protected": "eyJhbGciOiJFQ0RILTFQVStYQzIwUEtXIiwiYXB1IjoicFNCWWthSXlQMGd3MUY4RDYxSjFwYkdieGh2dzRIa0l6RXpTRmU4aWxtMCIsImFwdiI6IkZwMjVsU01ZMzFRbVpxbk5XSHBYTHpsbDBoMVJtNXJxZ3J5QkdxRmFUVTgiLCJlbmMiOiJYQzIwUCIsImVwayI6eyJjcnYiOiJQLTI1NiIsImt0eSI6IkVDIiwieCI6IlF3Q2JJaUlxbW9jWmhRMnlJVDJGWFg0TmRISmxUMzVPRHRoMkZZSUxVYTgiLCJ5IjoieVduVTA1QlVaUGg5MWpPejREX2dZQ1BaUHFlY0plblk0Wng5UDRiSTlqdyJ9LCJpdiI6IjFlN1RCREsyX0RxNlAwQkdYSGFOTDJrNmxQTXhyUTRiIiwic2tpZCI6IlpJUW9IVDRuS3Qza3hPLUtJNS1vaWotVXhiNnJheFduNHM0bXdyZFA5NVEiLCJ0YWciOiJMbXJ4aDdsWVlHWGxJR3ZRdng3QWh3In0",
    "tag": "llZCaWFt6tMO0IlYCcBoJg"
  },
  "encrypted_string": "eyJhbGciOiJFQ0RILTFQVStYQzIwUEtXIiwiYXB1IjoicFNCWWthSXlQMGd3MUY4RDYxSjFwYkdieGh2dzRIa0l6RXpTRmU4aWxtMCIsImFwdiI6IkZwMjVsU01ZMzFRbVpxbk5XSHBYTHpsbDBoMVJtNXJxZ3J5QkdxRmFUVTgiLCJlbmMiOiJYQzIwUCIsImVwayI6eyJjcnYiOiJQLTI1NiIsImt0eSI6IkVDIiwieCI6IlF3Q2JJaUlxbW9jWmhRMnlJVDJGWFg0TmRISmxUMzVPRHRoMkZZSUxVYTgiLCJ5IjoieVduVTA1QlVaUGg5MWpPejREX2dZQ1BaUHFlY0plblk0Wng5UDRiSTlqdyJ9LCJpdiI6IjFlN1RCREsyX0RxNlAwQkdYSGFOTDJrNmxQTXhyUTRiIiwic2tpZCI6IlpJUW9IVDRuS3Qza3hPLUtJNS1vaWotVXhiNnJheFduNHM0bXdyZFA5NVEiLCJ0YWciOiJMbXJ4aDdsWVlHWGxJR3ZRdng3QWh3In0.vUtaLQFbT7UXYcXXe7upLY5TvDEZcQf1a4iNn-hJK9c.4dM9gT-fw1VpA9vXhrXG_DJNsV8nNcxH.ZOdY.llZCaWFt6tMO0IlYCcBoJg",
  "jwe": {
    "alg": "ECDH-1PU+XC20PKW",
    "apu": "pSBYkaIyP0gw1F8D61J1pbGbxhvw4HkIzEzSFe8ilm0",
    "apv": "Fp25lSMY31QmZqnNWHpXLzll0h1Rm5rqgryBGqFaTU8",
    "enc": "XC20P",
    "epk": {
      "crv": "P-256",
      "kty": "EC",
      "x": "QwCbIiIqmocZhQ2yIT2FXX4NdHJlT35ODth2FYILUa8",
      "y": "yWnU05BUZPh91jOz4D_gYCPZPqecJenY4Zx9P4bI9jw"
    },
    "iv": "1e7TBDK2_Dq6P0BGXHaNL2k6lPMxrQ4b",
    "skid": "ZIQoHT4nKt3kxO-KI5-oij-Uxb6raxWn4s4mwrdP95Q",
    "tag": "Lmrxh7lYYGXlIGvQvx7Ahw"
  },
  "keys": {
    "u_ephemeral_public_key": {
      "crv": "P-256",
      "kty": "EC",
      "x": "QwCbIiIqmocZhQ2yIT2FXX4NdHJlT35ODth2FYILUa8",
      "y": "yWnU05BUZPh91jOz4D_gYCPZPqecJenY4Zx9P4bI9jw"
    },
    "u_ephemeral_secret_key": {
      "crv": "P-256",
      "d": "N7nGE9ZLZAuNbMt-DtlLZG2fejXEol9PIrfwp6TFS4Y",
      "kty": "EC",
      "x": "QwCbIiIqmocZhQ2yIT2FXX4NdHJlT35ODth2FYILUa8",
      "y": "yWnU05BUZPh91jOz4D_gYCPZPqecJenY4Zx9P4bI9jw"
    },
    "u_static_public_key": {
      "crv": "P-256",
      "kty": "EC",
      "x": "imSaSn_lsP9WDa59yomGvyOiUHxcLTAQnaMpxfPe46w",
      "y": "4cSJ174j4JiKAfC_W66hs004QoIAUsPorNfKSEYsflI"
    },
    "u_static_secret_key": {
      "crv": "P-256",
      "d": "gAB0DCnhFTox6hFClrfcD0SqW_WSL1lGZ3uxRU31yGI",
      "kty": "EC",
      "x": "imSaSn_lsP9WDa59yomGvyOiUHxcLTAQnaMpxfPe46w",
      "y": "4cSJ174j4JiKAfC_W66hs004QoIAUsPorNfKSEYsflI"
    },
    "v_static_public_key": {
      "crv": "P-256",
      "kty": "EC",
      "x": "48QU3Q0CySxwJbEwWrJrYXlp88_dVpHTxq4avc66h5Q",
      "y": "ZzqrINtMMxHxQ-QB72RMcdlmDsOIwlKhMqVm_gYWC14"
    },
    "v_static_secret_key": {
      "crv": "P-256",
      "d": "JPUl6o2Or-ez1P6xErxJvgvDcqz-gIOCdTmc14Kw0Dw",
      "kty": "EC",
      "x": "48QU3Q0CySxwJbEwWrJrYXlp88_dVpHTxq4avc66h5Q",
      "y": "ZzqrINtMMxHxQ-QB72RMcdlmDsOIwlKhMqVm_gYWC14"
    }
  },
  "plaintext": "abc"
}

potatosalad avatar Sep 01 '22 16:09 potatosalad

Thank you so much! I guess we can close this issue now.

awoie avatar Sep 12 '22 11:09 awoie