diff options
-rw-r--r-- | paramiko/client.py | 2 | ||||
-rw-r--r-- | paramiko/ed25519key.py | 6 | ||||
-rw-r--r-- | tests/test_client.py | 4 |
3 files changed, 10 insertions, 2 deletions
diff --git a/paramiko/client.py b/paramiko/client.py index 25bbffd9..d76ca383 100644 --- a/paramiko/client.py +++ b/paramiko/client.py @@ -547,7 +547,7 @@ class SSHClient (ClosingContextManager): if not two_factor: for key_filename in key_filenames: - for pkey_class in (RSAKey, DSSKey, ECDSAKey): + for pkey_class in (RSAKey, DSSKey, ECDSAKey, Ed25519Key): try: key = pkey_class.from_private_key_file( key_filename, password) diff --git a/paramiko/ed25519key.py b/paramiko/ed25519key.py index 01abea97..2908ff5b 100644 --- a/paramiko/ed25519key.py +++ b/paramiko/ed25519key.py @@ -154,9 +154,13 @@ class Ed25519Key(PKey): return signing_keys[0] def asbytes(self): + if self.can_sign(): + v = self._signing_key.verify_key + else: + v = self._verifying_key m = Message() m.add_string('ssh-ed25519') - m.add_bytes(self._signing_key.verify_key.encode()) + m.add_bytes(v.encode()) return m.asbytes() def get_name(self): diff --git a/tests/test_client.py b/tests/test_client.py index 5f4f0dd5..eb6aa7b3 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -43,6 +43,7 @@ FINGERPRINTS = { 'ssh-dss': b'\x44\x78\xf0\xb9\xa2\x3c\xc5\x18\x20\x09\xff\x75\x5b\xc1\xd2\x6c', 'ssh-rsa': b'\x60\x73\x38\x44\xcb\x51\x86\x65\x7f\xde\xda\xa2\x2b\x5a\x57\xd5', 'ecdsa-sha2-nistp256': b'\x25\x19\xeb\x55\xe6\xa1\x47\xff\x4f\x38\xd2\x75\x6f\xa5\xd5\x60', + 'ssh-ed25519': b'\x1d\xf3\xefoj\x95\x99\xb7\xedq\x7f&\xba\xb0CD', } @@ -194,6 +195,9 @@ class SSHClientTest (unittest.TestCase): """ self._test_connection(key_filename=test_path('test_ecdsa_256.key')) + def test_client_ed25519(self): + self._test_connection(key_filename=test_path('test_ed25519.key')) + def test_3_multiple_key_files(self): """ verify that SSHClient accepts and tries multiple key files. |