def _process_ssh_dss(self, data): """Parses ssh-dsa public keys.""" data_fields = {} current_position = 0 for item in ("p", "q", "g", "y"): current_position, value = self._unpack_by_int(data, current_position) data_fields[item] = self._parse_long(value) q_bits = self._bits_in_number(data_fields["q"]) p_bits = self._bits_in_number(data_fields["p"]) if q_bits != self.DSA_N_LENGTH: raise InvalidKeyError("Incorrect DSA key parameters: bits(p)=%s, q=%s" % (self.bits, q_bits)) if self.strict_mode: min_length = self.DSA_MIN_LENGTH_STRICT max_length = self.DSA_MAX_LENGTH_STRICT else: min_length = self.DSA_MIN_LENGTH_LOOSE max_length = self.DSA_MAX_LENGTH_LOOSE if p_bits < min_length: raise TooShortKeyError("%s key can not be shorter than %s bits (was %s)" % (self.key_type, min_length, p_bits)) if p_bits > max_length: raise TooLongKeyError("%s key data can not be longer than %s bits (was %s)" % (self.key_type, max_length, p_bits)) dsa_parameters = DSAParameterNumbers(data_fields["p"], data_fields["q"], data_fields["g"]) self.dsa = DSAPublicNumbers(data_fields["y"], dsa_parameters).public_key(default_backend()) self.bits = self.dsa.key_size return current_position
def __init__(self, p, q, g, y): self.p = p self.q = q self.g = g self.y = y params = DSAParameterNumbers(p, q, g) self._key = DSAPublicNumbers(y, params).public_key(default_backend())
def __init__(self, p, q, g, y, x): self.p = p self.q = q self.g = g self.y = y self.x = x params = DSAParameterNumbers(p, q, g) pub = DSAPublicNumbers(y, params) self._key = DSAPrivateNumbers(x, pub).private_key(default_backend())
def _load_ssh_dss_public_key(decoded_data, backend): key_type, rest = _read_next_string(decoded_data) p, rest = _read_next_mpint(rest) q, rest = _read_next_mpint(rest) g, rest = _read_next_mpint(rest) y, rest = _read_next_mpint(rest) if key_type != b'ssh-dss': raise ValueError( 'Key header and key body contain different key type values.') if rest: raise ValueError('Key body contains extra bytes.') parameter_numbers = DSAParameterNumbers(p, q, g) public_numbers = DSAPublicNumbers(y, parameter_numbers) return public_numbers.public_key(backend)
def test_load_ssh_public_key_dss(self, backend): ssh_key = ( b"ssh-dss AAAAB3NzaC1kc3MAAACBALmwUtfwdjAUjU2Dixd5DvT0NDcjjr69UD" b"LqSD/Xt5Al7D3GXr1WOrWGpjO0NE9qzRCvMTU7zykRH6XjuNXB6Hvv48Zfm4vm" b"nHQHFmmMg2bI75JbnOwdzWnnPZJrVU4rS23dFFPqs5ug+EbhVVrcwzxahjcSjJ" b"7WEQSkVQWnSPbbAAAAFQDXmpD3DIkGvLSBf1GdUF4PHKtUrQAAAIB/bJFwss+2" b"fngmfG/Li5OyL7A9iVoGdkUaFaxEUROTp7wkm2z49fXFAir+/U31v50Tu98YLf" b"WvKlxdHcdgQYV9Ww5LIrhWwwD4UKOwC6w5S3KHVbi3pWUi7vxJFXOWfeu1mC/J" b"TWqMKR91j+rmOtdppWIZRyIVIqLcMdGO3m+2VgAAAIANFDz5KQH5NvoljpoRQi" b"RgyPjxWXiE7vjLElKj4v8KrpanAywBzdhIW1y/tzpGuwRwj5ihi8iNTHgSsoTa" b"j5AG5HPomJf5vJElxpu/2O9pHA52wcNObIQ7j+JA5uWusxNIbl+pF6sSiP8abr" b"z53N7tPF/IhHTjBHb1Ol7IFu9p9A== testkey@localhost") key = load_ssh_public_key(ssh_key, backend) assert key is not None assert isinstance(key, interfaces.DSAPublicKey) numbers = key.public_numbers() expected_y = int( "d143cf92901f936fa258e9a11422460c8f8f1597884eef8cb1252a3e2ff0aae" "96a7032c01cdd8485b5cbfb73a46bb04708f98a18bc88d4c7812b284da8f900" "6e473e89897f9bc9125c69bbfd8ef691c0e76c1c34e6c843b8fe240e6e5aeb3" "13486e5fa917ab1288ff1a6ebcf9dcdeed3c5fc88474e30476f53a5ec816ef6" "9f4", 16) expected_p = int( "b9b052d7f07630148d4d838b17790ef4f43437238ebebd5032ea483fd7b7902" "5ec3dc65ebd563ab586a633b4344f6acd10af31353bcf29111fa5e3b8d5c1e8" "7befe3c65f9b8be69c740716698c8366c8ef925b9cec1dcd69e73d926b554e2" "b4b6ddd1453eab39ba0f846e1555adcc33c5a8637128c9ed61104a45505a748" "f6db", 16) expected_q = 1230879958723280233885494314531920096931919647917 expected_g = int( "7f6c9170b2cfb67e78267c6fcb8b93b22fb03d895a0676451a15ac44511393a" "7bc249b6cf8f5f5c5022afefd4df5bf9d13bbdf182df5af2a5c5d1dc7604185" "7d5b0e4b22b856c300f850a3b00bac394b728755b8b7a56522eefc491573967" "debb5982fc94d6a8c291f758feae63ad769a5621947221522a2dc31d18ede6f" "b656", 16) expected = DSAPublicNumbers( expected_y, DSAParameterNumbers(expected_p, expected_q, expected_g)) assert numbers == expected
DSA_KEY_1024 = DSAPrivateNumbers( public_numbers=DSAPublicNumbers( parameter_numbers=DSAParameterNumbers( p=int( "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d4b725ef34" "1eabb47cf8a7a8a41e792a156b7ce97206c4f9c5ce6fc5ae7912102b6" "b502e59050b5b21ce263dddb2044b652236f4d42ab4b5d6aa73189cef" "1ace778d7845a5c1c1c7147123188f8dc551054ee162b634d60f097f7" "19076640e20980a0093113a8bd73", 16, ), q=int("96c5390a8b612c0e422bb2b0ea194a3ec935a281", 16), g=int( "06b7861abbd35cc89e79c52f68d20875389b127361ca66822138ce499" "1d2b862259d6b4548a6495b195aa0e0b6137ca37eb23b94074d3c3d30" "0042bdf15762812b6333ef7b07ceba78607610fcc9ee68491dbc1e34c" "d12615474e52b18bc934fb00c61d39e7da8902291c4434a4e2224c3f4" "fd9f93cd6f4f17fc076341a7e7d9", 16, ), ), y=int( "6f26d98d41de7d871b6381851c9d91fa03942092ab6097e76422070edb71d" "b44ff568280fdb1709f8fc3feab39f1f824adaeb2a298088156ac31af1aa0" "4bf54f475bdcfdcf2f8a2dd973e922d83e76f016558617603129b21c70bf7" "d0e5dc9e68fe332e295b65876eb9a12fe6fca9f1a1ce80204646bf99b5771" "d249a6fea627", 16, ), ), x=int("8185fee9cc7c0e91fd85503274f1cd5a3fd15a49", 16),