Skip to content

Commit 3617428

Browse files
committed
extmod/modussl_mbedtls.c: Add missing args and constants to ssl module.
1 parent 262f4a4 commit 3617428

File tree

7 files changed

+420
-1
lines changed

7 files changed

+420
-1
lines changed

docs/library/ssl.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ Functions
3131
until it completes. Note that in AXTLS the handshake can be deferred until the first
3232
read or write but it then blocks until completion.
3333

34+
- *cert_reqs* determines whether the peer (server or client) must present a valid certificate.
35+
Note that for mbedtls based ports, ``ssl.CERT_NONE`` and ``ssl.CERT_OPTIONAL`` will not
36+
validate any certificate, only ``ssl.CERT_REQUIRED`` will.
37+
38+
- *ca_certs* is the CA certificate chain that will validate the peer's certificate.
39+
40+
3441
Depending on the underlying module implementation in a particular
3542
:term:`MicroPython port`, some or all keyword arguments above may be not supported.
3643

extmod/modussl_mbedtls.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ struct ssl_args {
6363
mp_arg_val_t cert;
6464
mp_arg_val_t server_side;
6565
mp_arg_val_t server_hostname;
66+
mp_arg_val_t cert_reqs;
67+
mp_arg_val_t ca_certs;
6668
mp_arg_val_t do_handshake;
6769
};
6870

@@ -191,7 +193,10 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
191193
goto cleanup;
192194
}
193195

194-
mbedtls_ssl_conf_authmode(&o->conf, MBEDTLS_SSL_VERIFY_NONE);
196+
197+
mbedtls_ssl_conf_authmode(&o->conf, args->cert_reqs.u_int);
198+
199+
195200
mbedtls_ssl_conf_rng(&o->conf, mbedtls_ctr_drbg_random, &o->ctr_drbg);
196201
#ifdef MBEDTLS_DEBUG_C
197202
mbedtls_ssl_conf_dbg(&o->conf, mbedtls_debug, NULL);
@@ -237,6 +242,20 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
237242
}
238243
}
239244

245+
if (args->ca_certs.u_obj != mp_const_none) {
246+
size_t cacert_len;
247+
const byte *cacert = (const byte *)mp_obj_str_get_data(args->ca_certs.u_obj, &cacert_len);
248+
// len should include terminating null
249+
ret = mbedtls_x509_crt_parse(&o->cacert, cacert, cacert_len + 1);
250+
if (ret != 0) {
251+
ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA; // use general error for all cert errors
252+
goto cleanup;
253+
}
254+
255+
mbedtls_ssl_conf_ca_chain(&o->conf, &o->cacert, NULL);
256+
257+
}
258+
240259
if (args->do_handshake.u_bool) {
241260
while ((ret = mbedtls_ssl_handshake(&o->ssl)) != 0) {
242261
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
@@ -395,6 +414,8 @@ STATIC mp_obj_t mod_ssl_wrap_socket(size_t n_args, const mp_obj_t *pos_args, mp_
395414
{ MP_QSTR_cert, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
396415
{ MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
397416
{ MP_QSTR_server_hostname, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
417+
{ MP_QSTR_cert_reqs, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = MBEDTLS_SSL_VERIFY_NONE}},
418+
{ MP_QSTR_ca_certs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
398419
{ MP_QSTR_do_handshake, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
399420
};
400421

@@ -412,6 +433,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_ssl_wrap_socket_obj, 1, mod_ssl_wrap_socke
412433
STATIC const mp_rom_map_elem_t mp_module_ssl_globals_table[] = {
413434
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ussl) },
414435
{ MP_ROM_QSTR(MP_QSTR_wrap_socket), MP_ROM_PTR(&mod_ssl_wrap_socket_obj) },
436+
{ MP_ROM_QSTR(MP_QSTR_CERT_NONE), MP_ROM_INT(MBEDTLS_SSL_VERIFY_NONE) },
437+
{ MP_ROM_QSTR(MP_QSTR_CERT_OPTIONAL), MP_ROM_INT(MBEDTLS_SSL_VERIFY_OPTIONAL) },
438+
{ MP_ROM_QSTR(MP_QSTR_CERT_REQUIRED), MP_ROM_INT(MBEDTLS_SSL_VERIFY_REQUIRED) },
415439
};
416440

417441
STATIC MP_DEFINE_CONST_DICT(mp_module_ssl_globals, mp_module_ssl_globals_table);

tests/multi_net/ssl_cert_ecc.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Simple test creating an SSL connection and transferring some data
2+
# This test won't run under CPython because it requires key/cert
3+
4+
try:
5+
import ubinascii as binascii, usocket as socket, ussl as ssl
6+
except ImportError:
7+
print("SKIP")
8+
raise SystemExit
9+
10+
PORT = 8000
11+
_MBEDTLS = hasattr(ssl, "CERT_REQUIRED")
12+
13+
# This self-signed key/cert pair is randomly generated and to be used for
14+
# testing/demonstration only. You should always generate your own key/cert.
15+
if _MBEDTLS:
16+
cert = b"""-----BEGIN CERTIFICATE-----
17+
MIICSTCCAe+gAwIBAgIJAK7kDH3KW/pbMAoGCCqGSM49BAMCMIGAMQswCQYDVQQG
18+
EwJBVTEMMAoGA1UECAwDRm9vMQwwCgYDVQQHDANCYXIxFDASBgNVBAoMC01pY3Jv
19+
UHl0aG9uMQswCQYDVQQLDAJNUDEWMBQGA1UEAwwNZXNwaG9tZS5sb2NhbDEaMBgG
20+
CSqGSIb3DQEJARYLZm9vQGJhci5jb20wHhcNMjIwNzEyMTcxOTU5WhcNMzIwNzA5
21+
MTcxOTU5WjCBgDELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA0ZvbzEMMAoGA1UEBwwD
22+
QmFyMRQwEgYDVQQKDAtNaWNyb1B5dGhvbjELMAkGA1UECwwCTVAxFjAUBgNVBAMM
23+
DWVzcGhvbWUubG9jYWwxGjAYBgkqhkiG9w0BCQEWC2Zvb0BiYXIuY29tMFkwEwYH
24+
KoZIzj0CAQYIKoZIzj0DAQcDQgAEmuTTWsQ44oUgEt/fpjm33x2JbS8FdiVnC2Cc
25+
4QFUsr8AqVTOwCzqqDO6MvXask8WyBjmROV0NS1QAp8zM8CnlqNQME4wHQYDVR0O
26+
BBYEFLS6piYUhW4Z3l6DSyNC6BuJetg9MB8GA1UdIwQYMBaAFLS6piYUhW4Z3l6D
27+
SyNC6BuJetg9MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgaoRjizC+
28+
AvvlQQjl6Jw3lFCxvuYrwy4YwNKgqJDyz8UCIQCFyMWi4kkniUZxhCZwuvJiPXl/
29+
HFSxkQyQfayCKkApCA==
30+
-----END CERTIFICATE-----"""
31+
32+
key = b"""-----BEGIN EC PARAMETERS-----
33+
BggqhkjOPQMBBw==
34+
-----END EC PARAMETERS-----
35+
-----BEGIN EC PRIVATE KEY-----
36+
MHcCAQEEII9I4GhoeGqhgOz5Ybqh5NTEwLQmli1jIzvrr6/6clLSoAoGCCqGSM49
37+
AwEHoUQDQgAEmuTTWsQ44oUgEt/fpjm33x2JbS8FdiVnC2Cc4QFUsr8AqVTOwCzq
38+
qDO6MvXask8WyBjmROV0NS1QAp8zM8Cnlg==
39+
-----END EC PRIVATE KEY-----"""
40+
41+
else:
42+
key = binascii.unhexlify(
43+
b"3082013b020100024100cc20643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef"
44+
b"610a6a6ba14abb891745cd18a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f"
45+
b"872d0203010001024100bb17a54aeb3dd7ae4edec05e775ca9632cf02d29c2a089b563b0"
46+
b"d05cdf95aeca507de674553f28b4eadaca82d5549a86058f9996b07768686a5b02cb240d"
47+
b"d9f1022100f4a63f5549e817547dca97b5c658038e8593cb78c5aba3c4642cc4cd031d86"
48+
b"8f022100d598d870ffe4a34df8de57047a50b97b71f4d23e323f527837c9edae88c79483"
49+
b"02210098560c89a70385c36eb07fd7083235c4c1184e525d838aedf7128958bedfdbb102"
50+
b"2051c0dab7057a8176ca966f3feb81123d4974a733df0f958525f547dfd1c271f9022044"
51+
b"6c2cafad455a671a8cf398e642e1be3b18a3d3aec2e67a9478f83c964c4f1f"
52+
)
53+
54+
cert = binascii.unhexlify(
55+
b"308201d53082017f020203e8300d06092a864886f70d01010505003075310b3009060355"
56+
b"0406130258583114301206035504080c0b54686550726f76696e63653110300e06035504"
57+
b"070c075468654369747931133011060355040a0c0a436f6d70616e7958595a3113301106"
58+
b"0355040b0c0a436f6d70616e7958595a3114301206035504030c0b546865486f73744e61"
59+
b"6d65301e170d3139313231383033333935355a170d3239313231353033333935355a3075"
60+
b"310b30090603550406130258583114301206035504080c0b54686550726f76696e636531"
61+
b"10300e06035504070c075468654369747931133011060355040a0c0a436f6d70616e7958"
62+
b"595a31133011060355040b0c0a436f6d70616e7958595a3114301206035504030c0b5468"
63+
b"65486f73744e616d65305c300d06092a864886f70d0101010500034b003048024100cc20"
64+
b"643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef610a6a6ba14abb891745cd18"
65+
b"a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f872d0203010001300d06092a"
66+
b"864886f70d0101050500034100b0513fe2829e9ecbe55b6dd14c0ede7502bde5d46153c8"
67+
b"e960ae3ebc247371b525caeb41bbcf34686015a44c50d226e66aef0a97a63874ca5944ef"
68+
b"979b57f0b3"
69+
)
70+
71+
# Server
72+
def instance0():
73+
multitest.globals(IP=multitest.get_network_ip())
74+
s = socket.socket()
75+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
76+
s.bind(socket.getaddrinfo("0.0.0.0", PORT)[0][-1])
77+
s.listen(1)
78+
multitest.next()
79+
s2, _ = s.accept()
80+
s2 = ssl.wrap_socket(s2, server_side=True, key=key, cert=cert)
81+
print(s2.read(16))
82+
s2.write(b"server to client")
83+
s2.close()
84+
s.close()
85+
86+
87+
# Client
88+
def instance1():
89+
multitest.next()
90+
s = socket.socket()
91+
s.connect(socket.getaddrinfo(IP, PORT)[0][-1])
92+
if _MBEDTLS:
93+
s = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs=cert)
94+
else:
95+
s = ssl.wrap_socket(s)
96+
s.write(b"client to server")
97+
print(s.read(16))
98+
s.close()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--- instance0 ---
2+
b'client to server'
3+
--- instance1 ---
4+
b'server to client'

tests/multi_net/ssl_cert_rsa.py

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# Simple test creating an SSL connection and transferring some data
2+
# This test won't run under CPython because it requires key/cert
3+
4+
try:
5+
import ubinascii as binascii, usocket as socket, ussl as ssl
6+
except ImportError:
7+
print("SKIP")
8+
raise SystemExit
9+
10+
PORT = 8000
11+
_MBEDTLS = hasattr(ssl, "CERT_REQUIRED")
12+
13+
# This self-signed key/cert pair is randomly generated and to be used for
14+
# testing/demonstration only. You should always generate your own key/cert.
15+
if _MBEDTLS:
16+
cert = b"""-----BEGIN CERTIFICATE-----
17+
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
48+
Pe+FTUACEZa3oGs=
49+
-----END CERTIFICATE-----"""
50+
51+
key = b"""-----BEGIN PRIVATE KEY-----
52+
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
101+
pvvPUbqDVjrthaT4hv/xoiQjdI2DeYw=
102+
-----END PRIVATE KEY-----"""
103+
104+
else:
105+
key = binascii.unhexlify(
106+
b"3082013b020100024100cc20643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef"
107+
b"610a6a6ba14abb891745cd18a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f"
108+
b"872d0203010001024100bb17a54aeb3dd7ae4edec05e775ca9632cf02d29c2a089b563b0"
109+
b"d05cdf95aeca507de674553f28b4eadaca82d5549a86058f9996b07768686a5b02cb240d"
110+
b"d9f1022100f4a63f5549e817547dca97b5c658038e8593cb78c5aba3c4642cc4cd031d86"
111+
b"8f022100d598d870ffe4a34df8de57047a50b97b71f4d23e323f527837c9edae88c79483"
112+
b"02210098560c89a70385c36eb07fd7083235c4c1184e525d838aedf7128958bedfdbb102"
113+
b"2051c0dab7057a8176ca966f3feb81123d4974a733df0f958525f547dfd1c271f9022044"
114+
b"6c2cafad455a671a8cf398e642e1be3b18a3d3aec2e67a9478f83c964c4f1f"
115+
)
116+
117+
cert = binascii.unhexlify(
118+
b"308201d53082017f020203e8300d06092a864886f70d01010505003075310b3009060355"
119+
b"0406130258583114301206035504080c0b54686550726f76696e63653110300e06035504"
120+
b"070c075468654369747931133011060355040a0c0a436f6d70616e7958595a3113301106"
121+
b"0355040b0c0a436f6d70616e7958595a3114301206035504030c0b546865486f73744e61"
122+
b"6d65301e170d3139313231383033333935355a170d3239313231353033333935355a3075"
123+
b"310b30090603550406130258583114301206035504080c0b54686550726f76696e636531"
124+
b"10300e06035504070c075468654369747931133011060355040a0c0a436f6d70616e7958"
125+
b"595a31133011060355040b0c0a436f6d70616e7958595a3114301206035504030c0b5468"
126+
b"65486f73744e616d65305c300d06092a864886f70d0101010500034b003048024100cc20"
127+
b"643fd3d9c21a0acba4f48f61aadd675f52175a9dcf07fbef610a6a6ba14abb891745cd18"
128+
b"a1d4c056580d8ff1a639460f867013c8391cdc9f2e573b0f872d0203010001300d06092a"
129+
b"864886f70d0101050500034100b0513fe2829e9ecbe55b6dd14c0ede7502bde5d46153c8"
130+
b"e960ae3ebc247371b525caeb41bbcf34686015a44c50d226e66aef0a97a63874ca5944ef"
131+
b"979b57f0b3"
132+
)
133+
134+
# Server
135+
def instance0():
136+
multitest.globals(IP=multitest.get_network_ip())
137+
s = socket.socket()
138+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
139+
s.bind(socket.getaddrinfo("0.0.0.0", PORT)[0][-1])
140+
s.listen(1)
141+
multitest.next()
142+
s2, _ = s.accept()
143+
s2 = ssl.wrap_socket(s2, server_side=True, key=key, cert=cert)
144+
print(s2.read(16))
145+
s2.write(b"server to client")
146+
s2.close()
147+
s.close()
148+
149+
150+
# Client
151+
def instance1():
152+
multitest.next()
153+
s = socket.socket()
154+
s.connect(socket.getaddrinfo(IP, PORT)[0][-1])
155+
if _MBEDTLS:
156+
s = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs=cert)
157+
else:
158+
s = ssl.wrap_socket(s)
159+
s.write(b"client to server")
160+
print(s.read(16))
161+
s.close()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--- instance0 ---
2+
b'client to server'
3+
--- instance1 ---
4+
b'server to client'

0 commit comments

Comments
 (0)