Skip to content

Commit f038ed7

Browse files
authored
Merge pull request #32 from mikpe/sigv4a-followup
Sigv4a followup
2 parents 81caaec + 599c613 commit f038ed7

File tree

6 files changed

+23
-38
lines changed

6 files changed

+23
-38
lines changed

src/aws_sigv4_internal.erl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,28 @@
66
, resolve_time/1
77
]).
88

9-
%% exported for tests
9+
-ifdef(TEST).
1010
-export([ build_canonical_request/1
1111
, default_is_signed/1
1212
, resolve_payload_hash/1
1313
, set_required_headers/1
1414
]).
15+
-endif.
1516

1617
-include("aws_sigv4_internal.hrl").
1718

1819
-type credentials() :: #credentials{}.
20+
-type headers() :: [{binary(), binary()}].
1921
-type internal_signer() :: #internal_signer{}.
2022
-type request() :: #request{}.
23+
-type sign_string() :: fun((binary()) -> {ok, binary()} | {error, any()}).
2124
-type v4_signer_options() :: #v4_signer_options{}.
2225

2326
-export_type([ credentials/0
2427
, headers/0
2528
, internal_signer/0
2629
, request/0
30+
, sign_string/0
2731
, v4_signer_options/0
2832
]).
2933

@@ -132,7 +136,7 @@ build_canonical_request(Signer) ->
132136

133137
-spec build_canonical_method(internal_signer()) -> binary().
134138
build_canonical_method(Signer) ->
135-
aws_sigv4_utils:toupper(Signer#internal_signer.request#request.method).
139+
string:uppercase(Signer#internal_signer.request#request.method).
136140

137141
-spec build_canonical_path(internal_signer()) -> binary().
138142
build_canonical_path(Signer) ->
@@ -189,7 +193,7 @@ build_canonical_headers(Signer) ->
189193
SignedHeadersMap =
190194
lists:foldl(
191195
fun({Header, Value}, Map) ->
192-
Lowercase = aws_sigv4_utils:tolower(Header),
196+
Lowercase = string:lowercase(Header),
193197
case IsSigned(Lowercase) of
194198
true ->
195199
Values = maps:get(Lowercase, Map, []),
@@ -204,7 +208,7 @@ build_canonical_headers(Signer) ->
204208
fun({Header, Values}) ->
205209
[ Header
206210
, ":"
207-
, lists:join(",", lists:map(fun aws_sigv4_utils:trimspace/1, lists:reverse(Values)))
211+
, lists:join(",", lists:map(fun string:trim/1, lists:reverse(Values)))
208212
, "\n"
209213
]
210214
end, SignedHeadersList)),

src/aws_sigv4_internal.hrl

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
-ifndef(_AWS_SIGV4_INTERNAL_HRL_).
22
-define(_AWS_SIGV4_INTERNAL_HRL_, true).
33

4-
-type headers() :: [{binary(), binary()}].
5-
64
-record(request,
75
{ method :: binary()
86
, url :: binary()
9-
, headers :: headers()
7+
, headers :: aws_sigv4_internal:headers()
108
, body :: binary()
119
, host :: binary()
1210
}).
@@ -21,10 +19,8 @@
2119

2220
%% https://github.com/aws/smithy-go/blob/main/aws-http-auth/v4/v4.go
2321

24-
-type is_signed() :: fun((binary()) -> boolean()).
25-
2622
-record(v4_signer_options,
27-
{ is_signed :: is_signed() | undefined
23+
{ is_signed :: fun((binary()) -> boolean()) | undefined
2824
, disable_implicit_payload_hashing = false :: boolean()
2925
, disable_double_path_escape = false :: boolean()
3026
, add_payload_hash_header = false :: boolean()
@@ -34,8 +30,6 @@
3430

3531
%% https://github.com/aws/smithy-go/blob/main/aws-http-auth/internal/v4/signer.go
3632

37-
-type sign_string() :: fun((binary()) -> {ok, binary()} | {error, any()}).
38-
3933
-record(internal_signer,
4034
{ request :: aws_sigv4_internal:request()
4135
, payload_hash :: binary() % raw binary, NOT hex-encoded
@@ -44,7 +38,7 @@
4438
, options :: aws_sigv4_internal:v4_signer_options()
4539
, algorithm :: binary()
4640
, credential_scope :: binary()
47-
, sign_string :: sign_string()
41+
, sign_string :: aws_sigv4_internal:sign_string()
4842
}).
4943

5044
%% https://github.com/aws/smithy-go/blob/main/aws-http-auth/sigv4a/sigv4a.go

src/aws_sigv4_utils.erl

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
, format_time_long/1
55
, format_time_short/1
66
, sha256/1
7-
, tolower/1
8-
, toupper/1
9-
, trimspace/1
107
]).
118

129
-spec binaries_join(binary(), [binary()]) -> binary().
@@ -44,15 +41,3 @@ maybe_pad(X) ->
4441
-spec sha256(binary()) -> binary().
4542
sha256(Binary) ->
4643
crypto:hash(sha256, Binary).
47-
48-
-spec tolower(binary()) -> binary().
49-
tolower(Binary) ->
50-
list_to_binary(string:lowercase(binary_to_list(Binary))).
51-
52-
-spec toupper(binary()) -> binary().
53-
toupper(Binary) ->
54-
list_to_binary(string:uppercase(binary_to_list(Binary))).
55-
56-
-spec trimspace(binary()) -> binary().
57-
trimspace(Binary) ->
58-
list_to_binary(string:trim(binary_to_list(Binary))).

src/aws_sigv4a.erl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
-export([ sign_request/10
66
]).
77

8-
%% exported for tests
8+
-ifdef(TEST).
99
-export([ sign_request/2
1010
]).
11+
-endif.
1112

1213
-include("aws_sigv4_internal.hrl").
1314

@@ -19,8 +20,8 @@
1920
-define(ALGORITHM, <<"AWS4-ECDSA-P256-SHA256">>).
2021

2122
-spec sign_request(binary(), binary(), binary(), [binary()], binary(),
22-
binary(), binary(), headers(), binary(), map())
23-
-> {ok, headers()} | {error, any()}.
23+
binary(), binary(), aws_sigv4_internal:headers(), binary(), map())
24+
-> {ok, aws_sigv4_internal:headers()} | {error, any()}.
2425
sign_request(AccessKeyID, SecretAccessKey, SessionToken, Regions,
2526
Service, Method, URL, Headers, Body, Options) ->
2627
Credentials =
@@ -56,7 +57,7 @@ sign_request(AccessKeyID, SecretAccessKey, SessionToken, Regions,
5657
sign_request(V4ASignerOptions, V4ASignRequestInput).
5758

5859
-spec sign_request(aws_sigv4_internal:v4_signer_options(), v4a_sign_request_input())
59-
-> {ok, headers()} | {error, any()}.
60+
-> {ok, aws_sigv4_internal:headers()} | {error, any()}.
6061
sign_request(Options, SignRequestInput) ->
6162
case aws_sigv4a_credentials:derive(SignRequestInput#v4a_sign_request_input.credentials) of
6263
{ok, PrivateKey} ->
@@ -88,7 +89,7 @@ scope(Time, Service) ->
8889
<<(aws_sigv4_utils:format_time_short(Time))/binary, $/, Service/binary, $/, <<"aws4_request">>/binary>>.
8990

9091
%% sigv4a.SignString
91-
-spec sign_string(binary()) -> sign_string().
92+
-spec sign_string(binary()) -> aws_sigv4_internal:sign_string().
9293
sign_string(PrivateKey) ->
9394
fun(StrToSign) ->
9495
{ok, aws_signature_utils:base16(ecdsa_sign(PrivateKey, aws_sigv4_utils:sha256(StrToSign)))}

src/aws_sigv4a_credentials.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
-export([ derive/1
66
]).
77

8-
%% exported for tests
8+
-ifdef(TEST).
99
-export([ derive_private_key/1
1010
]).
11+
-endif.
1112

1213
-include("aws_sigv4_internal.hrl").
1314

test/aws_sigv4a_tests.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ test_sign_request(TT) ->
268268
expect_signature(Headers, TT),
269269
?assertEqual(Input#v4a_sign_request_input.request#request.host, get_header(<<"Host">>, Headers)).
270270

271-
-spec expect_signature(headers(), #sign_request_test{}) -> ok.
271+
-spec expect_signature(aws_sigv4_internal:headers(), #sign_request_test{}) -> ok.
272272
expect_signature(Headers, TT) ->
273273
{Preamble, SignedHeaders, Signature} = get_signature(Headers),
274274
?assertEqual(TT#sign_request_test.preamble, Preamble),
@@ -282,20 +282,20 @@ public_key(PrivateKey) ->
282282
{PublicKey, _PrivateKey} = crypto:generate_key(ecdh, secp256r1, PrivateKey),
283283
PublicKey.
284284

285-
-spec get_signature(headers()) -> {binary(), binary(), binary()}.
285+
-spec get_signature(aws_sigv4_internal:headers()) -> {binary(), binary(), binary()}.
286286
get_signature(Headers) ->
287287
Auth = get_header(<<"Authorization">>, Headers),
288288
[Preamble, SignedHeaders, SigPart] = binary:split(Auth, <<", ">>, [global]),
289289
[_Key, Hex] = binary:split(SigPart, <<"=">>, [global]),
290290
Signature = binary:decode_hex(Hex),
291291
{Preamble, SignedHeaders, Signature}.
292292

293-
-spec get_header(binary(), headers()) -> binary().
293+
-spec get_header(binary(), aws_sigv4_internal:headers()) -> binary().
294294
get_header(Key, Headers) ->
295295
{_Key, Hdr} = lists:keyfind(Key, 1, Headers),
296296
Hdr.
297297

298-
-spec get_header_opt(binary(), headers()) -> binary() | false.
298+
-spec get_header_opt(binary(), aws_sigv4_internal:headers()) -> binary() | false.
299299
get_header_opt(Key, Headers) ->
300300
case lists:keyfind(Key, 1, Headers) of
301301
false -> false;

0 commit comments

Comments
 (0)