35
35
#include "py/runtime.h"
36
36
#include "py/stream.h"
37
37
#include "py/objstr.h"
38
+ #include "py/smallint.h"
39
+ #include "py/mphal.h"
38
40
39
41
// mbedtls_time_t
40
42
#include "mbedtls/platform.h"
43
45
#include "mbedtls/pk.h"
44
46
#include "mbedtls/entropy.h"
45
47
#include "mbedtls/ctr_drbg.h"
48
+ #include "mbedtls/timing.h"
46
49
#include "mbedtls/debug.h"
47
50
#include "mbedtls/error.h"
48
51
@@ -61,6 +64,12 @@ typedef struct _mp_obj_ssl_socket_t {
61
64
62
65
uintptr_t poll_mask ; // Indicates which read or write operations the protocol needs next
63
66
int last_error ; // The last error code, if any
67
+
68
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
69
+ mp_uint_t timer_start_ms ;
70
+ mp_int_t timer_fin_ms ;
71
+ mp_int_t timer_int_ms ;
72
+ #endif
64
73
} mp_obj_ssl_socket_t ;
65
74
66
75
struct ssl_args {
@@ -71,6 +80,7 @@ struct ssl_args {
71
80
mp_arg_val_t cert_reqs ;
72
81
mp_arg_val_t cadata ;
73
82
mp_arg_val_t do_handshake ;
83
+ mp_arg_val_t dtls ;
74
84
};
75
85
76
86
STATIC const mp_obj_type_t ussl_socket_type ;
@@ -158,6 +168,40 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
158
168
}
159
169
}
160
170
171
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
172
+ STATIC void _mbedtls_timing_set_delay (void * ctx , uint32_t int_ms , uint32_t fin_ms ) {
173
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
174
+
175
+ o -> timer_int_ms = int_ms ;
176
+ o -> timer_fin_ms = fin_ms ;
177
+
178
+ if (fin_ms != 0 ) {
179
+ o -> timer_start_ms = mp_hal_ticks_ms () & (MICROPY_PY_UTIME_TICKS_PERIOD - 1 );
180
+ }
181
+ }
182
+
183
+ STATIC int _mbedtls_timing_get_delay (void * ctx ) {
184
+ mp_obj_ssl_socket_t * o = (mp_obj_ssl_socket_t * )ctx ;
185
+
186
+ if (o -> timer_fin_ms == 0 ) {
187
+ return -1 ;
188
+ }
189
+
190
+ mp_uint_t now = mp_hal_ticks_ms () & (MICROPY_PY_UTIME_TICKS_PERIOD - 1 );
191
+ mp_int_t elapsed_ms = ((now - o -> timer_start_ms + MICROPY_PY_UTIME_TICKS_PERIOD / 2 ) & (MICROPY_PY_UTIME_TICKS_PERIOD - 1 ))
192
+ - MICROPY_PY_UTIME_TICKS_PERIOD / 2 ;
193
+
194
+ if (elapsed_ms >= o -> timer_fin_ms ) {
195
+ return 2 ;
196
+ }
197
+
198
+ if (elapsed_ms >= o -> timer_int_ms ) {
199
+ return 1 ;
200
+ }
201
+
202
+ return 0 ;
203
+ }
204
+ #endif
161
205
162
206
STATIC mp_obj_ssl_socket_t * socket_new (mp_obj_t sock , struct ssl_args * args ) {
163
207
// Verify the socket object has the full stream protocol
@@ -194,7 +238,7 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
194
238
195
239
ret = mbedtls_ssl_config_defaults (& o -> conf ,
196
240
args -> server_side .u_bool ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT ,
197
- MBEDTLS_SSL_TRANSPORT_STREAM ,
241
+ args -> dtls . u_bool ? MBEDTLS_SSL_TRANSPORT_DATAGRAM : MBEDTLS_SSL_TRANSPORT_STREAM ,
198
242
MBEDTLS_SSL_PRESET_DEFAULT );
199
243
if (ret != 0 ) {
200
244
goto cleanup ;
@@ -219,6 +263,12 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
219
263
}
220
264
}
221
265
266
+ #ifdef MBEDTLS_SSL_PROTO_DTLS
267
+ mbedtls_ssl_set_timer_cb (& o -> ssl , o ,
268
+ _mbedtls_timing_set_delay ,
269
+ _mbedtls_timing_get_delay );
270
+ #endif
271
+
222
272
mbedtls_ssl_set_bio (& o -> ssl , & o -> sock , _mbedtls_ssl_send , _mbedtls_ssl_recv , NULL );
223
273
224
274
if (args -> key .u_obj != mp_const_none ) {
@@ -483,6 +533,7 @@ STATIC mp_obj_t mod_ssl_wrap_socket(size_t n_args, const mp_obj_t *pos_args, mp_
483
533
{ MP_QSTR_cert_reqs , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = MBEDTLS_SSL_VERIFY_NONE }},
484
534
{ MP_QSTR_cadata , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
485
535
{ MP_QSTR_do_handshake , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = true} },
536
+ { MP_QSTR_dtls , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
486
537
};
487
538
488
539
// TODO: Check that sock implements stream protocol
0 commit comments