Skip to content

Commit 2534bfd

Browse files
committed
extmod/modussl: Support server-side SSL sockets.
wrap_socket(sock, server_side=True)
1 parent 348edad commit 2534bfd

1 file changed

Lines changed: 28 additions & 14 deletions

File tree

extmod/modussl.c

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef struct _mp_obj_ssl_socket_t {
4747

4848
STATIC const mp_obj_type_t ussl_socket_type;
4949

50-
STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock) {
50+
STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, bool server_side) {
5151
mp_obj_ssl_socket_t *o = m_new_obj(mp_obj_ssl_socket_t);
5252
o->base.type = &ussl_socket_type;
5353
o->buf = NULL;
@@ -59,14 +59,18 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock) {
5959
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EINVAL)));
6060
}
6161

62-
o->ssl_sock = ssl_client_new(o->ssl_ctx, (long)sock, NULL, 0);
63-
64-
int res;
65-
/* check the return status */
66-
if ((res = ssl_handshake_status(o->ssl_sock)) != SSL_OK) {
67-
printf("ssl_handshake_status: %d\n", res);
68-
ssl_display_error(res);
69-
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EIO)));
62+
if (server_side) {
63+
o->ssl_sock = ssl_server_new(o->ssl_ctx, (long)sock);
64+
} else {
65+
o->ssl_sock = ssl_client_new(o->ssl_ctx, (long)sock, NULL, 0);
66+
67+
int res;
68+
/* check the return status */
69+
if ((res = ssl_handshake_status(o->ssl_sock)) != SSL_OK) {
70+
printf("ssl_handshake_status: %d\n", res);
71+
ssl_display_error(res);
72+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EIO)));
73+
}
7074
}
7175

7276
return o;
@@ -151,14 +155,24 @@ STATIC const mp_obj_type_t ussl_socket_type = {
151155
.locals_dict = (mp_obj_t)&ussl_socket_locals_dict,
152156
};
153157

154-
STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *args) {
158+
STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
155159
// TODO: Implement more args
156-
assert(n_args == 1);
157-
mp_obj_t sock = args[0];
160+
static const mp_arg_t allowed_args[] = {
161+
{ MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
162+
};
163+
158164
// TODO: Check that sock implements stream protocol
159-
return socket_new(sock);
165+
mp_obj_t sock = pos_args[0];
166+
167+
struct {
168+
mp_arg_val_t server_side;
169+
} args;
170+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args,
171+
MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t*)&args);
172+
173+
return socket_new(sock, args.server_side.u_bool);
160174
}
161-
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_ssl_wrap_socket_obj, 1, 6, mod_ssl_wrap_socket);
175+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_ssl_wrap_socket_obj, 1, mod_ssl_wrap_socket);
162176

163177
STATIC const mp_map_elem_t mp_module_ssl_globals_table[] = {
164178
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_ussl) },

0 commit comments

Comments
 (0)