@@ -27,31 +27,36 @@ 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 ( parameters , "oauth_signature_method" , 0 ) ,
35+ basestring <- base_string ( url , parameters ) ,
36+ signature <- generate_signature ( secret , signature_method , basestring ) do
37+ case signature == received_signature do
38+ true ->
39+ { :ok , signature }
40+
41+ false ->
42+ { :error , [ :unmatching_signatures ] }
4243 end
4344 end
4445 end
4546
46- defp generate_signature ( secret , basestring ) do
47- :sha
47+ defp generate_signature ( secret , signature_method , basestring ) do
48+ signature_method
49+ |> get_signature_method ( )
4850 |> :crypto . hmac (
4951 percent_encode ( secret ) <> "&" ,
5052 basestring
5153 )
5254 |> Base . encode64 ( )
5355 end
5456
57+ defp get_signature_method ( "HMAC-SHA256" ) , do: :sha256
58+ defp get_signature_method ( _ ) , do: :sha
59+
5560 defp extract_header_elements ( header ) do
5661 header
5762 |> String . trim_leading ( "OAuth " )
0 commit comments