Skip to content

Commit e3517a1

Browse files
committed
Adding Authorization header tests and fixing bug introduced in #40
1 parent 9e4d109 commit e3517a1

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

src/main/java/com/netspi/awssigner/signing/ParsedAuthHeader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class ParsedAuthHeader {
1515
private static final String AUTH_HEADER_PATTERN_SERVICE_GROUP = "service";
1616
private static final String AUTH_HEADER_PATTERN_SIGNED_HEADERS_GROUP = "signedheaders";
1717
private static final String AUTH_HEADER_PATTERN_SIGNATURE_GROUP = "signature";
18-
private static final Pattern AUTH_HEADER_PATTERN = Pattern.compile("Authorization:\\s*(?<" + AUTH_HEADER_PATTERN_ALGORITHM_GROUP + ">AWS4-(?:HMAC|ECDSA-P256)-SHA256)\\s*Credential=(?<" + AUTH_HEADER_PATTERN_ACCESS_KEY_GROUP + ">[\\w-]{1,128})\\/(?<" + AUTH_HEADER_PATTERN_DATE_GROUP + ">\\d{8})\\/(?:(?<" + AUTH_HEADER_PATTERN_REGION_GROUP + ">[\\w-]{0,64})\\/)?(?<" + AUTH_HEADER_PATTERN_SERVICE_GROUP + ">\\S{0,128})\\/aws4_request(,|\\s)+SignedHeaders=(?<" + AUTH_HEADER_PATTERN_SIGNED_HEADERS_GROUP + ">\\S+)(,|\\s)+Signature=(?<" + AUTH_HEADER_PATTERN_SIGNATURE_GROUP + ">[a-fA-F\\d]{1,256})", Pattern.CASE_INSENSITIVE);
18+
private static final Pattern AUTH_HEADER_PATTERN = Pattern.compile("Authorization:\\s*(?<" + AUTH_HEADER_PATTERN_ALGORITHM_GROUP + ">AWS4-(?:HMAC|ECDSA-P256)-SHA256)\\s*Credential=(?<" + AUTH_HEADER_PATTERN_ACCESS_KEY_GROUP + ">[\\w-]{1,128})\\/(?<" + AUTH_HEADER_PATTERN_DATE_GROUP + ">\\d{8})\\/(?:(?<" + AUTH_HEADER_PATTERN_REGION_GROUP + ">[\\w-]{0,64})\\/)?(?<" + AUTH_HEADER_PATTERN_SERVICE_GROUP + ">\\S{0,128})\\/aws4_request[,\\s]+SignedHeaders=(?<" + AUTH_HEADER_PATTERN_SIGNED_HEADERS_GROUP + ">\\S+?)[,\\s]+Signature=(?<" + AUTH_HEADER_PATTERN_SIGNATURE_GROUP + ">[a-fA-F\\d]{1,256})", Pattern.CASE_INSENSITIVE);
1919

2020
private final SigningAlgorithm algorithm;
2121
private final String accessKey;
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.netspi.awssigner.signing;
2+
3+
import java.util.Optional;
4+
import org.junit.jupiter.api.Test;
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
public class ParsedAuthHeaderTest {
8+
9+
@Test
10+
public void testTypical1CommaAnd1Space() {
11+
String testHeader = "Authorization: AWS4-HMAC-SHA256 Credential=ASIAXXXXXXXXXXXXXXXX/20230901/us-east-1/XXXX/aws4_request SignedHeaders=content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target, Signature=64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464";
12+
//Parse the header
13+
Optional<ParsedAuthHeader> result = ParsedAuthHeader.parseFromAuthorizationHeader(testHeader);
14+
//Ensure it parsed successfully.
15+
assertTrue(result.isPresent());
16+
//Extract the result
17+
ParsedAuthHeader parsedHeader = result.get();
18+
19+
//Ensure all fields were extracted properly.
20+
assertEquals(SigningAlgorithm.SIGV4,parsedHeader.getAlgorithm());
21+
assertEquals("ASIAXXXXXXXXXXXXXXXX",parsedHeader.getAccessKey());
22+
assertEquals("20230901",parsedHeader.getDate());
23+
assertEquals("us-east-1",parsedHeader.getRegion().get());
24+
assertEquals("XXXX",parsedHeader.getService());
25+
assertEquals("content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target",parsedHeader.getSignedHeaders());
26+
assertEquals("64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464",parsedHeader.getSignature());
27+
}
28+
29+
@Test
30+
public void testNoCommaAnd1Space() {
31+
String testHeader = "Authorization: AWS4-HMAC-SHA256 Credential=ASIAXXXXXXXXXXXXXXXX/20230901/us-east-1/XXXX/aws4_request SignedHeaders=content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target Signature=64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464";
32+
//Parse the header
33+
Optional<ParsedAuthHeader> result = ParsedAuthHeader.parseFromAuthorizationHeader(testHeader);
34+
//Ensure it parsed successfully.
35+
assertTrue(result.isPresent());
36+
//Extract the result
37+
ParsedAuthHeader parsedHeader = result.get();
38+
39+
//Ensure all fields were extracted properly.
40+
assertEquals(SigningAlgorithm.SIGV4,parsedHeader.getAlgorithm());
41+
assertEquals("ASIAXXXXXXXXXXXXXXXX",parsedHeader.getAccessKey());
42+
assertEquals("20230901",parsedHeader.getDate());
43+
assertEquals("us-east-1",parsedHeader.getRegion().get());
44+
assertEquals("XXXX",parsedHeader.getService());
45+
assertEquals("content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target",parsedHeader.getSignedHeaders());
46+
assertEquals("64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464",parsedHeader.getSignature());
47+
}
48+
49+
@Test
50+
public void test1CommaAndNoSpace() {
51+
String testHeader = "Authorization: AWS4-HMAC-SHA256 Credential=ASIAXXXXXXXXXXXXXXXX/20230901/us-east-1/XXXX/aws4_request SignedHeaders=content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target,Signature=64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464";
52+
//Parse the header
53+
Optional<ParsedAuthHeader> result = ParsedAuthHeader.parseFromAuthorizationHeader(testHeader);
54+
//Ensure it parsed successfully.
55+
assertTrue(result.isPresent());
56+
//Extract the result
57+
ParsedAuthHeader parsedHeader = result.get();
58+
59+
//Ensure all fields were extracted properly.
60+
assertEquals(SigningAlgorithm.SIGV4,parsedHeader.getAlgorithm());
61+
assertEquals("ASIAXXXXXXXXXXXXXXXX",parsedHeader.getAccessKey());
62+
assertEquals("20230901",parsedHeader.getDate());
63+
assertEquals("us-east-1",parsedHeader.getRegion().get());
64+
assertEquals("XXXX",parsedHeader.getService());
65+
assertEquals("content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target",parsedHeader.getSignedHeaders());
66+
assertEquals("64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464",parsedHeader.getSignature());
67+
}
68+
@Test
69+
public void testManyCommasAnd1Space() {
70+
String testHeader = "Authorization: AWS4-HMAC-SHA256 Credential=ASIAXXXXXXXXXXXXXXXX/20230901/us-east-1/XXXX/aws4_request SignedHeaders=content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target,,,,,,,,,,,,, Signature=64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464";
71+
//Parse the header
72+
Optional<ParsedAuthHeader> result = ParsedAuthHeader.parseFromAuthorizationHeader(testHeader);
73+
//Ensure it parsed successfully.
74+
assertTrue(result.isPresent());
75+
//Extract the result
76+
ParsedAuthHeader parsedHeader = result.get();
77+
78+
//Ensure all fields were extracted properly.
79+
assertEquals(SigningAlgorithm.SIGV4,parsedHeader.getAlgorithm());
80+
assertEquals("ASIAXXXXXXXXXXXXXXXX",parsedHeader.getAccessKey());
81+
assertEquals("20230901",parsedHeader.getDate());
82+
assertEquals("us-east-1",parsedHeader.getRegion().get());
83+
assertEquals("XXXX",parsedHeader.getService());
84+
assertEquals("content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target",parsedHeader.getSignedHeaders());
85+
assertEquals("64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464",parsedHeader.getSignature());
86+
}
87+
@Test
88+
public void testManyCommasAndNoSpace() {
89+
String testHeader = "Authorization: AWS4-HMAC-SHA256 Credential=ASIAXXXXXXXXXXXXXXXX/20230901/us-east-1/XXXX/aws4_request SignedHeaders=content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target,,,,,,,,,,,,,Signature=64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464";
90+
//Parse the header
91+
Optional<ParsedAuthHeader> result = ParsedAuthHeader.parseFromAuthorizationHeader(testHeader);
92+
//Ensure it parsed successfully.
93+
assertTrue(result.isPresent());
94+
//Extract the result
95+
ParsedAuthHeader parsedHeader = result.get();
96+
97+
//Ensure all fields were extracted properly.
98+
assertEquals(SigningAlgorithm.SIGV4,parsedHeader.getAlgorithm());
99+
assertEquals("ASIAXXXXXXXXXXXXXXXX",parsedHeader.getAccessKey());
100+
assertEquals("20230901",parsedHeader.getDate());
101+
assertEquals("us-east-1",parsedHeader.getRegion().get());
102+
assertEquals("XXXX",parsedHeader.getService());
103+
assertEquals("content-encoding;host;x-amz-date;x-amz-requestsupertrace;x-amz-target",parsedHeader.getSignedHeaders());
104+
assertEquals("64ed7bf1ee17050e2a38b4c878ca6471c341b78cdb428bcec52cc6b58f1a8464",parsedHeader.getSignature());
105+
}
106+
107+
108+
}

0 commit comments

Comments
 (0)