@@ -76,10 +76,9 @@ def prepare_HS_key(key):
7676}
7777
7878try :
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
0 commit comments