Skip to content

Commit 8d1c0d0

Browse files
authored
Merge pull request #2 from kevingill1966/master
Changes to support Irish Revenue Modernisation Project
2 parents 7f8f691 + be44d4f commit 8d1c0d0

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

requests_http_signature/__init__.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __init__(self, algorithm):
1313
from cryptography.hazmat.backends import default_backend
1414
from cryptography.hazmat.primitives.asymmetric import rsa, ec
1515
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
1717
self.__dict__.update(locals())
1818

1919
def sign(self, string_to_sign, key, passphrase=None):
@@ -23,6 +23,9 @@ def sign(self, string_to_sign, key, passphrase=None):
2323
if self.algorithm in {"rsa-sha1", "rsa-sha256"}:
2424
hasher = self.SHA1() if self.algorithm.endswith("sha1") else self.SHA256()
2525
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)
2629
elif self.algorithm == "ecdsa-sha256":
2730
signer = key.signer(signature_algorithm=self.ec.ECDSA(algorithm=self.SHA256()))
2831
signer.update(string_to_sign)
@@ -44,6 +47,7 @@ class HTTPSignatureAuth(requests.auth.AuthBase):
4447
known_algorithms = {
4548
"rsa-sha1",
4649
"rsa-sha256",
50+
"rsa-sha512",
4751
"hmac-sha256",
4852
"ecdsa-sha256",
4953
}
@@ -117,3 +121,25 @@ def verify(self, request, key_resolver):
117121
sts = self.get_string_to_sign(request, headers)
118122
key = key_resolver(key_id=sig_struct["keyId"], algorithm=sig_struct["algorithm"])
119123
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

Comments
 (0)