from __future__ import print_function import OpenSSL import pyuv import uvtls import signal import sys def shutdown_cb(handle, error): tls_h.close() def read_cb(handle, data, error): if error is not None: print("Read error: {}".format(pyuv.errno.strerror(error))) tls_h.close() return tls_h.write(data) print("Received data: {}".format(data)) if data.strip() == b'exit': tls_h.shutdown() def connect_cb(handle, error): if error is not None: print("Connection error: {}".format(pyuv.errno.strerror(error))) return print("Connected to {}".format(tls_h.getpeername())) tls_h.start_read(read_cb) def signal_cb(handle, signum): signal_h.close() tls_h.close() loop = pyuv.Loop.default_loop() ca = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open('ca.pem', 'r').read()) cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open('client.cert', 'r').read()) key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('client.pkey', 'r').read()) tls_h = uvtls.TLS(loop, cert=cert, key=key, ca_list=[ca]) tls_h.connect((sys.argv[1], int(sys.argv[2])), connect_cb) signal_h = pyuv.Signal(loop) signal_h.unref() signal_h.start(signal_cb, signal.SIGINT) loop.run()