This commit is contained in:
twinaphex 2020-07-01 17:10:00 +02:00
parent 473f43daf7
commit 8f65c4e6dd

View File

@ -63,23 +63,20 @@ struct ssl_state
const char *domain; const char *domain;
}; };
static const char *pers = "libretro";
static void ssl_debug(void *ctx, int level, static void ssl_debug(void *ctx, int level,
const char *file, int line, const char *file, int line,
const char *str) const char *str)
{ {
((void) level);
fprintf((FILE*)ctx, "%s:%04d: %s", file, line, str); fprintf((FILE*)ctx, "%s:%04d: %s", file, line, str);
fflush((FILE*)ctx); fflush((FILE*)ctx);
} }
void* ssl_socket_init(int fd, const char *domain) void* ssl_socket_init(int fd, const char *domain)
{ {
static const char *pers = "libretro";
struct ssl_state *state = (struct ssl_state*)calloc(1, sizeof(*state)); struct ssl_state *state = (struct ssl_state*)calloc(1, sizeof(*state));
state->domain = domain; state->domain = domain;
#if defined(MBEDTLS_DEBUG_C) #if defined(MBEDTLS_DEBUG_C)
mbedtls_debug_set_threshold(DEBUG_LEVEL); mbedtls_debug_set_threshold(DEBUG_LEVEL);
@ -112,10 +109,11 @@ error:
return NULL; return NULL;
} }
int ssl_socket_connect(void *state_data, void *data, bool timeout_enable, bool nonblock) int ssl_socket_connect(void *state_data,
void *data, bool timeout_enable, bool nonblock)
{ {
struct ssl_state *state = (struct ssl_state*)state_data;
int ret, flags; int ret, flags;
struct ssl_state *state = (struct ssl_state*)state_data;
if (socket_connect(state->net_ctx.fd, data, timeout_enable)) if (socket_connect(state->net_ctx.fd, data, timeout_enable))
return -1; return -1;
@ -156,12 +154,13 @@ int ssl_socket_connect(void *state_data, void *data, bool timeout_enable, bool n
return state->net_ctx.fd; return state->net_ctx.fd;
} }
ssize_t ssl_socket_receive_all_nonblocking(void *state_data, bool *error, void *data_, size_t size) ssize_t ssl_socket_receive_all_nonblocking(void *state_data,
bool *error, void *data_, size_t size)
{ {
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
/* mbedtls_ssl_read wants non-const data but it only reads it, so this cast is safe */
ssize_t ret; ssize_t ret;
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
/* mbedtls_ssl_read wants non-const data but it only reads it, so this cast is safe */
mbedtls_net_set_nonblock(&state->net_ctx); mbedtls_net_set_nonblock(&state->net_ctx);
@ -184,19 +183,22 @@ ssize_t ssl_socket_receive_all_nonblocking(void *state_data, bool *error, void *
return -1; return -1;
} }
int ssl_socket_receive_all_blocking(void *state_data, void *data_, size_t size) int ssl_socket_receive_all_blocking(void *state_data,
void *data_, size_t size)
{ {
struct ssl_state *state = (struct ssl_state*)state_data; struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_; const uint8_t *data = (const uint8_t*)data_;
mbedtls_net_set_block(&state->net_ctx); mbedtls_net_set_block(&state->net_ctx);
for (;;) for (;;)
{ {
/* mbedtls_ssl_read wants non-const data but it only reads it, so this cast is safe */ /* mbedtls_ssl_read wants non-const data but it only reads it,
* so this cast is safe */
int ret = mbedtls_ssl_read(&state->ctx, (unsigned char*)data, size); int ret = mbedtls_ssl_read(&state->ctx, (unsigned char*)data, size);
if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) if ( ret == MBEDTLS_ERR_SSL_WANT_READ ||
ret == MBEDTLS_ERR_SSL_WANT_WRITE)
continue; continue;
if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)
@ -212,29 +214,32 @@ int ssl_socket_receive_all_blocking(void *state_data, void *data_, size_t size)
return 1; return 1;
} }
int ssl_socket_send_all_blocking(void *state_data, const void *data_, size_t size, bool no_signal) int ssl_socket_send_all_blocking(void *state_data,
const void *data_, size_t size, bool no_signal)
{ {
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
int ret; int ret;
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
mbedtls_net_set_block(&state->net_ctx); mbedtls_net_set_block(&state->net_ctx);
while ((ret = mbedtls_ssl_write(&state->ctx, data, size)) <= 0) while ((ret = mbedtls_ssl_write(&state->ctx, data, size)) <= 0)
{ {
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) if ( ret != MBEDTLS_ERR_SSL_WANT_READ &&
ret != MBEDTLS_ERR_SSL_WANT_WRITE)
return false; return false;
} }
return true; return true;
} }
ssize_t ssl_socket_send_all_nonblocking(void *state_data, const void *data_, size_t size, bool no_signal) ssize_t ssl_socket_send_all_nonblocking(void *state_data,
const void *data_, size_t size, bool no_signal)
{ {
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
ssize_t sent = size;
int ret; int ret;
ssize_t sent = size;
struct ssl_state *state = (struct ssl_state*)state_data;
const uint8_t *data = (const uint8_t*)data_;
mbedtls_net_set_nonblock(&state->net_ctx); mbedtls_net_set_nonblock(&state->net_ctx);