2222import sys
2323import warnings
2424import 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
2728
2829from .exceptions import * # pylint:disable=wildcard-import,unused-wildcard-import
2930
@@ -43,7 +44,7 @@ class SSHKey(object): # pylint:disable=too-many-instance-attributes
4344 DSA_MIN_LENGTH_STRICT = 1024
4445 DSA_MAX_LENGTH_STRICT = 1024
4546 DSA_MIN_LENGTH_LOOSE = 1
46- DSA_MAX_LENGTH_LOOSE = 16384
47+ DSA_MAX_LENGTH_LOOSE = 3072
4748
4849 DSA_N_LENGTH = 160
4950
@@ -274,8 +275,8 @@ def _process_ssh_rsa(self, data):
274275 unpacked_e = self ._parse_long (raw_e )
275276 unpacked_n = self ._parse_long (raw_n )
276277
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
279280
280281 if self .strict_mode :
281282 min_length = self .RSA_MIN_LENGTH_STRICT
@@ -297,10 +298,8 @@ def _process_ssh_dss(self, data):
297298 current_position , value = self ._unpack_by_int (data , current_position )
298299 data_fields [item ] = self ._parse_long (value )
299300
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-
303301 q_bits = self ._bits_in_number (data_fields ["q" ])
302+ p_bits = self ._bits_in_number (data_fields ["p" ])
304303 if q_bits != self .DSA_N_LENGTH :
305304 raise InvalidKeyError ("Incorrect DSA key parameters: bits(p)=%s, q=%s" % (self .bits , q_bits ))
306305 if self .strict_mode :
@@ -309,10 +308,15 @@ def _process_ssh_dss(self, data):
309308 else :
310309 min_length = self .DSA_MIN_LENGTH_LOOSE
311310 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+
316320 return current_position
317321
318322 def _process_ecdsa_sha (self , data ):
0 commit comments