/
x25519.py
48 lines (40 loc) · 1.44 KB
/
x25519.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives import serialization
from .private import PrivateKey
from .public import PublicKey
from dissononce.dh.dh import DH
from dissononce.dh.keypair import KeyPair
class X25519DH(DH):
def __init__(self):
super(X25519DH, self).__init__("25519", 32)
def dh(self, keypair, publickey):
return x25519.X25519PrivateKey.from_private_bytes(
keypair.private.data
).exchange(
x25519.X25519PublicKey.from_public_bytes(
publickey.data
)
)
def create_public(self, data):
return PublicKey(data)
def generate_keypair(self, privatekey=None):
if privatekey is None:
private = x25519.X25519PrivateKey.generate()
else:
private = x25519.X25519PrivateKey.from_private_bytes(privatekey.data)
public = private.public_key()
return KeyPair(
PublicKey(
public.public_bytes(
encoding=serialization.Encoding.Raw,
format=serialization.PublicFormat.Raw
)
),
PrivateKey(
private.private_bytes(
encoding=serialization.Encoding.Raw,
format=serialization.PrivateFormat.Raw,
encryption_algorithm=serialization.NoEncryption()
)
)
)