Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 98 additions & 34 deletions esp32/frozen/LTE/sqnsupgrade.py

Large diffs are not rendered by default.

79 changes: 46 additions & 33 deletions esp32/mods/lwipsocket.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "lwipsocket.h"


#define WLAN_MAX_RX_SIZE 2048
Expand Down Expand Up @@ -156,49 +157,19 @@ int lwipsocket_socket_connect(mod_network_socket_obj_t *s, byte *ip, mp_uint_t p

if (ret != 0) {
// printf("Connect returned -0x%x\n", -ret);
*_errno = ret;
*_errno = errno;
return -1;
}

// printf("Connected.\n");

if (s->sock_base.is_ssl && (ret == 0)) {
mp_obj_ssl_socket_t *ss = (mp_obj_ssl_socket_t *)s;

if ((ret = mbedtls_net_set_block(&ss->context_fd)) != 0) {
// printf("failed! net_set_(non)block() returned -0x%x\n", -ret);
*_errno = ret;
return -1;
}

mbedtls_ssl_set_bio(&ss->ssl, &ss->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);

// printf("Performing the SSL/TLS handshake...\n");

while ((ret = mbedtls_ssl_handshake(&ss->ssl)) != 0)
{
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT)
{
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
*_errno = ret;
return -1;
}
}

// printf("Verifying peer X.509 certificate...\n");

if ((ret = mbedtls_ssl_get_verify_result(&ss->ssl)) != 0) {
/* In real life, we probably want to close connection if ret != 0 */
// printf("Failed to verify peer certificate!\n");
*_errno = ret;
return -1;
} else {
// printf("Certificate verified.\n");
}
ret = lwipsocket_socket_setup_ssl(s, _errno);
}

s->sock_base.connected = true;
return 0;
return ret;
}

int lwipsocket_socket_send(mod_network_socket_obj_t *s, const byte *buf, mp_uint_t len, int *_errno) {
Expand Down Expand Up @@ -393,3 +364,45 @@ int lwipsocket_socket_ioctl (mod_network_socket_obj_t *s, mp_uint_t request, mp_
}
return ret;
}

int lwipsocket_socket_setup_ssl(mod_network_socket_obj_t *s, int *_errno)
{
int ret;
uint32_t count = 0;
mp_obj_ssl_socket_t *ss = (mp_obj_ssl_socket_t *)s;

if ((ret = mbedtls_net_set_block(&ss->context_fd)) != 0) {
// printf("failed! net_set_(non)block() returned -0x%x\n", -ret);
*_errno = ret;
return -1;
}

mbedtls_ssl_set_bio(&ss->ssl, &ss->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);

// printf("Performing the SSL/TLS handshake...\n");

while ((ret = mbedtls_ssl_handshake(&ss->ssl)) != 0)
{
if ((ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT ) || count >= ss->read_timeout)
{
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
*_errno = ret;
return -1;
}
if(ret == MBEDTLS_ERR_SSL_TIMEOUT)
{
count++;
}
}

// printf("Verifying peer X.509 certificate...\n");

if ((ret = mbedtls_ssl_get_verify_result(&ss->ssl)) != 0) {
/* In real life, we probably want to close connection if ret != 0 */
// printf("Failed to verify peer certificate!\n");
*_errno = ret;
return -1;
}
// printf("Certificate verified.\n");
return 0;
}
2 changes: 2 additions & 0 deletions esp32/mods/lwipsocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,6 @@ extern int lwipsocket_socket_settimeout(mod_network_socket_obj_t *s, mp_int_t ti

extern int lwipsocket_socket_ioctl (mod_network_socket_obj_t *s, mp_uint_t request, mp_uint_t arg, int *_errno);

extern int lwipsocket_socket_setup_ssl(mod_network_socket_obj_t *s, int *_errno);

#endif // LWIPSOCKET_H_
16 changes: 16 additions & 0 deletions esp32/mods/machuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@
#define UART_TRIGGER_RX_FULL (0x04)
#define UART_TRIGGER_TX_DONE (0x08)

#define MACH_UART_CHECK_INIT(self) \
if(!(self->init)) {nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "UART not Initialized!"));}

/******************************************************************************
DECLARE PRIVATE FUNCTIONS
******************************************************************************/
Expand All @@ -93,6 +96,7 @@ struct _mach_uart_obj_t {
uint8_t uart_id;
uint8_t rx_timeout;
uint8_t n_pins;
bool init;
};

/******************************************************************************
Expand Down Expand Up @@ -269,6 +273,7 @@ STATIC bool uart_rx_wait (mach_uart_obj_t *self) {

STATIC void mach_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
if (self->config.baud_rate > 0) {
mp_printf(print, "UART(%u, baudrate=%u, bits=", self->uart_id, self->config.baud_rate);
switch (self->config.data_bits) {
Expand Down Expand Up @@ -434,6 +439,9 @@ STATIC mp_obj_t mach_uart_init_helper(mach_uart_obj_t *self, const mp_arg_val_t
// configure the rx timeout threshold
self->uart_reg->conf1.rx_tout_thrhd = self->rx_timeout & UART_RX_TOUT_THRHD_V;

// Init Done
self->init = true;

return mp_const_none;

error:
Expand Down Expand Up @@ -498,25 +506,30 @@ STATIC mp_obj_t mach_uart_deinit(mp_obj_t self_in) {
uart_driver_delete(self->uart_id);
}

self->init = false;

return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mach_uart_deinit_obj, mach_uart_deinit);

STATIC mp_obj_t mach_uart_any(mp_obj_t self_in) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
return mp_obj_new_int(uart_rx_any(self));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mach_uart_any_obj, mach_uart_any);

STATIC mp_obj_t mach_uart_wait_tx_done(mp_obj_t self_in, mp_obj_t timeout_ms) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
TickType_t timeout_ticks = mp_obj_get_int_truncated(timeout_ms) / portTICK_PERIOD_MS;
return uart_wait_tx_done(self->uart_id, timeout_ticks) == ESP_OK ? mp_const_true : mp_const_false;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mach_uart_wait_tx_done_obj, mach_uart_wait_tx_done);

STATIC mp_obj_t mach_uart_sendbreak(mp_obj_t self_in, mp_obj_t bits) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
pin_obj_t * pin = (pin_obj_t *)((mp_obj_t *)self->pins)[0];

uint32_t isrmask = MICROPY_BEGIN_ATOMIC_SECTION();
Expand Down Expand Up @@ -576,6 +589,7 @@ STATIC MP_DEFINE_CONST_DICT(mach_uart_locals_dict, mach_uart_locals_dict_table);

STATIC mp_uint_t mach_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
byte *buf = buf_in;

// make sure we want at least 1 char
Expand Down Expand Up @@ -603,6 +617,7 @@ STATIC mp_uint_t mach_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size,

STATIC mp_uint_t mach_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
const char *buf = buf_in;

// write the data
Expand All @@ -614,6 +629,7 @@ STATIC mp_uint_t mach_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t

STATIC mp_uint_t mach_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) {
mach_uart_obj_t *self = self_in;
MACH_UART_CHECK_INIT(self)
mp_uint_t ret;

if (request == MP_IOCTL_POLL) {
Expand Down
1 change: 1 addition & 0 deletions esp32/mods/modlte.c
Original file line number Diff line number Diff line change
Expand Up @@ -1185,5 +1185,6 @@ const mod_network_nic_type_t mod_network_nic_type_lte = {
.n_setsockopt = lwipsocket_socket_setsockopt,
.n_bind = lwipsocket_socket_bind,
.n_ioctl = lwipsocket_socket_ioctl,
.n_setupssl = lwipsocket_socket_setup_ssl,
.inf_up = ltepp_is_ppp_conn_up,
};
1 change: 1 addition & 0 deletions esp32/mods/modnetwork.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ typedef struct _mod_network_nic_type_t {
int (*n_setsockopt)(struct _mod_network_socket_obj_t *socket, mp_uint_t level, mp_uint_t opt, const void *optval, mp_uint_t optlen, int *_errno);
int (*n_settimeout)(struct _mod_network_socket_obj_t *socket, mp_int_t timeout_ms, int *_errno);
int (*n_ioctl)(struct _mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno);
int (*n_setupssl)(struct _mod_network_socket_obj_t *socket, int *_errno);

// Interface status
bool (*inf_up)(void);
Expand Down
13 changes: 12 additions & 1 deletion esp32/mods/modusocket.c
Original file line number Diff line number Diff line change
Expand Up @@ -538,6 +538,16 @@ STATIC mp_obj_t socket_makefile(mp_uint_t n_args, const mp_obj_t *args) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 6, socket_makefile);

STATIC mp_obj_t socket_do_handshake(mp_obj_t self_in) {
mod_network_socket_obj_t *self = self_in;

int _errno;
if (self->sock_base.nic_type->n_setupssl(self, &_errno) != 0) {
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno)));
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_do_handshake_obj, socket_do_handshake);
STATIC const mp_map_elem_t socket_locals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&socket_close_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj },
Expand All @@ -555,6 +565,7 @@ STATIC const mp_map_elem_t socket_locals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_setblocking), (mp_obj_t)&socket_setblocking_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_makefile), (mp_obj_t)&socket_makefile_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_fileno), (mp_obj_t)&socket_fileno_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_do_handshake), (mp_obj_t)&socket_do_handshake_obj },

// stream methods
{ MP_OBJ_NEW_QSTR(MP_QSTR_read), (mp_obj_t)&mp_stream_read_obj },
Expand Down Expand Up @@ -678,7 +689,7 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
if (result < 0) {
// negate result as it contains the error code which must be positive
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(result)));
}
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
Expand Down
26 changes: 23 additions & 3 deletions esp32/mods/modussl.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
DEFINE CONSTANTS
******************************************************************************/
#define FILE_READ_SIZE 256
#define DEFAULT_SSL_READ_TIMEOUT 10 //sec

/******************************************************************************
DECLARE PRIVATE FUNCTIONS
Expand Down Expand Up @@ -143,6 +144,8 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
}
}

mbedtls_ssl_conf_read_timeout(&ssl_sock->conf, 1000);

ssl_sock->context_fd.fd = ssl_sock->sock_base.u.sd;
ssl_sock->sock_base.is_ssl = true;

Expand All @@ -157,12 +160,17 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
mbedtls_ssl_set_bio(&ssl_sock->ssl, &ssl_sock->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);

// printf("Performing the SSL/TLS handshake...\n");
int count = 0;
while ((ret = mbedtls_ssl_handshake(&ssl_sock->ssl)) != 0)
{
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT) {
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
if ((ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT) || count >= ssl_sock->read_timeout) {
//printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
return ret;
}
if(ret == MBEDTLS_ERR_SSL_TIMEOUT)
{
count++;
}
}

// printf("Verifying peer X.509 certificate...\n");
Expand All @@ -174,7 +182,6 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
// printf("Certificate verified.\n");
}
}
mbedtls_ssl_conf_read_timeout(&ssl_sock->conf, 10);

return 0;
}
Expand Down Expand Up @@ -224,6 +231,7 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
{ MP_QSTR_ssl_version, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
{ MP_QSTR_ca_certs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_server_hostname, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
};

int32_t _error;
Expand Down Expand Up @@ -258,6 +266,16 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
ssl_sock->base.type = &ssl_socket_type;
ssl_sock->o_sock = args[0].u_obj; // this is needed so that the GC doesnt collect the socket

//Read timeout
if(args[8].u_obj == mp_const_none)
{
ssl_sock->read_timeout = DEFAULT_SSL_READ_TIMEOUT;
}
else
{
ssl_sock->read_timeout = mp_obj_get_int(args[8].u_obj);
}

_error = mod_ssl_setup_socket(ssl_sock, host_name, cafile_path, certfile_path, keyfile_path,
verify_type, server_side ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);

Expand All @@ -284,6 +302,8 @@ STATIC const mp_map_elem_t mp_module_ussl_globals_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_CERT_OPTIONAL), MP_OBJ_NEW_SMALL_INT(MBEDTLS_SSL_VERIFY_OPTIONAL) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_CERT_REQUIRED), MP_OBJ_NEW_SMALL_INT(MBEDTLS_SSL_VERIFY_REQUIRED) },

{ MP_OBJ_NEW_QSTR(MP_QSTR_SSL_TIMEOUT), MP_OBJ_NEW_SMALL_INT(MBEDTLS_ERR_SSL_TIMEOUT) },

// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_SSLv3), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_SSLV3) },
// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_TLSv1), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_TLSV1) },
// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_TLSv1_1), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_TLSV1_1) },
Expand Down
1 change: 1 addition & 0 deletions esp32/mods/modussl.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ typedef struct _mp_obj_ssl_socket_t {
mbedtls_net_context context_fd;
mbedtls_x509_crt own_cert;
mbedtls_pk_context pk_key;
uint8_t read_timeout;
} mp_obj_ssl_socket_t;

#endif /* MODUSSL_H_ */
1 change: 1 addition & 0 deletions esp32/mods/modwlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -1198,6 +1198,7 @@ const mod_network_nic_type_t mod_network_nic_type_wlan = {
.n_setsockopt = lwipsocket_socket_setsockopt,
.n_settimeout = lwipsocket_socket_settimeout,
.n_ioctl = lwipsocket_socket_ioctl,
.n_setupssl = lwipsocket_socket_setup_ssl,
.inf_up = wlan_is_inf_up
};

Expand Down
Loading