Skip to content

Commit e2db2e1

Browse files
committed
first cut at fixing DSASigner ASN.1 decoding
1 parent 5d5fba9 commit e2db2e1

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

src/cryptojwt/jws.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from cryptography.hazmat.primitives.asymmetric import ec
1212
from cryptography.hazmat.primitives.asymmetric import padding
1313
from cryptography.hazmat.primitives.asymmetric import utils
14+
from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature, encode_dss_signature
15+
from cryptography.utils import int_from_bytes, int_to_bytes
1416

1517
try:
1618
from builtins import str
@@ -174,16 +176,27 @@ def __init__(self, algorithm='SHA256'):
174176
raise UnSupported('algorithm: {}'.format(algorithm))
175177

176178
def sign(self, msg, key):
177-
return key.sign(msg, ec.ECDSA(self.hash_algorithm()))
179+
asn1sig = key.sign(msg, ec.ECDSA(self.hash_algorithm()))
180+
(r,s) = decode_dss_signature(asn1sig)
181+
return int_to_bytes(r) + int_to_bytes(s)
178182

179183
def verify(self, msg, sig, key):
180184
try:
181-
key.verify(sig, msg, ec.ECDSA(self.hash_algorithm()))
185+
(r,s) = self._split_raw(sig)
186+
asn1sig = encode_dss_signature(r, s)
187+
key.verify(asn1sig, msg, ec.ECDSA(self.hash_algorithm()))
182188
except InvalidSignature as err:
183189
raise BadSignature(err)
184190
else:
185191
return True
186192

193+
@staticmethod
194+
def _split_raw(sig):
195+
c_length = len(sig) // 2
196+
r = int_from_bytes(sig[:c_length], byteorder='big')
197+
s = int_from_bytes(sig[c_length:], byteorder='big')
198+
return (r,s)
199+
187200

188201
class PSSSigner(Signer):
189202
def __init__(self, algorithm='SHA256'):

0 commit comments

Comments
 (0)