@@ -13,7 +13,7 @@ def __init__(self, algorithm):
13
13
from cryptography .hazmat .backends import default_backend
14
14
from cryptography .hazmat .primitives .asymmetric import rsa , ec
15
15
from cryptography .hazmat .primitives .asymmetric .padding import PKCS1v15
16
- from cryptography .hazmat .primitives .hashes import SHA1 , SHA256
16
+ from cryptography .hazmat .primitives .hashes import SHA1 , SHA256 , SHA512
17
17
self .__dict__ .update (locals ())
18
18
19
19
def sign (self , string_to_sign , key , passphrase = None ):
@@ -23,6 +23,9 @@ def sign(self, string_to_sign, key, passphrase=None):
23
23
if self .algorithm in {"rsa-sha1" , "rsa-sha256" }:
24
24
hasher = self .SHA1 () if self .algorithm .endswith ("sha1" ) else self .SHA256 ()
25
25
signer = key .signer (padding = self .PKCS1v15 (), algorithm = hasher )
26
+ elif self .algorithm in {"rsa-sha512" }:
27
+ hasher = self .SHA512 ()
28
+ signer = key .signer (padding = self .PKCS1v15 (), algorithm = hasher )
26
29
elif self .algorithm == "ecdsa-sha256" :
27
30
signer = key .signer (signature_algorithm = self .ec .ECDSA (algorithm = self .SHA256 ()))
28
31
signer .update (string_to_sign )
@@ -44,6 +47,7 @@ class HTTPSignatureAuth(requests.auth.AuthBase):
44
47
known_algorithms = {
45
48
"rsa-sha1" ,
46
49
"rsa-sha256" ,
50
+ "rsa-sha512" ,
47
51
"hmac-sha256" ,
48
52
"ecdsa-sha256" ,
49
53
}
@@ -117,3 +121,25 @@ def verify(self, request, key_resolver):
117
121
sts = self .get_string_to_sign (request , headers )
118
122
key = key_resolver (key_id = sig_struct ["keyId" ], algorithm = sig_struct ["algorithm" ])
119
123
Crypto (sig_struct ["algorithm" ]).verify (sig , sts , key )
124
+
125
+ class HTTPSignatureHeaderAuth (HTTPSignatureAuth ):
126
+ """
127
+ https://tools.ietf.org/html/draft-cavage-http-signatures-08#section-4
128
+
129
+ Using "Signature" header instead of "Authorization" header.
130
+ """
131
+
132
+ def __call__ (self , request ):
133
+ self .add_date (request )
134
+ self .add_digest (request )
135
+ raw_sig = Crypto (self .algorithm ).sign (string_to_sign = self .get_string_to_sign (request , self .headers ),
136
+ key = self .key ,
137
+ passphrase = self .passphrase )
138
+ sig = base64 .b64encode (raw_sig ).decode ()
139
+ sig_struct = [("keyId" , self .key_id ),
140
+ ("algorithm" , self .algorithm ),
141
+ ("headers" , " " .join (self .headers )),
142
+ ("signature" , sig )]
143
+ request .headers ["Signature" ] = "," .join ('{}="{}"' .format (k , v ) for k , v in sig_struct )
144
+ return request
145
+
0 commit comments