Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test vectors for ECDH-1PU+XC20PKW #112

Open
awoie opened this issue Apr 29, 2021 · 2 comments
Open

Test vectors for ECDH-1PU+XC20PKW #112

awoie opened this issue Apr 29, 2021 · 2 comments

Comments

@awoie
Copy link

awoie commented Apr 29, 2021

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.

@potatosalad
Copy link
Owner

@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"
}

@awoie
Copy link
Author

awoie commented Sep 12, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants