#!/usr/bin/env python

# Simple client for the "count characters" protocol. Asymmetric crypto
# with RSA, to prevent sniffing. You can check with Wireshark that the
# data is unreadable.

import logging
import sys
import socket
from Crypto.PublicKey import RSA
import cPickle as pickle

PORT=4923
MAX=256
client_key_filename = "./client-full.key"
server_key_filename = "./server-public.key"

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')
if len(sys.argv) != 3:
    logging.error("Usage: %s IPv6-address-of-server message" % sys.argv[0])
    sys.exit(-1)
server = sys.argv[1]
message = sys.argv[2]
server_key_file = open(server_key_filename, 'r')
server_key = pickle.load(server_key_file)
server_key_file.close()
client_key_file = open(client_key_filename, 'r')
client_key = pickle.load(client_key_file)
client_key_file.close()
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.connect((server, PORT), )
outf = s.makefile('w')
inf = s.makefile('r')
encrypted_message = server_key.encrypt(message, None)[0]
outf.write("%s" % encrypted_message)
outf.close()
s.shutdown(socket.SHUT_WR)
encrypted_response = inf.read(MAX)
response = client_key.decrypt(encrypted_response)
inf.close()
logging.info("Response was %s" % response)

