2022-06-08 15:03:40 +00:00
|
|
|
from cryptography.hazmat.primitives import serialization
|
|
|
|
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey
|
|
|
|
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey, X25519PublicKey
|
|
|
|
|
2022-06-08 17:47:09 +00:00
|
|
|
# These proxy classes exist to create a uniform API accross
|
|
|
|
# cryptography primitive providers.
|
|
|
|
|
2022-06-08 15:03:40 +00:00
|
|
|
class X25519PrivateKeyProxy:
|
|
|
|
def __init__(self, real):
|
|
|
|
self.real = real
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def generate(cls):
|
|
|
|
return cls(X25519PrivateKey.generate())
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def from_private_bytes(cls, data):
|
|
|
|
return cls(X25519PrivateKey.from_private_bytes(data))
|
|
|
|
|
|
|
|
def private_bytes(self):
|
|
|
|
return self.real.private_bytes(
|
|
|
|
encoding=serialization.Encoding.Raw,
|
|
|
|
format=serialization.PrivateFormat.Raw,
|
|
|
|
encryption_algorithm=serialization.NoEncryption(),
|
|
|
|
)
|
|
|
|
|
|
|
|
def public_key(self):
|
|
|
|
return X25519PublicKeyProxy(self.real.public_key())
|
|
|
|
|
|
|
|
def exchange(self, peer_public_key):
|
|
|
|
return self.real.exchange(peer_public_key.real)
|
|
|
|
|
|
|
|
|
|
|
|
class X25519PublicKeyProxy:
|
|
|
|
def __init__(self, real):
|
|
|
|
self.real = real
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def from_public_bytes(cls, data):
|
|
|
|
return cls(X25519PublicKey.from_public_bytes(data))
|
|
|
|
|
|
|
|
def public_bytes(self):
|
|
|
|
return self.real.public_bytes(
|
|
|
|
encoding=serialization.Encoding.Raw,
|
|
|
|
format=serialization.PublicFormat.Raw
|
2022-06-08 17:47:09 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class Ed25519PrivateKeyProxy:
|
|
|
|
def __init__(self, real):
|
|
|
|
self.real = real
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def generate(cls):
|
|
|
|
return cls(Ed25519PrivateKey.generate())
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def from_private_bytes(cls, data):
|
|
|
|
return cls(Ed25519PrivateKey.from_private_bytes(data))
|
|
|
|
|
|
|
|
def private_bytes(self):
|
|
|
|
return self.real.private_bytes(
|
|
|
|
encoding=serialization.Encoding.Raw,
|
|
|
|
format=serialization.PrivateFormat.Raw,
|
|
|
|
encryption_algorithm=serialization.NoEncryption()
|
|
|
|
)
|
|
|
|
|
|
|
|
def public_key(self):
|
|
|
|
return Ed25519PublicKeyProxy(self.real.public_key())
|
|
|
|
|
|
|
|
def sign(self, message):
|
|
|
|
return self.real.sign(message)
|
|
|
|
|
|
|
|
|
|
|
|
class Ed25519PublicKeyProxy:
|
|
|
|
def __init__(self, real):
|
|
|
|
self.real = real
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def from_public_bytes(cls, data):
|
|
|
|
return cls(Ed25519PublicKey.from_public_bytes(data))
|
|
|
|
|
|
|
|
def public_bytes(self):
|
|
|
|
return self.real.public_bytes(
|
|
|
|
encoding=serialization.Encoding.Raw,
|
|
|
|
format=serialization.PublicFormat.Raw
|
|
|
|
)
|
|
|
|
|
|
|
|
def verify(self, signature, message):
|
|
|
|
self.real.verify(signature, message)
|