@@ -3,6 +3,7 @@ package v4
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "encoding/hex"
6
7
"errors"
7
8
"fmt"
8
9
"io"
@@ -372,6 +373,62 @@ func TestUseDynamicPayloadSigningMiddleware(t *testing.T) {
372
373
}
373
374
}
374
375
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
+
375
432
type nonSeeker struct {}
376
433
377
434
func (nonSeeker ) Read (p []byte ) (n int , err error ) {
0 commit comments