erlang-jose
erlang-jose copied to clipboard
Test vectors for ECDH-1PU+XC20PKW
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 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"
}
Thank you so much! I guess we can close this issue now.