@@ -19,12 +19,6 @@ class CryptographyECKey(Key):
1919 SHA384 = hashes .SHA384
2020 SHA512 = hashes .SHA512
2121
22- CURVE_MAP = {
23- SHA256 : ec .SECP256R1 ,
24- SHA384 : ec .SECP384R1 ,
25- SHA512 : ec .SECP521R1 ,
26- }
27-
2822 def __init__ (self , key , algorithm , cryptography_backend = default_backend ):
2923 if algorithm not in ALGORITHMS .EC :
3024 raise JWKError ('hash_alg: %s is not a valid hash algorithm' % algorithm )
@@ -36,7 +30,6 @@ def __init__(self, key, algorithm, cryptography_backend=default_backend):
3630 }.get (algorithm )
3731 self ._algorithm = algorithm
3832
39- self .curve = self .CURVE_MAP .get (self .hash_alg )
4033 self .cryptography_backend = cryptography_backend
4134
4235 if hasattr (key , 'public_bytes' ) or hasattr (key , 'private_bytes' ):
@@ -78,18 +71,28 @@ def _process_jwk(self, jwk_dict):
7871 x = base64_to_long (jwk_dict .get ('x' ))
7972 y = base64_to_long (jwk_dict .get ('y' ))
8073
81- ec_pn = ec .EllipticCurvePublicNumbers (x , y , self .curve ())
74+ curve = {
75+ 'P-256' : ec .SECP256R1 ,
76+ 'P-384' : ec .SECP384R1 ,
77+ 'P-521' : ec .SECP521R1 ,
78+ }[jwk_dict ['crv' ]]
79+
80+ ec_pn = ec .EllipticCurvePublicNumbers (x , y , curve ())
8281 verifying_key = ec_pn .public_key (self .cryptography_backend ())
8382
8483 return verifying_key
8584
8685 def sign (self , msg ):
86+ if self .hash_alg .digest_size * 8 > self .prepared_key .curve .key_size :
87+ raise TypeError ("this curve (%s) is too short "
88+ "for your digest (%d)" % (self .prepared_key .curve .name ,
89+ 8 * self .hash_alg .digest_size ))
8790 signature = self .prepared_key .sign (msg , ec .ECDSA (self .hash_alg ()))
88- order = (2 ** self .curve .key_size ) - 1
91+ order = (2 ** self .prepared_key . curve .key_size ) - 1
8992 return sigencode_string (* sigdecode_der (signature , order ), order = order )
9093
9194 def verify (self , msg , sig ):
92- order = (2 ** self .curve .key_size ) - 1
95+ order = (2 ** self .prepared_key . curve .key_size ) - 1
9396 signature = sigencode_der (* sigdecode_string (sig , order ), order = order )
9497 verifier = self .prepared_key .verifier (signature , ec .ECDSA (self .hash_alg ()))
9598 verifier .update (msg )
0 commit comments