77import os
88import sys
99import unittest
10+ from contextlib import contextmanager
1011from datetime import datetime , timedelta
12+ from unittest .mock import patch
1113
1214import requests
1315from cryptography .hazmat .primitives .serialization import (
3638)
3739
3840
41+ @contextmanager
42+ def patch_time (dt ):
43+ class MockDateTime (datetime ):
44+ @classmethod
45+ def now (cls , tz = None ):
46+ return dt
47+
48+ with patch ("http_message_signatures.signatures.datetime.datetime" , MockDateTime ):
49+ yield
50+
51+
3952class MyHTTPSignatureKeyResolver (HTTPSignatureKeyResolver ):
4053 known_pem_keys = {"test-key-rsa" , "test-key-rsa-pss" , "test-key-ecc-p256" , "test-key-ed25519" }
4154
@@ -77,20 +90,20 @@ def setUp(self):
7790 self .key_resolver = MyHTTPSignatureKeyResolver ()
7891 self .max_age = timedelta (weeks = 90000 )
7992
80- def verify (self , verifier , message , max_age = None , expect_label = None ):
93+ def verify (self , verifier , message , max_age = None , expect_tag = None , expect_label = None ):
8194 if max_age is None :
8295 max_age = self .max_age
8396 m = copy .deepcopy (message )
8497 m .headers ["Signature" ] = m .headers ["Signature" ][:8 ] + m .headers ["Signature" ][8 :].upper ()
8598 with self .assertRaises (InvalidSignature ):
86- verifier .verify (m , max_age = max_age , expect_label = expect_label )
99+ verifier .verify (m , max_age = max_age , expect_tag = expect_tag , expect_label = expect_label )
87100 m .headers ["Signature" ] = m .headers ["Signature" ].upper ()
88101 with self .assertRaisesRegex (InvalidSignature , "Malformed structured header field" ):
89- verifier .verify (m , max_age = max_age , expect_label = expect_label )
102+ verifier .verify (m , max_age = max_age , expect_tag = expect_tag , expect_label = expect_label )
90103 del m .headers ["Signature" ]
91104 with self .assertRaisesRegex (InvalidSignature , 'Expected "Signature" header field to be present' ):
92- verifier .verify (m , max_age = max_age , expect_label = expect_label )
93- return verifier .verify (message , max_age = max_age , expect_label = expect_label )
105+ verifier .verify (m , max_age = max_age , expect_tag = expect_tag , expect_label = expect_label )
106+ return verifier .verify (message , max_age = max_age , expect_tag = expect_tag , expect_label = expect_label )
94107
95108 def test_http_message_signatures_B21 (self ):
96109 signer = HTTPMessageSigner (signature_algorithm = RSA_PSS_SHA512 , key_resolver = self .key_resolver )
@@ -345,6 +358,7 @@ def test_multiple_signatures(self):
345358 created = datetime .fromtimestamp (1618884480 ),
346359 expires = datetime .fromtimestamp (1618884540 ),
347360 label = "proxy_sig" ,
361+ tag = None ,
348362 append_if_signature_exists = False ,
349363 )
350364 signer2 = HTTPMessageSigner (signature_algorithm = RSA_V1_5_SHA256 , key_resolver = self .key_resolver )
@@ -363,13 +377,26 @@ def test_multiple_signatures(self):
363377 "sig1=:X5spyd6CFnAG5QnDyHfqoSNICd+BUP4LYMz2Q0JXlb//4Ijpzp+kve2w4NIyqeAuM7jTDX+sNalzA8ESSaHD3A==:, proxy_sig=:S6ZzPXSdAMOPjN/6KXfXWNO/f7V6cHm7BXYUh3YD/fRad4BCaRZxP+JH+8XY1I6+8Cy+CM5g92iHgxtRPz+MjniOaYmdkDcnL9cCpXJleXsOckpURl49GwiyUpZ10KHgOEe11sx3G2gxI8S0jnxQB+Pu68U9vVcasqOWAEObtNKKZd8tSFu7LB5YAv0RAGhB8tmpv7sFnIm9y+7X5kXQfi8NMaZaA8i2ZHwpBdg7a6CMfwnnrtflzvZdXAsD3LH2TwevU+/PBPv0B6NMNk93wUs/vfJvye+YuI87HU38lZHowtznbLVdp770I6VHR6WfgS9ddzirrswsE1w5o0LV/g==:" ,
364378 )
365379 self .assertIn ("sig1" , self .test_request .headers ["Signature-Input" ])
366- with self .assertRaisesRegex (InvalidSignature , "Multiple signatures found and no label specified" ):
380+ with self .assertRaisesRegex (InvalidSignature , "Multiple signatures found and no tag or label specified" ):
367381 verifier .verify (self .test_request )
368382 verifier2 = HTTPMessageVerifier (signature_algorithm = RSA_V1_5_SHA256 , key_resolver = self .key_resolver )
369383 with self .assertRaisesRegex (InvalidSignature , 'Signature "expires" parameter is set to a time in the past' ):
370384 self .verify (verifier2 , self .test_request , expect_label = "proxy_sig" )
371- verifier2 .validate_created_and_expires = lambda * args , ** kwargs : None
372- self .verify (verifier2 , self .test_request , expect_label = "proxy_sig" )
385+
386+ with patch_time (datetime .fromtimestamp (1618884500 )):
387+ res = self .verify (verifier2 , self .test_request , expect_label = "proxy_sig" )
388+ self .assertEqual (len (res ), 1 )
389+ self .assertEqual (res [0 ].label , "proxy_sig" )
390+
391+ signer2_args .update (label = "my-label" , tag = "my-tag" )
392+ signer2 .sign (self .test_request , ** signer2_args )
393+ with self .assertRaisesRegex (InvalidSignature , "No signatures found matching the expected tag or label" ):
394+ self .verify (verifier2 , self .test_request , expect_tag = "test" )
395+ with patch_time (datetime .fromtimestamp (1618884500 )):
396+ res = self .verify (verifier2 , self .test_request , expect_tag = "my-tag" )
397+ self .assertEqual (len (res ), 1 )
398+ self .assertEqual (res [0 ].label , "my-label" )
399+ self .assertEqual (res [0 ].parameters ["tag" ], "my-tag" )
373400
374401 def test_query_parameters (self ):
375402 signer = HTTPMessageSigner (signature_algorithm = HMAC_SHA256 , key_resolver = self .key_resolver )
0 commit comments