From ec5b6322df731b0ecab7d7f34dddd672fd0dba5e Mon Sep 17 00:00:00 2001 From: hinuiiik Date: Thu, 22 Oct 2026 23:21:13 -0400 Subject: [PATCH] Implement sendMessage and receiveMessage --- main.py | 4 ++-- messenger.py | 27 ++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/main.py b/main.py index 9c9f5fc..28e6844 100644 --- a/main.py +++ b/main.py @@ -54,8 +54,8 @@ print("Testing Reporting") content = "inappropriate message contents" reportPT, reportCT = alice.report("Bob", content) decryptedReport = server.decryptReport(reportCT) -print(reportPT) -print(decryptedReport) +# print(reportPT) +# print(decryptedReport) if decryptedReport != reportPT: error("report did not decrypt properly") print(reportPT) diff --git a/messenger.py b/messenger.py index b05e5b5..5090e8b 100644 --- a/messenger.py +++ b/messenger.py @@ -3,7 +3,9 @@ import pickle import string import hmac from dataclasses import dataclass +from types import SimpleNamespace +from cryptography.exceptions import InvalidTag from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.ciphers.aead import AESGCM @@ -170,12 +172,28 @@ class MessengerClient: self.certs[name] = public_key def sendMessage(self, name, message): - raise Exception("not implemented!") - return + state = self.conns.get(name) + if state is None: + state = SimpleNamespace() + self.conns[name] = state + initial_secret = DH(self.dh, self.certs[name]) + self.RatchetInitAlice(state, initial_secret, self.certs[name]) + plaintext = message.encode("utf-8") + return self.RatchetEncrypt(state, plaintext, b"") def receiveMessage(self, name, header, ciphertext): - raise Exception("not implemented!") - return + state = self.conns.get(name) + if state is None: + state = SimpleNamespace() + initial_secret = DH(self.dh, self.certs[name]) + self.conns[name] = state + self.RatchetInitBob(state, initial_secret, self.dh) + try: + plaintext = self.RatchetDecrypt(state, header, ciphertext, b"") + except InvalidTag: + return None + return plaintext.decode("utf-8") + # this is technically hybrid encryption instead of just el gamal but I blame the instructions instead of myself # maybe i'll change this if I want to use a late day @@ -204,4 +222,3 @@ class MessengerClient: "ciphertext": ciphertext } return plaintext.decode("latin1"), pickle.dumps(data) -