Ejemplo n.º 1
0
    def file_request_handler(self, conn: Peer, file_name) -> bool:
        # print("Received", file_name)

        plain_file_name = self.encrypt.get_private_key().decrypt(
            file_name,
            padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None))
        print("File request for:", plain_file_name)

        with open(plain_file_name.decode("utf-8"), 'rb') as f:
            for piece in read_in_chunks(f):
                message = piece
                if conn.peer_cert:
                    public_key = conn.peer_cert.public_key()
                    ciphertext = public_key.encrypt(
                        message,
                        padding.OAEP(
                            mgf=padding.MGF1(algorithm=hashes.SHA256()),
                            algorithm=hashes.SHA256(),
                            label=None))
                    # print(ciphertext)
                    conn.send_data(Peer.RESPONSE_FILE, ciphertext)
                else:
                    print("ERROR: PEER CERTIFICATE NOT AVAILABLE.")
        return True
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
    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()