22
22
import sys
23
23
import warnings
24
24
import ecdsa
25
-
26
- from Crypto .PublicKey import RSA , DSA
25
+ from cryptography .hazmat .backends import default_backend
26
+ from cryptography .hazmat .primitives .asymmetric .dsa import DSAPublicNumbers , DSAParameterNumbers
27
+ from cryptography .hazmat .primitives .asymmetric .rsa import RSAPublicNumbers
27
28
28
29
from .exceptions import * # pylint:disable=wildcard-import,unused-wildcard-import
29
30
@@ -43,7 +44,7 @@ class SSHKey(object): # pylint:disable=too-many-instance-attributes
43
44
DSA_MIN_LENGTH_STRICT = 1024
44
45
DSA_MAX_LENGTH_STRICT = 1024
45
46
DSA_MIN_LENGTH_LOOSE = 1
46
- DSA_MAX_LENGTH_LOOSE = 16384
47
+ DSA_MAX_LENGTH_LOOSE = 3072
47
48
48
49
DSA_N_LENGTH = 160
49
50
@@ -274,8 +275,8 @@ def _process_ssh_rsa(self, data):
274
275
unpacked_e = self ._parse_long (raw_e )
275
276
unpacked_n = self ._parse_long (raw_n )
276
277
277
- self .rsa = RSA . construct (( unpacked_n , unpacked_e ))
278
- self .bits = self .rsa .size () + 1
278
+ self .rsa = RSAPublicNumbers ( unpacked_e , unpacked_n ). public_key ( default_backend ( ))
279
+ self .bits = self .rsa .key_size
279
280
280
281
if self .strict_mode :
281
282
min_length = self .RSA_MIN_LENGTH_STRICT
@@ -297,10 +298,8 @@ def _process_ssh_dss(self, data):
297
298
current_position , value = self ._unpack_by_int (data , current_position )
298
299
data_fields [item ] = self ._parse_long (value )
299
300
300
- self .dsa = DSA .construct ((data_fields ["y" ], data_fields ["g" ], data_fields ["p" ], data_fields ["q" ]))
301
- self .bits = self .dsa .size () + 1
302
-
303
301
q_bits = self ._bits_in_number (data_fields ["q" ])
302
+ p_bits = self ._bits_in_number (data_fields ["p" ])
304
303
if q_bits != self .DSA_N_LENGTH :
305
304
raise InvalidKeyError ("Incorrect DSA key parameters: bits(p)=%s, q=%s" % (self .bits , q_bits ))
306
305
if self .strict_mode :
@@ -309,10 +308,15 @@ def _process_ssh_dss(self, data):
309
308
else :
310
309
min_length = self .DSA_MIN_LENGTH_LOOSE
311
310
max_length = self .DSA_MAX_LENGTH_LOOSE
312
- if self .bits < min_length :
313
- raise TooShortKeyError ("%s key can not be shorter than %s bits (was %s)" % (self .key_type , min_length , self .bits ))
314
- if self .bits > max_length :
315
- raise TooLongKeyError ("%s key data can not be longer than %s bits (was %s)" % (self .key_type , max_length , self .bits ))
311
+ if p_bits < min_length :
312
+ raise TooShortKeyError ("%s key can not be shorter than %s bits (was %s)" % (self .key_type , min_length , p_bits ))
313
+ if p_bits > max_length :
314
+ raise TooLongKeyError ("%s key data can not be longer than %s bits (was %s)" % (self .key_type , max_length , p_bits ))
315
+
316
+ dsa_parameters = DSAParameterNumbers (data_fields ["p" ], data_fields ["q" ], data_fields ["g" ])
317
+ self .dsa = DSAPublicNumbers (data_fields ["y" ], dsa_parameters ).public_key (default_backend ())
318
+ self .bits = self .dsa .key_size
319
+
316
320
return current_position
317
321
318
322
def _process_ecdsa_sha (self , data ):
0 commit comments