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 ;
@@ -79,6 +92,12 @@ typedef struct _mp_obj_ssl_socket_t {
79
92
80
93
uintptr_t poll_mask ; // Indicates which read or write operations the protocol needs next
81
94
int last_error ; // The last error code, if any
95
+
96
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
97
+ mp_uint_t timer_start_ms ;
98
+ mp_int_t timer_fin_ms ;
99
+ mp_int_t timer_int_ms ;
100
+ #endif
82
101
} mp_obj_ssl_socket_t ;
83
102
84
103
static const mp_obj_type_t ssl_context_type ;
@@ -223,7 +242,10 @@ static mp_obj_t ssl_context_make_new(const mp_obj_type_t *type_in, size_t n_args
223
242
mp_arg_check_num (n_args , n_kw , 1 , 1 , false);
224
243
225
244
// This is the "protocol" argument.
226
- mp_int_t endpoint = mp_obj_get_int (args [0 ]);
245
+ mp_int_t protocol = mp_obj_get_int (args [0 ]);
246
+
247
+ int endpoint = (protocol & MP_ENDPOINT_IS_SERVER ) ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT ;
248
+ int transport = (protocol & MP_TRANSPORT_IS_DTLS ) ? MBEDTLS_SSL_TRANSPORT_DATAGRAM : MBEDTLS_SSL_TRANSPORT_STREAM ;
227
249
228
250
// Create SSLContext object.
229
251
#if MICROPY_PY_SSL_FINALISER
@@ -260,7 +282,7 @@ static mp_obj_t ssl_context_make_new(const mp_obj_type_t *type_in, size_t n_args
260
282
}
261
283
262
284
ret = mbedtls_ssl_config_defaults (& self -> conf , endpoint ,
263
- MBEDTLS_SSL_TRANSPORT_STREAM , MBEDTLS_SSL_PRESET_DEFAULT );
285
+ transport , MBEDTLS_SSL_PRESET_DEFAULT );
264
286
if (ret != 0 ) {
265
287
mbedtls_raise_error (ret );
266
288
}
@@ -494,6 +516,41 @@ static int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
494
516
}
495
517
}
496
518
519
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
520
+ static void _mbedtls_timing_set_delay (void * ctx , uint32_t int_ms , uint32_t fin_ms ) {
521
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
522
+
523
+ o -> timer_int_ms = int_ms ;
524
+ o -> timer_fin_ms = fin_ms ;
525
+
526
+ if (fin_ms != 0 ) {
527
+ o -> timer_start_ms = mp_hal_ticks_ms () & (MICROPY_PY_TIME_TICKS_PERIOD - 1 );
528
+ }
529
+ }
530
+
531
+ static int _mbedtls_timing_get_delay (void * ctx ) {
532
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
533
+
534
+ if (o -> timer_fin_ms == 0 ) {
535
+ return -1 ;
536
+ }
537
+
538
+ mp_uint_t now = mp_hal_ticks_ms () & (MICROPY_PY_TIME_TICKS_PERIOD - 1 );
539
+ mp_int_t elapsed_ms = ((now - o -> timer_start_ms + MICROPY_PY_TIME_TICKS_PERIOD / 2 ) & (MICROPY_PY_TIME_TICKS_PERIOD - 1 ))
540
+ - MICROPY_PY_TIME_TICKS_PERIOD / 2 ;
541
+
542
+ if (elapsed_ms >= o -> timer_fin_ms ) {
543
+ return 2 ;
544
+ }
545
+
546
+ if (elapsed_ms >= o -> timer_int_ms ) {
547
+ return 1 ;
548
+ }
549
+
550
+ return 0 ;
551
+ }
552
+ #endif
553
+
497
554
static mp_obj_t ssl_socket_make_new (mp_obj_ssl_context_t * ssl_context , mp_obj_t sock ,
498
555
bool server_side , bool do_handshake_on_connect , mp_obj_t server_hostname ) {
499
556
@@ -533,6 +590,12 @@ static mp_obj_t ssl_socket_make_new(mp_obj_ssl_context_t *ssl_context, mp_obj_t
533
590
mp_raise_ValueError (MP_ERROR_TEXT ("CERT_REQUIRED requires server_hostname" ));
534
591
}
535
592
593
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
594
+ mbedtls_ssl_set_timer_cb (& o -> ssl , o ,
595
+ _mbedtls_timing_set_delay ,
596
+ _mbedtls_timing_get_delay );
597
+ #endif
598
+
536
599
mbedtls_ssl_set_bio (& o -> ssl , & o -> sock , _mbedtls_ssl_send , _mbedtls_ssl_recv , NULL );
537
600
538
601
if (do_handshake_on_connect ) {
@@ -735,6 +798,12 @@ static const mp_rom_map_elem_t ssl_socket_locals_dict_table[] = {
735
798
{ MP_ROM_QSTR (MP_QSTR_readinto ), MP_ROM_PTR (& mp_stream_readinto_obj ) },
736
799
{ MP_ROM_QSTR (MP_QSTR_readline ), MP_ROM_PTR (& mp_stream_unbuffered_readline_obj ) },
737
800
{ MP_ROM_QSTR (MP_QSTR_write ), MP_ROM_PTR (& mp_stream_write_obj ) },
801
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
802
+ { MP_ROM_QSTR (MP_QSTR_recv ), MP_ROM_PTR (& mp_stream_read1_obj ) },
803
+ { MP_ROM_QSTR (MP_QSTR_recv_into ), MP_ROM_PTR (& mp_stream_readinto_obj ) },
804
+ { MP_ROM_QSTR (MP_QSTR_send ), MP_ROM_PTR (& mp_stream_write1_obj ) },
805
+ { MP_ROM_QSTR (MP_QSTR_sendall ), MP_ROM_PTR (& mp_stream_write_obj ) },
806
+ #endif
738
807
{ MP_ROM_QSTR (MP_QSTR_setblocking ), MP_ROM_PTR (& socket_setblocking_obj ) },
739
808
{ MP_ROM_QSTR (MP_QSTR_close ), MP_ROM_PTR (& mp_stream_close_obj ) },
740
809
#if MICROPY_PY_SSL_FINALISER
@@ -775,8 +844,12 @@ static const mp_rom_map_elem_t mp_module_tls_globals_table[] = {
775
844
776
845
// Constants.
777
846
{ MP_ROM_QSTR (MP_QSTR_MBEDTLS_VERSION ), MP_ROM_PTR (& mbedtls_version_obj )},
778
- { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_CLIENT ), MP_ROM_INT (MBEDTLS_SSL_IS_CLIENT ) },
779
- { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_SERVER ), MP_ROM_INT (MBEDTLS_SSL_IS_SERVER ) },
847
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_CLIENT ), MP_ROM_INT (MP_PROTOCOL_TLS_CLIENT ) },
848
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_TLS_SERVER ), MP_ROM_INT (MP_PROTOCOL_TLS_SERVER ) },
849
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
850
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_DTLS_CLIENT ), MP_ROM_INT (MP_PROTOCOL_DTLS_CLIENT ) },
851
+ { MP_ROM_QSTR (MP_QSTR_PROTOCOL_DTLS_SERVER ), MP_ROM_INT (MP_PROTOCOL_DTLS_SERVER ) },
852
+ #endif
780
853
{ MP_ROM_QSTR (MP_QSTR_CERT_NONE ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_NONE ) },
781
854
{ MP_ROM_QSTR (MP_QSTR_CERT_OPTIONAL ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_OPTIONAL ) },
782
855
{ MP_ROM_QSTR (MP_QSTR_CERT_REQUIRED ), MP_ROM_INT (MBEDTLS_SSL_VERIFY_REQUIRED ) },
0 commit comments