diff --git a/lib/joken/signer.ex b/lib/joken/signer.ex index 49ebd4c..d5cbcca 100644 --- a/lib/joken/signer.ex +++ b/lib/joken/signer.ex @@ -100,6 +100,14 @@ defmodule Joken.Signer do ) end + def create(alg, %JWK{} = key, headers) when alg in @map_key_algorithms do + raw_create( + alg, + headers |> transform_headers(alg) |> JWS.from_map(), + key + ) + end + def create(alg, key, headers) when is_map(key) and alg in @map_key_algorithms do raw_create( alg, diff --git a/test/joken_signer_test.exs b/test/joken_signer_test.exs index 82fc23e..cfa0a70 100644 --- a/test/joken_signer_test.exs +++ b/test/joken_signer_test.exs @@ -106,6 +106,20 @@ defmodule Joken.Signer.Test do } = signer end + test "can create a signer from a JOSE JWK" do + map = Application.get_env(:joken, :rs256)[:key_map] + jwk = JOSE.JWK.from_map(map) + signer = Signer.create("RS256", jwk) + + assert %Signer{ + alg: "RS256", + jws: %JOSE.JWS{ + alg: {:jose_jws_alg_rsa_pkcs1_v1_5, :RS256} + }, + jwk: ^jwk + } = signer + end + test "raise with invalid parameter" do assert_raise Error, Error.message(%Error{reason: :algorithm_needs_key}), fn -> Signer.create("RS256", "Not a map")