@@ -3,6 +3,7 @@ package v4
33import (
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+
375432type nonSeeker struct {}
376433
377434func (nonSeeker ) Read (p []byte ) (n int , err error ) {
0 commit comments