summaryrefslogtreecommitdiffstatshomepage
path: root/extmod/modussl.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-28 17:27:20 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-28 17:27:20 +0300
commit2534bfdb928105202e672d249e7d420771b8366a (patch)
tree14b06dace63e82917727c5f0bae42d648b9374e3 /extmod/modussl.c
parent348edad88821e0bf8c1e0c1ae03b91dd889beb74 (diff)
downloadmicropython-2534bfdb928105202e672d249e7d420771b8366a.tar.gz
micropython-2534bfdb928105202e672d249e7d420771b8366a.zip
extmod/modussl: Support server-side SSL sockets.
wrap_socket(sock, server_side=True)
Diffstat (limited to 'extmod/modussl.c')
-rw-r--r--extmod/modussl.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/extmod/modussl.c b/extmod/modussl.c
index a77c8e0b34..b697bbdd66 100644
--- a/extmod/modussl.c
+++ b/extmod/modussl.c
@@ -47,7 +47,7 @@ typedef struct _mp_obj_ssl_socket_t {
STATIC const mp_obj_type_t ussl_socket_type;
-STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock) {
+STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, bool server_side) {
mp_obj_ssl_socket_t *o = m_new_obj(mp_obj_ssl_socket_t);
o->base.type = &ussl_socket_type;
o->buf = NULL;
@@ -59,14 +59,18 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock) {
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EINVAL)));
}
- o->ssl_sock = ssl_client_new(o->ssl_ctx, (long)sock, NULL, 0);
-
- int res;
- /* check the return status */
- if ((res = ssl_handshake_status(o->ssl_sock)) != SSL_OK) {
- printf("ssl_handshake_status: %d\n", res);
- ssl_display_error(res);
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EIO)));
+ if (server_side) {
+ o->ssl_sock = ssl_server_new(o->ssl_ctx, (long)sock);
+ } else {
+ o->ssl_sock = ssl_client_new(o->ssl_ctx, (long)sock, NULL, 0);
+
+ int res;
+ /* check the return status */
+ if ((res = ssl_handshake_status(o->ssl_sock)) != SSL_OK) {
+ printf("ssl_handshake_status: %d\n", res);
+ ssl_display_error(res);
+ nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(EIO)));
+ }
}
return o;
@@ -151,14 +155,24 @@ STATIC const mp_obj_type_t ussl_socket_type = {
.locals_dict = (mp_obj_t)&ussl_socket_locals_dict,
};
-STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *args) {
+STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
// TODO: Implement more args
- assert(n_args == 1);
- mp_obj_t sock = args[0];
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
+ };
+
// TODO: Check that sock implements stream protocol
- return socket_new(sock);
+ mp_obj_t sock = pos_args[0];
+
+ struct {
+ mp_arg_val_t server_side;
+ } args;
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args,
+ MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t*)&args);
+
+ return socket_new(sock, args.server_side.u_bool);
}
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_ssl_wrap_socket_obj, 1, 6, mod_ssl_wrap_socket);
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mod_ssl_wrap_socket_obj, 1, mod_ssl_wrap_socket);
STATIC const mp_map_elem_t mp_module_ssl_globals_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_ussl) },