def setup_local_encryption(self):
		if self.local_recvall(PACKET_INIT_LENGTH) != PACKET_INIT:
			raise ValueError("packet != PACKET_INIT")
		generator = self.generator
		prime = self.prime
		prime_bytes = int_to_bytes(prime)
		self.log("local encryption: generator: %s prime: %s"%(generator, prime))
		server_private_key = get_private_key()
		server_public_key = get_public_key(generator, server_private_key, prime)
		server_public_key_bytes = int_to_bytes(server_public_key)
		self.log("local encryption: server_private_key: %s, server_public_key %s"%(
			server_private_key, server_public_key,
		))
		packet_key_exchange = "".join((
			pack_unsigned_int(0),
			pack_unsigned_int(len(str(generator)))+str(generator),
			pack_unsigned_int(len(prime_bytes))+prime_bytes,
			pack_unsigned_int(len(server_public_key_bytes))+server_public_key_bytes,
		))
		self.local_sendall(packet_key_exchange)
		client_public_key_length = unpack_unsigned_int(self.local_recvall(4))
		client_public_key = bytes_to_int(self.local_recvall(client_public_key_length))
		share_key = get_share_key_bytes(client_public_key, server_private_key, prime)
		rijndael_key = get_rijndael_key(share_key)
		self.log("local encryption: share_key: %s, rijndael_key: %s"%(
			share_key, rijndael_key.encode("hex"),
		))
		self.local_rijndael_obj = rijndael.rijndael(rijndael_key, block_size=16)
		self.local_rijndael_obj.lock = threading.RLock()
	def setup_remote_encryption(self):
		self.remote_sendall(PACKET_INIT)
		head = self.remote_recvall(4)
		generator_length = unpack_unsigned_int(self.remote_recvall(4))
		generator = int(self.remote_recvall(generator_length))
		prime_length = unpack_unsigned_int(self.remote_recvall(4))
		prime = bytes_to_int(self.remote_recvall(prime_length))
		server_public_key_length = unpack_unsigned_int(self.remote_recvall(4))
		server_public_key = bytes_to_int(self.remote_recvall(prime_length))
		self.log("remote encryption: generator: %s, prime: %s, server_public_key: %s"%(
			generator, prime, server_public_key,
		))
		client_private_key = get_private_key()
		client_public_key = get_public_key(generator, client_private_key, prime)
		client_public_key_bytes = int_to_bytes(client_public_key)
		self.remote_sendall(pack_unsigned_int(len(client_public_key_bytes)))
		self.remote_sendall(client_public_key_bytes)
		self.log("remote encryption: client_private_key: %s, client_public_key: %s"%(
			client_private_key, client_public_key,
		))
		share_key = get_share_key_bytes(server_public_key, client_private_key, prime)
		rijndael_key = get_rijndael_key(share_key)
		self.log("remote encryption: share_key: %s, rijndael_key: %s"%(
			share_key, rijndael_key.encode("hex"),
		))
		self.remote_rijndael_obj = rijndael.rijndael(rijndael_key, block_size=16)
		self.remote_rijndael_obj.lock = threading.RLock()
		self.generator = generator
		self.prime = prime