@@ -27,31 +27,41 @@ defmodule LTIResult do
2727 {:ok, "iyyQNRQyXTlpLJPJns3ireWjQxo%3D"}
2828 """
2929 def signature ( url , oauth_header , secret ) do
30- { parameters , [ { "oauth_signature" , received_signature } ] } =
31- extract_header_elements ( oauth_header )
32-
33- with { :ok , _ } <- validate_parameters ( parameters ) do
34- basestring = base_string ( url , parameters )
35-
36- signature = generate_signature ( secret , basestring )
37-
38- if signature == received_signature do
39- { :ok , signature }
40- else
41- { :error , [ :unmatching_signatures ] }
30+ with { parameters , [ { "oauth_signature" , received_signature } ] } <-
31+ extract_header_elements ( oauth_header ) ,
32+ { :ok , _ } <- validate_parameters ( parameters ) ,
33+ { _ , signature_method } <-
34+ List . keyfind (
35+ parameters ,
36+ "oauth_signature_method" ,
37+ 0 ,
38+ { "oauth_signature_method" , "HMAC-SHA1" }
39+ ) ,
40+ basestring <- base_string ( url , parameters ) ,
41+ signature <- generate_signature ( secret , signature_method , basestring ) do
42+ case signature == received_signature do
43+ true ->
44+ { :ok , signature }
45+
46+ false ->
47+ { :error , [ :unmatching_signatures ] }
4248 end
4349 end
4450 end
4551
46- defp generate_signature ( secret , basestring ) do
47- :sha
52+ defp generate_signature ( secret , signature_method , basestring ) do
53+ signature_method
54+ |> get_signature_method ( )
4855 |> LTI . hmac_fun (
4956 percent_encode ( secret ) <> "&" ,
5057 basestring
5158 )
5259 |> Base . encode64 ( )
5360 end
5461
62+ defp get_signature_method ( "HMAC-SHA256" ) , do: :sha256
63+ defp get_signature_method ( _ ) , do: :sha
64+
5565 defp extract_header_elements ( header ) do
5666 header
5767 |> String . trim_leading ( "OAuth " )
0 commit comments