Update lib_secure_server.py 1st working file. synchronous encryption to be added.

This commit is contained in:
George 2020-03-31 15:24:24 -07:00
parent e0625b87a9
commit 309eb3f439

View File

@ -72,7 +72,7 @@ class Message:
def _write(self):
if self._send_buffer:
print("sending", repr(self._send_buffer), "to", self.addr)
# print("sending", repr(self._send_buffer), "to", self.addr)
try:
# Should be ready to write
sent = self.sock.send(self._send_buffer)
@ -81,11 +81,12 @@ class Message:
pass
else:
self._send_buffer = self._send_buffer[sent:]
if not self.handshake:
self._set_selector_events_mask("r")
# Close when the buffer is drained. The response has been sent.
elif sent and not self._send_buffer:
self.close()
if sent and not self._send_buffer:
if self.handshake:
self.close()
else:
self._set_selector_events_mask("r")
def _json_encode(self, obj, encoding):
return json.dumps(obj, ensure_ascii=False).encode(encoding)
@ -165,15 +166,12 @@ class Message:
if self.request is None:
self.process_request()
if not self.handshake:
self._jsonheader_len = None
self.jsonheader = None
def write(self):
if self.request:
if not self.response_created:
self.create_response()
print(f"Sending response to client.")
self._write()
def close(self):
@ -233,6 +231,11 @@ class Message:
self._send_buffer += message
print(f'Sending server public key, hash, session key, hash...')
def _reset_header(self):
# reset header for next request
self._jsonheader_len = None
self.jsonheader = None
def process_request(self):
content_len = self.jsonheader["content-length"]
if not len(self._recv_buffer) >= content_len:
@ -240,6 +243,7 @@ class Message:
data = self._recv_buffer[:content_len]
self._recv_buffer = self._recv_buffer[content_len:]
if self.clientkey is None: # data is client public key plus hash
print(f"Receiving client key")
key = data[:-128]
keyhash = data[-128:]
if hashlib.sha3_512(key).hexdigest().encode() == keyhash:
@ -248,8 +252,10 @@ class Message:
self.sock.close()
raise Exception('Client plublic key does not match key hash')
self.send_my_secrets()
self._reset_header()
self._set_selector_events_mask("w")
elif not self.handshake: # data is passhass + sesshash
print(f"Receiving password")
passphrase = self.key.decrypt(bytes(data))
sesshash = passphrase[-128:]
passhash = passphrase[:-128]
@ -261,8 +267,10 @@ class Message:
raise Exception('Session key hash mismatch')
self.handshake = True
print('Handshake Done.')
self._reset_header()
self._set_selector_events_mask("r")
else:
print(f"Receiving request (unencrypted yet)")
if self.jsonheader["content-type"] == "text/json":
encoding = self.jsonheader["content-encoding"]
self.request = self._json_decode(data, encoding)