Skip to content

Commit f0caa97

Browse files
committed
patching GetSignedRequestSignature to cover edge cases with the signature
1 parent e058903 commit f0caa97

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

.DS_Store

8 KB
Binary file not shown.

aws/signer/v4/middleware.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,9 @@ func GetSignedRequestSignature(r *http.Request) ([]byte, error) {
372372
const authHeaderSignatureElem = "Signature="
373373

374374
if auth := r.Header.Get(authorizationHeader); len(auth) != 0 {
375-
ps := strings.Split(auth, ", ")
375+
ps := strings.Split(auth, ",")
376376
for _, p := range ps {
377+
p = strings.Trim(p, " ")
377378
if idx := strings.Index(p, authHeaderSignatureElem); idx >= 0 {
378379
sig := p[len(authHeaderSignatureElem):]
379380
if len(sig) == 0 {

aws/signer/v4/middleware_test.go

+57
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package v4
33
import (
44
"bytes"
55
"context"
6+
"encoding/hex"
67
"errors"
78
"fmt"
89
"io"
@@ -372,6 +373,62 @@ func TestUseDynamicPayloadSigningMiddleware(t *testing.T) {
372373
}
373374
}
374375

376+
func TestGetSignedRequestSignature(t *testing.T) {
377+
testCases := map[string]struct {
378+
authHeader string
379+
expectedSig string
380+
expectedErrMsg string
381+
}{
382+
"Valid signature": {
383+
authHeader: "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024",
384+
expectedSig: "fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024",
385+
},
386+
"Whitespace after Signature": {
387+
authHeader: "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024 ",
388+
expectedSig: "fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024",
389+
},
390+
"Whitespaces before Signature": {
391+
authHeader: "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024 ",
392+
expectedSig: "fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024",
393+
},
394+
"Empty signature": {
395+
authHeader: "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=",
396+
expectedErrMsg: "invalid request signature authorization header",
397+
},
398+
"Missing signature": {
399+
authHeader: "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date",
400+
expectedErrMsg: "request not signed",
401+
},
402+
}
403+
404+
for name, tc := range testCases {
405+
t.Run(name, func(t *testing.T) {
406+
r, err := http.NewRequest("GET", "/", nil)
407+
if err != nil {
408+
t.Fatalf("Failed to create request: %v", err)
409+
}
410+
r.Header.Set("Authorization", tc.authHeader)
411+
412+
sig, err := GetSignedRequestSignature(r)
413+
414+
if tc.expectedErrMsg != "" {
415+
if err == nil {
416+
t.Errorf("Expected error with message '%s', but got no error", tc.expectedErrMsg)
417+
} else if err.Error() != tc.expectedErrMsg {
418+
t.Errorf("Expected error message '%s', but got '%s'", tc.expectedErrMsg, err.Error())
419+
}
420+
} else {
421+
if err != nil {
422+
t.Errorf("Unexpected error: %v", err)
423+
}
424+
if hex.EncodeToString(sig) != tc.expectedSig {
425+
t.Errorf("Expected signature '%s', but got '%s'", tc.expectedSig, hex.EncodeToString(sig))
426+
}
427+
}
428+
})
429+
}
430+
}
431+
375432
type nonSeeker struct{}
376433

377434
func (nonSeeker) Read(p []byte) (n int, err error) {

service/.DS_Store

8 KB
Binary file not shown.

0 commit comments

Comments
 (0)