You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2014/01/17 23:57:41 UTC
[37/50] git commit: Use a constant time algorithm to compare
signature strings.
Use a constant time algorithm to compare signature strings.
This guards against timing attacks of the class outlined
in http://codahale.com/a-lesson-in-timing-attacks/
Project: http://git-wip-us.apache.org/repos/asf/couchdb-oauth/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-oauth/commit/8abf2d69
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-oauth/tree/8abf2d69
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-oauth/diff/8abf2d69
Branch: refs/heads/import
Commit: 8abf2d69fa5aa4c78c1a6222336d6e0dff7904b3
Parents: 29cb478
Author: Jan Lehnardt <ja...@apache.org>
Authored: Fri Oct 14 15:57:17 2011 +0200
Committer: Jan Lehnardt <ja...@apache.org>
Committed: Fri Oct 14 15:59:59 2011 +0200
----------------------------------------------------------------------
src/oauth.erl | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-oauth/blob/8abf2d69/src/oauth.erl
----------------------------------------------------------------------
diff --git a/src/oauth.erl b/src/oauth.erl
index c46728f..692ac19 100644
--- a/src/oauth.erl
+++ b/src/oauth.erl
@@ -124,10 +124,10 @@ hmac_sha1_signature(BaseString, Consumer, TokenSecret) ->
base64:encode_to_string(crypto:sha_mac(Key, BaseString)).
hmac_sha1_verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret) ->
- Signature =:= hmac_sha1_signature(HttpMethod, URL, Params, Consumer, TokenSecret).
+ verify_in_constant_time(Signature, hmac_sha1_signature(HttpMethod, URL, Params, Consumer, TokenSecret)).
hmac_sha1_verify(Signature, BaseString, Consumer, TokenSecret) ->
- Signature =:= hmac_sha1_signature(BaseString, Consumer, TokenSecret).
+ verify_in_constant_time(Signature, hmac_sha1_signature(BaseString, Consumer, TokenSecret)).
rsa_sha1_signature(HttpMethod, URL, Params, Consumer) ->
BaseString = signature_base_string(HttpMethod, URL, Params),
@@ -145,6 +145,22 @@ rsa_sha1_verify(Signature, BaseString, Consumer) ->
Key = read_cert_key(consumer_secret(Consumer)),
public_key:verify(to_binary(BaseString), sha, base64:decode(Signature), Key).
+verify_in_constant_time([X|RestX], [Y|RestY], Result) ->
+ verify_in_constant_time(RestX, RestY, (X bxor Y) bor Result);
+verify_in_constant_time([], [], Result) ->
+ Result == 0.
+
+verify_in_constant_time(<<X/binary>>, <<Y/binary>>) ->
+ verify_in_constant_time(binary_to_list(X), binary_to_list(Y));
+verify_in_constant_time(X, Y) when is_list(X) and is_list(Y) ->
+ case length(X) == length(Y) of
+ true ->
+ verify_in_constant_time(X, Y, 0);
+ false ->
+ false
+ end;
+verify_in_constant_time(_X, _Y) -> false.
+
signature_base_string(HttpMethod, URL, Params) ->
uri_join([HttpMethod, uri_normalize(URL), params_encode(Params)]).