@@ -1489,3 +1489,59 @@ func TestVerifyResponse(t *testing.T) {
14891489 })
14901490 }
14911491}
1492+
1493+ func TestOptionalSign (t * testing.T ) {
1494+ req := readRequest (httpreq2 )
1495+ f := NewFields ().AddHeader ("date" ).AddOptionalHeader ("x-optional" )
1496+ key1 := bytes .Repeat ([]byte {0x55 }, 64 )
1497+ signer , err := NewHMACSHA256Signer ("key1" , key1 , NewSignConfig ().setFakeCreated (9999 ), * f )
1498+ assert .NoError (t , err , "Could not create signer" )
1499+ sigInputHeader , _ , sigInput , err := signRequestDebug ("sig1" , * signer , req )
1500+ assert .NoError (t , err , "Should not fail with optional header absent" )
1501+ assert .Equal (t , "sig1=(\" date\" );created=9999;alg=\" hmac-sha256\" ;keyid=\" key1\" " , sigInputHeader )
1502+ assert .Equal (t , "\" date\" : Tue, 20 Apr 2021 02:07:55 GMT\n \" @signature-params\" : (\" date\" );created=9999;alg=\" hmac-sha256\" ;keyid=\" key1\" " , sigInput )
1503+
1504+ req .Header .Add ("X-Optional" , "value" )
1505+ sigInputHeader , _ , sigInput , err = signRequestDebug ("sig1" , * signer , req )
1506+ assert .NoError (t , err , "Should not fail with optional header present" )
1507+ assert .Equal (t , "sig1=(\" date\" \" x-optional\" );created=9999;alg=\" hmac-sha256\" ;keyid=\" key1\" " , sigInputHeader )
1508+ assert .Equal (t , "\" date\" : Tue, 20 Apr 2021 02:07:55 GMT\n \" x-optional\" : value\n \" @signature-params\" : (\" date\" \" x-optional\" );created=9999;alg=\" hmac-sha256\" ;keyid=\" key1\" " , sigInput )
1509+ }
1510+
1511+ func TestOptionalVerify (t * testing.T ) {
1512+ req := readRequest (httpreq2 )
1513+ req .Header .Add ("X-Opt1" , "val1" )
1514+ f1 := NewFields ().AddHeader ("date" ).AddOptionalHeader ("x-opt1" )
1515+ key1 := bytes .Repeat ([]byte {0x66 }, 64 )
1516+ signer , err := NewHMACSHA256Signer ("key1" , key1 , NewSignConfig ().setFakeCreated (8888 ), * f1 )
1517+ assert .NoError (t , err , "Could not create signer" )
1518+ sigInputHeader , signature , err := SignRequest ("sig1" , * signer , req )
1519+ assert .NoError (t , err , "Should not fail with optional header present" )
1520+ req .Header .Add ("Signature-Input" , sigInputHeader )
1521+ req .Header .Add ("Signature" , signature )
1522+
1523+ verifier , err := NewHMACSHA256Verifier ("key1" , key1 , NewVerifyConfig ().SetVerifyCreated (false ), * f1 )
1524+ assert .NoError (t , err , "Could not create verifier" )
1525+ err = VerifyRequest ("sig1" , * verifier , req )
1526+ assert .NoError (t , err , "Should not fail: present and signed" )
1527+
1528+ req .Header .Del ("X-Opt1" ) // header absent but included in covered components
1529+ err = VerifyRequest ("sig1" , * verifier , req )
1530+ assert .Error (t , err , "Should fail: absent and signed" )
1531+
1532+ req = readRequest (httpreq2 ) // header present but not signed
1533+ req .Header .Add ("X-Opt1" , "val1" )
1534+ f2 := NewFields ().AddHeader ("date" ) // without the optional header
1535+ signer , err = NewHMACSHA256Signer ("key1" , key1 , NewSignConfig ().setFakeCreated (2222 ), * f2 )
1536+ sigInputHeader , signature , err = SignRequest ("sig1" , * signer , req )
1537+ assert .NoError (t , err , "Should not fail with redundant header present" )
1538+ req .Header .Add ("Signature-Input" , sigInputHeader )
1539+ req .Header .Add ("Signature" , signature )
1540+
1541+ err = VerifyRequest ("sig1" , * verifier , req )
1542+ assert .Error (t , err , "Should fail: present and not signed" )
1543+
1544+ req .Header .Del ("X-Opt1" )
1545+ err = VerifyRequest ("sig1" , * verifier , req )
1546+ assert .NoError (t , err , "Should not fail: absent and not signed" )
1547+ }
0 commit comments