def record_cert_handler(self, conn: Peer, msg) -> bool: if conn.add_peer_cert(msg.decode("utf-8")): conn.send_data(Peer.CERT_RESPONSE_VALID, self.encrypt.get_signed_cert_str()) return False else: conn.send_data(Peer.CERT_RESPONSE_INVALID, "") return True
def request_encrypted_file(self, host, port, file_name): try: conn = Peer(port) conn.send_data(Peer.SEND_CERT, self.encrypt.get_signed_cert_str()) debug('Sent %s' % Peer.SEND_CERT) msg_reply = conn.recv_data() # debug('Got reply %s' % (str(msg_reply))) debug("Received certificate") if msg_reply[0] != Peer.CERT_RESPONSE_VALID: debug("Certificate validation error.") return if conn.add_peer_cert(msg_reply[1].decode("utf-8")): public_key = conn.peer_cert.public_key() ciphertext = public_key.encrypt( bytes(file_name, 'utf-8'), padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) conn.send_data(Peer.REQUEST_FILE, ciphertext) else: print("ERROR") debug('Sent %s' % Peer.REQUEST_FILE) try: _substr_index = file_name.rindex('/')+1 except: _substr_index = 0 received_file_name = 'received_'+file_name[_substr_index:] try: os.remove(received_file_name) print('Removed existing file:', received_file_name) os.remove('tmp_recv_encrfile') except OSError: pass while True: msg_reply = conn.recv_data() # debug('Got reply %s' % (str(msg_reply))) if msg_reply == (None, None): break plain_data = self.encrypt.get_private_key().decrypt( msg_reply[1], padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) with open(received_file_name, 'ab') as f: f.write(plain_data) with open('tmp_recv_encrfile', 'ab') as f: f.write(msg_reply[1]) debug(f"File received written to: {received_file_name}") conn.close() except KeyboardInterrupt: raise except: traceback.print_exc()