Impl the basic signal functions that were listed

This commit is contained in:
hinuiiik
2026-10-22 22:43:01 -04:00
parent 2573c12295
commit 305e2a2b28
+40
View File
@@ -1,6 +1,7 @@
import os import os
import pickle import pickle
import string import string
import hmac
from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.ciphers.aead import AESGCM from cryptography.hazmat.primitives.ciphers.aead import AESGCM
@@ -8,12 +9,51 @@ from cryptography.hazmat.primitives.kdf.hkdf import HKDF
CURVE = ec.SECP256R1() CURVE = ec.SECP256R1()
class MessageHeader:
dh: object
pn: int
n: int
def GENERATE_DH(): def GENERATE_DH():
return ec.generate_private_key(CURVE) return ec.generate_private_key(CURVE)
def DH(dh_pair, dh_pub): def DH(dh_pair, dh_pub):
return dh_pair.exchange(ec.ECDH(), dh_pub) return dh_pair.exchange(ec.ECDH(), dh_pub)
def KDF_RK(rk, dh_out):
output = HKDF(
algorithm=hashes.SHA256(),
length=64,
salt=rk,
info=b"",
).derive(dh_out)
return output[:32], output[32:]
def KDF_CK(ck):
return (
hmac.new(ck, b"\x01", "sha256").digest(),
hmac.new(ck, b"\x02", "sha256").digest(),
)
def ENCRYPT(mk, plaintext, associated_data):
nonce = os.urandom(12)
return nonce + AESGCM(mk).encrypt(nonce, plaintext, associated_data)
def DECRYPT(mk, ciphertext, associated_data):
return AESGCM(mk).decrypt(ciphertext[:12], ciphertext[12:], associated_data)
def HEADER(dh_pair, pn, n):
public_key = dh_pair.public_key()
return MessageHeader(public_key, int(pn), int(n))
def CONCAT(ad, header):
header_tup = pickle.dumps(
(header.dh.public_bytes(serialization.Encoding.X962,serialization.PublicFormat.UncompressedPoint), header.pn, header.n),
)
return len(ad).to_bytes(8) + ad + header_tup
class MessengerServer: class MessengerServer:
def __init__(self, server_signing_key, server_decryption_key): def __init__(self, server_signing_key, server_decryption_key):
self.server_signing_key = server_signing_key self.server_signing_key = server_signing_key