@@ -78,6 +78,7 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
7878 { MP_QSTR_certfile , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
7979 { MP_QSTR_server_side , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
8080 { MP_QSTR_cert_reqs , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = SSL_CERT_NONE } },
81+ { MP_QSTR_ssl_version , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = SL_SO_SEC_METHOD_TLSV1 } },
8182 { MP_QSTR_ca_certs , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = mp_const_none } },
8283 };
8384
@@ -93,17 +94,19 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
9394 // retrieve the file paths (with an 6 byte offset in order to strip it from the '/flash' prefix)
9495 const char * keyfile = (args [1 ].u_obj == mp_const_none ) ? NULL : & (mp_obj_str_get_str (args [1 ].u_obj )[6 ]);
9596 const char * certfile = (args [2 ].u_obj == mp_const_none ) ? NULL : & (mp_obj_str_get_str (args [2 ].u_obj )[6 ]);
96- const char * cafile = (args [5 ].u_obj == mp_const_none || args [4 ].u_int != SSL_CERT_REQUIRED ) ?
97- NULL : & (mp_obj_str_get_str (args [5 ].u_obj )[6 ]);
97+ const char * cafile = (args [6 ].u_obj == mp_const_none || args [4 ].u_int != SSL_CERT_REQUIRED ) ?
98+ NULL : & (mp_obj_str_get_str (args [6 ].u_obj )[6 ]);
9899
99100 // server side requires both certfile and keyfile
100101 if (args [3 ].u_bool && (!keyfile || !certfile )) {
101102 goto arg_error ;
102103 }
103104
104- _i16 sd = ((mod_network_socket_obj_t * )args [0 ].u_obj )-> sock_base .sd ;
105105 _i16 _errno ;
106- _u8 method = SL_SO_SEC_METHOD_TLSV1 ;
106+ _i16 sd = ((mod_network_socket_obj_t * )args [0 ].u_obj )-> sock_base .sd ;
107+
108+ // set the requested SSL method
109+ _u8 method = args [5 ].u_int ;
107110 if ((_errno = sl_SetSockOpt (sd , SL_SOL_SOCKET , SL_SO_SECMETHOD , & method , sizeof (method ))) < 0 ) {
108111 goto socket_error ;
109112 }
@@ -146,6 +149,11 @@ STATIC const mp_map_elem_t mp_module_ussl_globals_table[] = {
146149 { MP_OBJ_NEW_QSTR (MP_QSTR_CERT_NONE ), MP_OBJ_NEW_SMALL_INT (SSL_CERT_NONE ) },
147150 { MP_OBJ_NEW_QSTR (MP_QSTR_CERT_OPTIONAL ), MP_OBJ_NEW_SMALL_INT (SSL_CERT_OPTIONAL ) },
148151 { MP_OBJ_NEW_QSTR (MP_QSTR_CERT_REQUIRED ), MP_OBJ_NEW_SMALL_INT (SSL_CERT_REQUIRED ) },
152+
153+ { MP_OBJ_NEW_QSTR (MP_QSTR_PROTOCOL_SSLv3 ), MP_OBJ_NEW_SMALL_INT (SL_SO_SEC_METHOD_SSLV3 ) },
154+ { MP_OBJ_NEW_QSTR (MP_QSTR_PROTOCOL_TLSv1 ), MP_OBJ_NEW_SMALL_INT (SL_SO_SEC_METHOD_TLSV1 ) },
155+ { MP_OBJ_NEW_QSTR (MP_QSTR_PROTOCOL_TLSv1_1 ), MP_OBJ_NEW_SMALL_INT (SL_SO_SEC_METHOD_TLSV1_1 ) },
156+ { MP_OBJ_NEW_QSTR (MP_QSTR_PROTOCOL_TLSv1_2 ), MP_OBJ_NEW_SMALL_INT (SL_SO_SEC_METHOD_TLSV1_2 ) },
149157};
150158
151159STATIC MP_DEFINE_CONST_DICT (mp_module_ussl_globals , mp_module_ussl_globals_table );
0 commit comments