Browse Source

Add signature verification.

Tim Fletcher 16 years ago
parent
commit
d8de36df58
2 changed files with 38 additions and 6 deletions
  1. 24 5
      src/oauth.erl
  2. 14 1
      src/oauth_rsa_sha1.erl

+ 24 - 5
src/oauth.erl

@@ -1,10 +1,17 @@
 -module(oauth).
 
--export([get/5, post/5, uri/2, header/1]).
-
--export([token/1, token_secret/1]).
-
--export([signed_params/6, signature/5, signature_base_string/3]).
+-export(
+  [ get/5
+  , header/1
+  , post/5
+  , signature/5
+  , signature_base_string/3
+  , signed_params/6
+  , token/1
+  , token_secret/1
+  , uri/2
+  , verify/6
+  ]).
 
 
 get(URL, ExtraParams, Consumer, Token, TokenSecret) ->
@@ -29,6 +36,18 @@ token(Params) ->
 token_secret(Params) ->
   proplists:get_value("oauth_token_secret", Params).
 
+verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret) ->
+  case signature_method(Consumer) of
+    plaintext ->
+      Signature =:= signature(HttpMethod, URL, Params, Consumer, TokenSecret);
+    hmac_sha1 ->
+      Signature =:= signature(HttpMethod, URL, Params, Consumer, TokenSecret);
+    rsa_sha1 ->
+      BaseString = signature_base_string(HttpMethod, URL, Params),
+      PublicKey = oauth_rsa_sha1:public_key(consumer_secret(Consumer)),
+      public_key:verify_signature(BaseString, sha, Signature, PublicKey)
+  end.
+
 signed_params(HttpMethod, URL, ExtraParams, Consumer, Token, TokenSecret) ->
   Params = token_param(Token, params(Consumer, ExtraParams)),
   [{"oauth_signature", signature(HttpMethod, URL, Params, Consumer, TokenSecret)}|Params].

+ 14 - 1
src/oauth_rsa_sha1.erl

@@ -1,9 +1,22 @@
 -module(oauth_rsa_sha1).
 
--export([signature/2]).
+-export([signature/2, public_key/1]).
+
+-include_lib("public_key/include/public_key.hrl").
 
 
 signature(BaseString, PrivateKeyPath) ->
   {ok, [Info]} = public_key:pem_to_der(PrivateKeyPath),
   {ok, PrivateKey} = public_key:decode_private_key(Info),
   base64:encode_to_string(public_key:sign(list_to_binary(BaseString), PrivateKey)).
+
+public_key(Path) when is_list(Path) ->
+  {ok, [{cert, DerCert, not_encrypted}]} = public_key:pem_to_der(Path),
+  {ok, Cert} = pubkey_cert_records:decode_cert(DerCert, otp),
+  public_key(Cert);
+public_key(#'OTPCertificate'{tbsCertificate=Cert}) ->
+  public_key(Cert);
+public_key(#'OTPTBSCertificate'{subjectPublicKeyInfo=Info}) ->
+  public_key(Info);
+public_key(#'OTPSubjectPublicKeyInfo'{subjectPublicKey=Key}) ->
+  Key.