37
37
#include "py/stream.h"
38
38
#include "py/objstr.h"
39
39
#include "py/reader.h"
40
+ #include "py/smallint.h"
41
+ #include "py/mphal.h"
40
42
#include "extmod/vfs.h"
41
43
42
44
// mbedtls_time_t
46
48
#include "mbedtls/pk.h"
47
49
#include "mbedtls/entropy.h"
48
50
#include "mbedtls/ctr_drbg.h"
51
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
52
+ #include "mbedtls/timing.h"
53
+ #endif
49
54
#include "mbedtls/debug.h"
50
55
#include "mbedtls/error.h"
51
56
#if MBEDTLS_VERSION_NUMBER >= 0x03000000
56
61
57
62
#define MP_STREAM_POLL_RDWR (MP_STREAM_POLL_RD | MP_STREAM_POLL_WR)
58
63
64
+ #define MP_ENDPOINT_IS_SERVER (1 << 0)
65
+ #define MP_TRANSPORT_IS_DTLS (1 << 1)
66
+
67
+ #define MP_PROTOCOL_TLS_CLIENT 0
68
+ #define MP_PROTOCOL_TLS_SERVER MP_ENDPOINT_IS_SERVER
69
+ #define MP_PROTOCOL_DTLS_CLIENT MP_TRANSPORT_IS_DTLS
70
+ #define MP_PROTOCOL_DTLS_SERVER MP_ENDPOINT_IS_SERVER | MP_TRANSPORT_IS_DTLS
71
+
59
72
// This corresponds to an SSLContext object.
60
73
typedef struct _mp_obj_ssl_context_t {
61
74
mp_obj_base_t base ;
@@ -78,6 +91,12 @@ typedef struct _mp_obj_ssl_socket_t {
78
91
79
92
uintptr_t poll_mask ; // Indicates which read or write operations the protocol needs next
80
93
int last_error ; // The last error code, if any
94
+
95
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
96
+ mp_uint_t timer_start_ms ;
97
+ mp_int_t timer_fin_ms ;
98
+ mp_int_t timer_int_ms ;
99
+ #endif
81
100
} mp_obj_ssl_socket_t ;
82
101
83
102
STATIC const mp_obj_type_t ssl_context_type ;
@@ -213,7 +232,10 @@ STATIC mp_obj_t ssl_context_make_new(const mp_obj_type_t *type_in, size_t n_args
213
232
mp_arg_check_num (n_args , n_kw , 1 , 1 , false);
214
233
215
234
// This is the "protocol" argument.
216
- mp_int_t endpoint = mp_obj_get_int (args [0 ]);
235
+ mp_int_t protocol = mp_obj_get_int (args [0 ]);
236
+
237
+ int endpoint = (protocol & MP_ENDPOINT_IS_SERVER ) ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT ;
238
+ int transport = (protocol & MP_TRANSPORT_IS_DTLS ) ? MBEDTLS_SSL_TRANSPORT_DATAGRAM : MBEDTLS_SSL_TRANSPORT_STREAM ;
217
239
218
240
// Create SSLContext object.
219
241
#if MICROPY_PY_SSL_FINALISER
@@ -250,7 +272,7 @@ STATIC mp_obj_t ssl_context_make_new(const mp_obj_type_t *type_in, size_t n_args
250
272
}
251
273
252
274
ret = mbedtls_ssl_config_defaults (& self -> conf , endpoint ,
253
- MBEDTLS_SSL_TRANSPORT_STREAM , MBEDTLS_SSL_PRESET_DEFAULT );
275
+ transport , MBEDTLS_SSL_PRESET_DEFAULT );
254
276
if (ret != 0 ) {
255
277
mbedtls_raise_error (ret );
256
278
}
@@ -518,6 +540,41 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
518
540
}
519
541
}
520
542
543
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
544
+ STATIC void _mbedtls_timing_set_delay (void * ctx , uint32_t int_ms , uint32_t fin_ms ) {
545
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
546
+
547
+ o -> timer_int_ms = int_ms ;
548
+ o -> timer_fin_ms = fin_ms ;
549
+
550
+ if (fin_ms != 0 ) {
551
+ o -> timer_start_ms = mp_hal_ticks_ms () & (MICROPY_PY_TIME_TICKS_PERIOD - 1 );
552
+ }
553
+ }
554
+
555
+ STATIC int _mbedtls_timing_get_delay (void * ctx ) {
556
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
557
+
558
+ if (o -> timer_fin_ms == 0 ) {
559
+ return -1 ;
560
+ }
561
+
562
+ mp_uint_t now = mp_hal_ticks_ms () & (MICROPY_PY_TIME_TICKS_PERIOD - 1 );
563
+ mp_int_t elapsed_ms = ((now - o -> timer_start_ms + MICROPY_PY_TIME_TICKS_PERIOD / 2 ) & (MICROPY_PY_TIME_TICKS_PERIOD - 1 ))
564
+ - MICROPY_PY_TIME_TICKS_PERIOD / 2 ;
565
+
566
+ if (elapsed_ms >= o -> timer_fin_ms ) {
567
+ return 2 ;
568
+ }
569
+
570
+ if (elapsed_ms >= o -> timer_int_ms ) {
571
+ return 1 ;
572
+ }
573
+
574
+ return 0 ;
575
+ }
576
+ #endif
577
+
521
578
STATIC mp_obj_t ssl_socket_make_new (mp_obj_ssl_context_t * ssl_context , mp_obj_t sock ,
522
579
bool server_side , bool do_handshake_on_connect , mp_obj_t server_hostname ) {
523
580
@@ -558,6 +615,12 @@ STATIC mp_obj_t ssl_socket_make_new(mp_obj_ssl_context_t *ssl_context, mp_obj_t
558
615
mp_raise_ValueError (MP_ERROR_TEXT ("CERT_REQUIRED requires server_hostname" ));
559
616
}
560
617
618
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
619
+ mbedtls_ssl_set_timer_cb (& o -> ssl , o ,
620
+ _mbedtls_timing_set_delay ,
621
+ _mbedtls_timing_get_delay );
622
+ #endif
623
+
561
624
mbedtls_ssl_set_bio (& o -> ssl , & o -> sock , _mbedtls_ssl_send , _mbedtls_ssl_recv , NULL );
562
625
563
626
if (do_handshake_on_connect ) {
@@ -760,6 +823,12 @@ STATIC const mp_rom_map_elem_t ssl_socket_locals_dict_table[] = {
760
823
{ MP_ROM_QSTR (MP_QSTR_readinto ), MP_ROM_PTR (& mp_stream_readinto_obj ) },
761
824
{ MP_ROM_QSTR (MP_QSTR_readline ), MP_ROM_PTR (& mp_stream_unbuffered_readline_obj ) },
762
825
{ MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& mp_stream_write_obj ) },
826
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
827
+ { MP_ROM_QSTR (MP_QSTR_recv ), MP_ROM_PTR (& mp_stream_read1_obj ) },
828
+ { MP_ROM_QSTR (MP_QSTR_recv_into ), MP_ROM_PTR (& mp_stream_readinto_obj ) },
829
+ { MP_ROM_QSTR (MP_QSTR_send ), MP_ROM_PTR (& mp_stream_write1_obj ) },
830
+ { MP_ROM_QSTR (MP_QSTR_sendall ), MP_ROM_PTR (& mp_stream_write_obj ) },
831
+ #endif
763
832
{ MP_ROM_QSTR (MP_QSTR_setblocking ), MP_ROM_PTR (& socket_setblocking_obj ) },
764
833
{ MP_ROM_QSTR (MP_QSTR_close ), MP_ROM_PTR (& mp_stream_close_obj ) },
765
834
#if MICROPY_PY_SSL_FINALISER
@@ -853,8 +922,12 @@ STATIC const mp_rom_map_elem_t mp_module_ssl_globals_table[] = {
853
922
854
923
// Constants.
855
924
{ MP_ROM_QSTR (MP_QSTR_MBEDTLS_VERSION ), MP_ROM_PTR (& mbedtls_version_obj )},
856
- { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_CLIENT ), MP_ROM_INT (MBEDTLS_SSL_IS_CLIENT ) },
857
- { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_SERVER ), MP_ROM_INT (MBEDTLS_SSL_IS_SERVER ) },
925
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_CLIENT ), MP_ROM_INT (MP_PROTOCOL_TLS_CLIENT ) },
926
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_SERVER ), MP_ROM_INT (MP_PROTOCOL_TLS_SERVER ) },
927
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
928
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_DTLS_CLIENT ), MP_ROM_INT (MP_PROTOCOL_DTLS_CLIENT ) },
929
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_DTLS_SERVER ), MP_ROM_INT (MP_PROTOCOL_DTLS_SERVER ) },
930
+ #endif
858
931
{ MP_ROM_QSTR (MP_QSTR_CERT_NONE ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_NONE ) },
859
932
{ MP_ROM_QSTR (MP_QSTR_CERT_OPTIONAL ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_OPTIONAL ) },
860
933
{ MP_ROM_QSTR (MP_QSTR_CERT_REQUIRED ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_REQUIRED ) },
0 commit comments