Skip to content

Commit a517b0c

Browse files
committed
Modified ECDSA algorithms to use cryptography library instead of ecdsa.
1 parent 524d973 commit a517b0c

File tree

2 files changed

+37
-32
lines changed

2 files changed

+37
-32
lines changed

jwt/__init__.py

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,9 @@ def prepare_HS_key(key):
7676
}
7777

7878
try:
79-
8079
from cryptography.hazmat.primitives import interfaces, hashes
8180
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key, load_ssh_public_key
82-
from cryptography.hazmat.primitives.asymmetric import rsa, padding
81+
from cryptography.hazmat.primitives.asymmetric import ec, rsa, padding
8382
from cryptography.hazmat.backends import default_backend
8483
from cryptography.exceptions import InvalidSignature
8584

@@ -120,7 +119,8 @@ def verify_rsa(msg, key, hashalg, sig):
120119
})
121120

122121
def prepare_RS_key(key):
123-
if isinstance(key, interfaces.RSAPrivateKey) or isinstance(key, interfaces.RSAPublicKey):
122+
if isinstance(key, interfaces.RSAPrivateKey) or \
123+
isinstance(key, interfaces.RSAPublicKey):
124124
return key
125125

126126
if isinstance(key, basestring):
@@ -145,27 +145,38 @@ def prepare_RS_key(key):
145145
'RS512': prepare_RS_key
146146
})
147147

148-
except ImportError:
149-
pass
148+
def sign_ecdsa(msg, key, hashalg):
149+
signer = key.signer(ec.ECDSA(hashalg))
150150

151-
try:
152-
import ecdsa
151+
signer.update(msg)
152+
return signer.finalize()
153+
154+
def verify_ecdsa(msg, key, hashalg, sig):
155+
verifier = key.verifier(sig, ec.ECDSA(hashalg))
156+
157+
verifier.update(msg)
158+
159+
try:
160+
verifier.verify()
161+
return True
162+
except InvalidSignature:
163+
return False
153164

154165
signing_methods.update({
155-
'ES256': lambda msg, key: key.sign(msg, hashfunc=hashlib.sha256, sigencode=ecdsa.util.sigencode_der),
156-
'ES384': lambda msg, key: key.sign(msg, hashfunc=hashlib.sha384, sigencode=ecdsa.util.sigencode_der),
157-
'ES512': lambda msg, key: key.sign(msg, hashfunc=hashlib.sha512, sigencode=ecdsa.util.sigencode_der),
166+
'ES256': lambda msg, key: sign_ecdsa(msg, key, hashes.SHA256()),
167+
'ES384': lambda msg, key: sign_ecdsa(msg, key, hashes.SHA384()),
168+
'ES512': lambda msg, key: sign_ecdsa(msg, key, hashes.SHA512()),
158169
})
159170

160171
verify_methods.update({
161-
'ES256': lambda msg, key, sig: key.verify(sig, msg, hashfunc=hashlib.sha256, sigdecode=ecdsa.util.sigdecode_der),
162-
'ES384': lambda msg, key, sig: key.verify(sig, msg, hashfunc=hashlib.sha384, sigdecode=ecdsa.util.sigdecode_der),
163-
'ES512': lambda msg, key, sig: key.verify(sig, msg, hashfunc=hashlib.sha512, sigdecode=ecdsa.util.sigdecode_der),
172+
'ES256': lambda msg, key, sig: verify_ecdsa(msg, key, hashes.SHA256(), sig),
173+
'ES384': lambda msg, key, sig: verify_ecdsa(msg, key, hashes.SHA384(), sig),
174+
'ES512': lambda msg, key, sig: verify_ecdsa(msg, key, hashes.SHA512(), sig),
164175
})
165176

166177
def prepare_ES_key(key):
167-
if isinstance(key, ecdsa.SigningKey) or \
168-
isinstance(key, ecdsa.VerifyingKey):
178+
if isinstance(key, interfaces.EllipticCurvePrivateKey) or \
179+
isinstance(key, interfaces.EllipticCurvePublicKey):
169180
return key
170181

171182
if isinstance(key, basestring):
@@ -176,12 +187,10 @@ def prepare_ES_key(key):
176187
# a Signing Key or a Verifying Key, so we try
177188
# the Verifying Key first.
178189
try:
179-
key = ecdsa.VerifyingKey.from_pem(key)
180-
except ecdsa.der.UnexpectedDER:
181-
try:
182-
key = ecdsa.SigningKey.from_pem(key)
183-
except:
184-
raise
190+
key = load_pem_public_key(key, backend=default_backend())
191+
except ValueError:
192+
key = load_pem_private_key(key, password=None, backend=default_backend())
193+
185194
else:
186195
raise TypeError('Expecting a PEM-formatted key.')
187196

tests/test_jwt.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,9 @@
2222
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key, load_ssh_public_key
2323
from cryptography.hazmat.backends import default_backend
2424
has_rsa = True
25-
except ImportError:
26-
has_rsa = False
27-
28-
try:
29-
import ecdsa
3025
has_ecdsa = True
3126
except ImportError:
27+
has_rsa = False
3228
has_ecdsa = False
3329

3430

@@ -576,12 +572,12 @@ def test_rsa_related_key_preparation_methods(self):
576572
def test_encode_decode_with_ecdsa_sha256(self):
577573
# PEM-formatted EC key
578574
with open('tests/testkey_ec', 'r') as ec_priv_file:
579-
priv_eckey = ecdsa.SigningKey.from_pem(ec_priv_file.read())
575+
priv_eckey = load_pem_private_key(ec_priv_file.read(), password=None, backend=default_backend())
580576
jwt_message = jwt.encode(self.payload, priv_eckey,
581577
algorithm='ES256')
582578

583579
with open('tests/testkey_ec.pub', 'r') as ec_pub_file:
584-
pub_eckey = ecdsa.VerifyingKey.from_pem(ec_pub_file.read())
580+
pub_eckey = load_pem_public_key(ec_pub_file.read(), backend=default_backend())
585581
assert jwt.decode(jwt_message, pub_eckey)
586582

587583
load_output = jwt.load(jwt_message)
@@ -605,12 +601,12 @@ def test_encode_decode_with_ecdsa_sha384(self):
605601

606602
# PEM-formatted EC key
607603
with open('tests/testkey_ec', 'r') as ec_priv_file:
608-
priv_eckey = ecdsa.SigningKey.from_pem(ec_priv_file.read())
604+
priv_eckey = load_pem_private_key(ec_priv_file.read(), password=None, backend=default_backend())
609605
jwt_message = jwt.encode(self.payload, priv_eckey,
610606
algorithm='ES384')
611607

612608
with open('tests/testkey_ec.pub', 'r') as ec_pub_file:
613-
pub_eckey = ecdsa.VerifyingKey.from_pem(ec_pub_file.read())
609+
pub_eckey = load_pem_public_key(ec_pub_file.read(), backend=default_backend())
614610
assert jwt.decode(jwt_message, pub_eckey)
615611

616612
load_output = jwt.load(jwt_message)
@@ -633,12 +629,12 @@ def test_encode_decode_with_ecdsa_sha384(self):
633629
def test_encode_decode_with_ecdsa_sha512(self):
634630
# PEM-formatted EC key
635631
with open('tests/testkey_ec', 'r') as ec_priv_file:
636-
priv_eckey = ecdsa.SigningKey.from_pem(ec_priv_file.read())
632+
priv_eckey = load_pem_private_key(ec_priv_file.read(), password=None, backend=default_backend())
637633
jwt_message = jwt.encode(self.payload, priv_eckey,
638634
algorithm='ES512')
639635

640636
with open('tests/testkey_ec.pub', 'r') as ec_pub_file:
641-
pub_eckey = ecdsa.VerifyingKey.from_pem(ec_pub_file.read())
637+
pub_eckey = load_pem_public_key(ec_pub_file.read(), backend=default_backend())
642638
assert jwt.decode(jwt_message, pub_eckey)
643639

644640
load_output = jwt.load(jwt_message)

0 commit comments

Comments
 (0)