1
1
2
2
import os
3
3
import pathlib
4
+
5
+ from typing import Union
6
+
4
7
from cryptography .hazmat .primitives import serialization
5
- from synlink .crypto .typing import KeyPair , PrivateKey
8
+ from cryptography .hazmat .primitives .asymmetric import (
9
+ ed25519 as ED25519 ,
10
+ )
11
+
12
+ import synlink .crypto .ed25519 as ed25519
13
+ from synlink .crypto .typing import PrivateKey , KeyPair
14
+
15
+
6
16
7
17
from typing import Optional
8
18
9
19
HOME_DIR : str = pathlib .Path .home ().__str__ ()
10
20
SSH_DEFAULT_DIRECTORY = os .path .join (HOME_DIR , ".ssh" )
11
21
12
- def load_ssh_keys (ssh_dir : str = SSH_DEFAULT_DIRECTORY , key_name : str = "id_ed25519" , password : Optional [str ] = None ) -> KeyPair :
13
- """Load SSH key pair from filesystem.
22
+ def load_ssh_private_key (
23
+ ssh_dir : Union [str , os .PathLike ] = SSH_DEFAULT_DIRECTORY ,
24
+ key_name : str = "id_ed25519" ,
25
+ password : Optional [str ] = None ,
26
+ ) -> KeyPair :
27
+ """Load private key from OpenSSL custom encoding, and reconstruct
28
+ key pair.
14
29
15
30
Args:
16
31
ssh_dir: Path to SSH directory (default: ~/.ssh)
@@ -22,14 +37,11 @@ def load_ssh_keys(ssh_dir: str = SSH_DEFAULT_DIRECTORY, key_name: str = "id_ed25
22
37
Raises:
23
38
FileNotFoundError: If key files don't exist
24
39
ValueError: If keys are malformed or incompatible
25
-
40
+ NotImplemented: If other then ed25519
26
41
Example:
27
42
>>> keypair = load_ssh_keys(key_name="id_ed25519")
28
43
"""
29
- file = os .path .join (ssh_dir , key_name ),
30
- if not os .path .isfile (file ):
31
- raise FileNotFoundError (f"{ file } does not exist." )
32
-
44
+ file = os .path .join (ssh_dir , key_name )
33
45
with open (
34
46
file ,
35
47
"rb" ,
@@ -38,12 +50,12 @@ def load_ssh_keys(ssh_dir: str = SSH_DEFAULT_DIRECTORY, key_name: str = "id_ed25
38
50
reader .read (- 1 ),
39
51
password = password ,
40
52
)
41
-
42
-
43
- seceret : PrivateKey = PrivateKey .from_bytes (
44
- buffer .private_bytes_raw ()
45
- )
46
-
47
- public = seceret .get_public_key ()
48
- return KeyPair (seceret = seceret , public = public )
49
53
54
+ if isinstance (buffer , ED25519 .Ed25519PrivateKey ):
55
+ secret = ed25519 .PrivateKey .from_bytes (
56
+ buffer .private_bytes_raw ()
57
+ )
58
+ public = secret .get_public_key ()
59
+ return ed25519 .KeyPair (secret = secret , public = public )
60
+ else :
61
+ raise NotImplemented
0 commit comments