summaryrefslogtreecommitdiffstatshomepage
path: root/tests/multi_net/asyncio_tls_server_client_readline.py
diff options
context:
space:
mode:
authorCarlosgg <carlosgilglez@gmail.com>2023-11-30 16:44:48 +0000
committerDamien George <damien@micropython.org>2023-12-14 12:20:19 +1100
commitbfd6ad94ff950a4b7e3a2125db1539c5e4ca333a (patch)
treed208c64df8939dec43f3576f033c87eb228d5537 /tests/multi_net/asyncio_tls_server_client_readline.py
parentf33dfb966a1432281809e372b9d3803e7fd3cb2f (diff)
downloadmicropython-bfd6ad94ff950a4b7e3a2125db1539c5e4ca333a.tar.gz
micropython-bfd6ad94ff950a4b7e3a2125db1539c5e4ca333a.zip
extmod/asyncio: Add ssl support with SSLContext.
This adds asyncio ssl support with SSLContext and the corresponding tests in `tests/net_inet` and `tests/multi_net`. Note that not doing the handshake on connect will delegate the handshake to the following `mbedtls_ssl_read/write` calls. However if the handshake fails when a client certificate is required and not presented by the peer, it needs to be notified of this handshake error (otherwise it will hang until timeout if any). Finally at MicroPython side raise the proper mbedtls error code and message. Signed-off-by: Carlos Gil <carlosgilglez@gmail.com>
Diffstat (limited to 'tests/multi_net/asyncio_tls_server_client_readline.py')
-rw-r--r--tests/multi_net/asyncio_tls_server_client_readline.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/tests/multi_net/asyncio_tls_server_client_readline.py b/tests/multi_net/asyncio_tls_server_client_readline.py
new file mode 100644
index 0000000000..28add38f5d
--- /dev/null
+++ b/tests/multi_net/asyncio_tls_server_client_readline.py
@@ -0,0 +1,77 @@
+# Test asyncio TCP server and client with TLS, using readline() to read data.
+
+try:
+ import os
+ import asyncio
+ import ssl
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+PORT = 8000
+
+# These are test certificates. See tests/README.md for details.
+cert = cafile = "multi_net/rsa_cert.der"
+key = "multi_net/rsa_key.der"
+
+try:
+ os.stat(cafile)
+ os.stat(key)
+except OSError:
+ print("SKIP")
+ raise SystemExit
+
+
+async def handle_connection(reader, writer):
+ data = await reader.readline()
+ print("echo:", data)
+ data2 = await reader.readline()
+ print("echo:", data2)
+ writer.write(data + data2)
+ await writer.drain()
+
+ print("close")
+ writer.close()
+ await writer.wait_closed()
+
+ print("done")
+ ev.set()
+
+
+async def tcp_server():
+ global ev
+
+ server_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
+ server_ctx.load_cert_chain(cert, key)
+ ev = asyncio.Event()
+ server = await asyncio.start_server(handle_connection, "0.0.0.0", PORT, ssl=server_ctx)
+ print("server running")
+ multitest.next()
+ async with server:
+ await asyncio.wait_for(ev.wait(), 10)
+
+
+async def tcp_client(message):
+ client_ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
+ client_ctx.verify_mode = ssl.CERT_REQUIRED
+ client_ctx.load_verify_locations(cafile=cafile)
+ reader, writer = await asyncio.open_connection(
+ IP, PORT, ssl=client_ctx, server_hostname="micropython.local"
+ )
+ print("write:", message)
+ writer.write(message)
+ await writer.drain()
+ data = await reader.readline()
+ print("read:", data)
+ data2 = await reader.readline()
+ print("read:", data2)
+
+
+def instance0():
+ multitest.globals(IP=multitest.get_network_ip())
+ asyncio.run(tcp_server())
+
+
+def instance1():
+ multitest.next()
+ asyncio.run(tcp_client(b"client data\nclient data2\n"))