61#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS
88#ifndef ALTCP_MBEDTLS_ENTROPY_PTR
89#define ALTCP_MBEDTLS_ENTROPY_PTR NULL
91#ifndef ALTCP_MBEDTLS_ENTROPY_LEN
92#define ALTCP_MBEDTLS_ENTROPY_LEN 0
94#ifndef ALTCP_MBEDTLS_RNG_FN
95#define ALTCP_MBEDTLS_RNG_FN mbedtls_entropy_func
100extern const struct altcp_functions altcp_mbedtls_functions;
103struct altcp_tls_config {
112#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_USE_SESSION_CACHE
116#if defined(MBEDTLS_SSL_SESSION_TICKETS) && ALTCP_MBEDTLS_USE_SESSION_TICKETS
122struct altcp_tls_entropy_rng {
127static struct altcp_tls_entropy_rng *altcp_tls_entropy_rng;
131static err_t altcp_mbedtls_lower_recv_process(
struct altcp_pcb *conn, altcp_mbedtls_state_t *
state);
132static err_t altcp_mbedtls_handle_rx_appldata(
struct altcp_pcb *conn, altcp_mbedtls_state_t *
state);
133static int altcp_mbedtls_bio_send(
void *
ctx,
const unsigned char *
dataptr,
size_t size);
147 if (listen_conn && listen_conn->state && listen_conn->accept) {
149 altcp_mbedtls_state_t *listen_state = (altcp_mbedtls_state_t *)listen_conn->state;
151 struct altcp_pcb *new_conn = altcp_alloc();
152 if (new_conn ==
NULL) {
155 setup_err = altcp_mbedtls_setup(listen_state->conf, new_conn, accepted_conn);
156 if (setup_err !=
ERR_OK) {
157 altcp_free(new_conn);
160 return listen_conn->accept(listen_conn->arg, new_conn,
err);
173 if (conn && conn->state) {
174 altcp_mbedtls_state_t *
state;
175 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
178 if (conn->connected) {
179 return conn->connected(conn->arg, conn,
err);
182 state = (altcp_mbedtls_state_t *)conn->state;
184 state->overhead_bytes_adjust = 0;
185 return altcp_mbedtls_lower_recv_process(conn,
state);
192altcp_mbedtls_lower_recved(
struct altcp_pcb *inner_conn,
int recvd_cnt)
194 while (recvd_cnt > 0) {
197 recvd_cnt -= recvd_part;
208 altcp_mbedtls_state_t *
state;
222 state = (altcp_mbedtls_state_t *)conn->state;
223 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
237 if ((
state->flags & (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) ==
238 (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) {
241 state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED;
243 altcp_mbedtls_handle_rx_appldata(conn,
state);
246 state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED;
248 return conn->recv(conn->arg, conn,
NULL,
ERR_OK);
265 LWIP_ASSERT(
"rx pbuf overflow", (
int)
p->tot_len + (
int)
p->len <= 0xFFFF);
268 return altcp_mbedtls_lower_recv_process(conn,
state);
272altcp_mbedtls_lower_recv_process(
struct altcp_pcb *conn, altcp_mbedtls_state_t *
state)
274 if (!(
state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
279 if (
state->bio_bytes_read) {
281 altcp_mbedtls_lower_recved(conn->inner_conn,
state->bio_bytes_read);
282 state->bio_bytes_read = 0;
291 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_handshake failed: %d\n",
ret));
305 state->flags |= ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE;
307 if (conn->connected) {
309 err = conn->connected(conn->arg, conn,
ERR_OK);
319 return altcp_mbedtls_handle_rx_appldata(conn,
state);
324altcp_mbedtls_pass_rx_data(
struct altcp_pcb *conn, altcp_mbedtls_state_t *
state)
337 state->flags |= ALTCP_MBEDTLS_FLAGS_UPPER_CALLED;
347 LWIP_ASSERT(
"state->rx_passed_unrecved >= 0",
state->rx_passed_unrecved >= 0);
348 if (
state->rx_passed_unrecved < 0) {
349 state->rx_passed_unrecved = 0;
356 }
else if ((
state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) ==
357 ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) {
358 state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED;
360 return conn->recv(conn->arg, conn,
NULL,
ERR_OK);
365 if (conn->state !=
state) {
374altcp_mbedtls_handle_rx_appldata(
struct altcp_pcb *conn, altcp_mbedtls_state_t *
state)
378 if (!(
state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
396 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"new connection on same source port\n"));
397 LWIP_ASSERT(
"TODO: new connection on same source port, close this connection", 0);
400 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"connection was closed gracefully\n"));
402 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"connection was reset by peer\n"));
427 overhead_bytes =
state->bio_bytes_read -
state->bio_bytes_appl;
428 altcp_mbedtls_lower_recved(conn->inner_conn, overhead_bytes);
429 state->bio_bytes_read = 0;
430 state->bio_bytes_appl = 0;
442 err = altcp_mbedtls_pass_rx_data(conn,
state);
460altcp_mbedtls_bio_recv(
void *
ctx,
unsigned char *
buf,
size_t len)
463 altcp_mbedtls_state_t *
state;
470 if ((conn ==
NULL) || (conn->state ==
NULL)) {
473 state = (altcp_mbedtls_state_t *)conn->state;
479 if ((
p ==
NULL) || ((
p->len == 0) && (
p->next ==
NULL))) {
484 if ((
state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) ==
485 ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) {
523 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
525 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
527 overhead =
state->overhead_bytes_adjust +
state->ssl_context.out_left;
528 if ((
unsigned)overhead >
len) {
532 state->overhead_bytes_adjust -=
len;
539 state->overhead_bytes_adjust += app_len;
541 return conn->sent(conn->arg, conn, app_len);
552altcp_mbedtls_lower_poll(
void *
arg,
struct altcp_pcb *inner_conn)
557 LWIP_ASSERT(
"pcb mismatch", conn->inner_conn == inner_conn);
560 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
563 if (altcp_mbedtls_handle_rx_appldata(conn,
state) ==
ERR_ABRT) {
568 return conn->poll(conn->arg, conn);
579 conn->inner_conn =
NULL;
581 conn->err(conn->arg,
err);
590altcp_mbedtls_remove_callbacks(
struct altcp_pcb *inner_conn)
603 altcp_recv(inner_conn, altcp_mbedtls_lower_recv);
604 altcp_sent(inner_conn, altcp_mbedtls_lower_sent);
605 altcp_err(inner_conn, altcp_mbedtls_lower_err);
614 struct altcp_tls_config *
config = (
struct altcp_tls_config *)conf;
615 altcp_mbedtls_state_t *
state;
619 LWIP_ASSERT(
"invalid inner_conn", conn != inner_conn);
622 state = altcp_mbedtls_alloc(conf);
630 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_setup failed\n"));
632 altcp_mbedtls_free(conf,
state);
638 altcp_mbedtls_setup_callbacks(conn, inner_conn);
639 conn->inner_conn = inner_conn;
640 conn->fns = &altcp_mbedtls_functions;
646altcp_tls_wrap(
struct altcp_tls_config *
config,
struct altcp_pcb *inner_pcb)
649 if (inner_pcb ==
NULL) {
663altcp_tls_init_session(
struct altcp_tls_session *
session)
670altcp_tls_get_session(
struct altcp_pcb *conn,
struct altcp_tls_session *
session)
672 if (
session && conn && conn->state) {
673 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
681altcp_tls_set_session(
struct altcp_pcb *conn,
struct altcp_tls_session *
session)
683 if (
session && conn && conn->state) {
684 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
694altcp_tls_free_session(
struct altcp_tls_session *
session)
703 if (conn && conn->state) {
704 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
705 return &
state->ssl_context;
710#if ALTCP_MBEDTLS_LIB_DEBUG != LWIP_DBG_OFF
719 if (
level >= ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN) {
726altcp_mbedtls_ref_entropy(
void)
730 if (!altcp_tls_entropy_rng) {
731 altcp_tls_entropy_rng = (
struct altcp_tls_entropy_rng *)altcp_mbedtls_alloc_config(
sizeof(
struct altcp_tls_entropy_rng));
732 if (altcp_tls_entropy_rng) {
734 altcp_tls_entropy_rng->ref = 1;
739 ALTCP_MBEDTLS_RNG_FN, &altcp_tls_entropy_rng->entropy,
740 ALTCP_MBEDTLS_ENTROPY_PTR, ALTCP_MBEDTLS_ENTROPY_LEN);
742 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ctr_drbg_seed failed: %d\n",
ret));
745 altcp_mbedtls_free_config(altcp_tls_entropy_rng);
746 altcp_tls_entropy_rng =
NULL;
753 altcp_tls_entropy_rng->ref++;
759altcp_mbedtls_unref_entropy(
void)
763 if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref) {
764 altcp_tls_entropy_rng->ref--;
771static struct altcp_tls_config *
772altcp_tls_create_config(
int is_server,
u8_t cert_count,
u8_t pkey_count,
int have_ca)
776 struct altcp_tls_config *conf;
781 (
"altcp_tls: TCP_WND is smaller than the RX decrypion buffer, connection RX might stall!\n"));
784 altcp_mbedtls_mem_init();
786 sz =
sizeof(
struct altcp_tls_config);
787 if (cert_count > 0) {
793 if (pkey_count > 0) {
797 conf = (
struct altcp_tls_config *)altcp_mbedtls_alloc_config(sz);
801 conf->cert_max = cert_count;
803 if (cert_count > 0) {
811 conf->pkey_max = pkey_count;
812 if (pkey_count > 0) {
818 if (altcp_mbedtls_ref_entropy() !=
ERR_OK) {
819 altcp_mbedtls_free_config(conf);
827 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_config_defaults failed: %d\n",
ret));
828 altcp_mbedtls_unref_entropy();
829 altcp_mbedtls_free_config(conf);
835#if ALTCP_MBEDTLS_LIB_DEBUG != LWIP_DBG_OFF
838#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_USE_SESSION_CACHE
840 mbedtls_ssl_cache_set_timeout(&conf->cache, ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS);
844#if defined(MBEDTLS_SSL_SESSION_TICKETS) && ALTCP_MBEDTLS_USE_SESSION_TICKETS
848 ALTCP_MBEDTLS_SESSION_TICKET_CIPHER, ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS);
850 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_ticket_setup failed: %d\n",
ret));
851 altcp_mbedtls_unref_entropy();
852 altcp_mbedtls_free_config(conf);
863struct altcp_tls_config *altcp_tls_create_config_server(
u8_t cert_count)
865 struct altcp_tls_config *conf = altcp_tls_create_config(1, cert_count, cert_count, 0);
874err_t altcp_tls_config_server_add_privkey_cert(
struct altcp_tls_config *
config,
875 const u8_t *privkey,
size_t privkey_len,
876 const u8_t *privkey_pass,
size_t privkey_pass_len,
899 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_x509_crt_parse failed: %d\n",
ret));
903 ret =
mbedtls_pk_parse_key(pkey, (
const unsigned char *) privkey, privkey_len, privkey_pass, privkey_pass_len);
905 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_pk_parse_public_key failed: %d\n",
ret));
912 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_conf_own_cert failed: %d\n",
ret));
927struct altcp_tls_config *
928altcp_tls_create_config_server_privkey_cert(
const u8_t *privkey,
size_t privkey_len,
929 const u8_t *privkey_pass,
size_t privkey_pass_len,
932 struct altcp_tls_config *conf = altcp_tls_create_config_server(1);
937 if (altcp_tls_config_server_add_privkey_cert(conf, privkey, privkey_len,
938 privkey_pass, privkey_pass_len,
cert, cert_len) !=
ERR_OK) {
939 altcp_tls_free_config(conf);
946static struct altcp_tls_config *
947altcp_tls_create_config_client_common(
const u8_t *
ca,
size_t ca_len,
int is_2wayauth)
950 struct altcp_tls_config *conf = altcp_tls_create_config(0, (is_2wayauth) ? 1 : 0, (is_2wayauth) ? 1 : 0,
ca !=
NULL);
962 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_x509_crt_parse ca failed: %d 0x%x\n",
ret, -1*
ret));
963 altcp_tls_free_config(conf);
972struct altcp_tls_config *
973altcp_tls_create_config_client(
const u8_t *
ca,
size_t ca_len)
975 return altcp_tls_create_config_client_common(
ca, ca_len, 0);
978struct altcp_tls_config *
979altcp_tls_create_config_client_2wayauth(
const u8_t *
ca,
size_t ca_len,
const u8_t *privkey,
size_t privkey_len,
980 const u8_t *privkey_pass,
size_t privkey_pass_len,
984 struct altcp_tls_config *conf;
986 if (!
cert || !privkey) {
987 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"altcp_tls_create_config_client_2wayauth: certificate and priv key required\n"));
991 conf = altcp_tls_create_config_client_common(
ca, ca_len, 1);
1000 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_x509_crt_parse cert failed: %d 0x%x\n",
ret, -1*
ret));
1001 altcp_tls_free_config(conf);
1008 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_pk_parse_key failed: %d 0x%x\n",
ret, -1*
ret));
1009 altcp_tls_free_config(conf);
1015 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_conf_own_cert failed: %d 0x%x\n",
ret, -1*
ret));
1016 altcp_tls_free_config(conf);
1024altcp_tls_configure_alpn_protocols(
struct altcp_tls_config *conf,
const char **protos)
1026#if defined(MBEDTLS_SSL_ALPN)
1029 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"mbedtls_ssl_conf_alpn_protocols failed: %d\n",
ret));
1039altcp_tls_free_config(
struct altcp_tls_config *conf)
1051 altcp_mbedtls_free_config(conf);
1052 altcp_mbedtls_unref_entropy();
1056altcp_tls_free_entropy(
void)
1060 if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref == 0) {
1063 altcp_mbedtls_free_config(altcp_tls_entropy_rng);
1064 altcp_tls_entropy_rng =
NULL;
1081 altcp_mbedtls_state_t *
state;
1085 state = (altcp_mbedtls_state_t *)conn->state;
1089 if (!(
state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
1093 if (lower_recved >
state->rx_passed_unrecved) {
1094 LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, (
"bogus recved count (len > state->rx_passed_unrecved / %d / %d)\n",
1096 lower_recved = (
u16_t)
state->rx_passed_unrecved;
1098 state->rx_passed_unrecved -= lower_recved;
1110 return altcp_connect(conn->inner_conn, ipaddr,
port, altcp_mbedtls_lower_connected);
1122 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
1127 conn->inner_conn = lpcb;
1135altcp_mbedtls_abort(
struct altcp_pcb *conn)
1143altcp_mbedtls_close(
struct altcp_pcb *conn)
1149 inner_conn = conn->inner_conn;
1153 altcp_mbedtls_remove_callbacks(conn->inner_conn);
1157 altcp_mbedtls_setup_callbacks(conn, inner_conn);
1159 altcp_poll(inner_conn, oldpoll, inner_conn->pollinterval);
1162 conn->inner_conn =
NULL;
1172altcp_mbedtls_sndbuf(
struct altcp_pcb *conn)
1175 altcp_mbedtls_state_t *
state;
1176 state = (altcp_mbedtls_state_t*)conn->state;
1177 if (!
state || !(
state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
1180 if (conn->inner_conn) {
1184 if (ssl_expan > 0) {
1187 if (ssl_added < sndbuf) {
1188 size_t max_len = 0xFFFF;
1190#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1193 max_len =
LWIP_MIN(max_frag_len, max_len);
1204 return altcp_default_sndbuf(conn);
1214 altcp_mbedtls_state_t *
state;
1222 state = (altcp_mbedtls_state_t *)conn->state;
1227 if (!(
state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) {
1235 if (
state->ssl_context.out_left) {
1237 if (
state->ssl_context.out_left) {
1247 state->overhead_bytes_adjust -=
ret;
1269altcp_mbedtls_bio_send(
void *
ctx,
const unsigned char *
dataptr,
size_t size)
1272 altcp_mbedtls_state_t *
state;
1274 size_t size_left =
size;
1275 u8_t apiflags = TCP_WRITE_FLAG_COPY;
1278 if ((conn ==
NULL) || (conn->inner_conn ==
NULL)) {
1281 state = (altcp_mbedtls_state_t *)conn->state;
1288 written += write_len;
1289 size_left -= write_len;
1290 state->overhead_bytes_adjust += write_len;
1297 LWIP_ASSERT(
"tls_write, tcp_write: err != ERR MEM", 0);
1306altcp_mbedtls_mss(
struct altcp_pcb *conn)
1316altcp_mbedtls_dealloc(
struct altcp_pcb *conn)
1320 altcp_mbedtls_state_t *
state = (altcp_mbedtls_state_t *)conn->state;
1335const struct altcp_functions altcp_mbedtls_functions = {
1336 altcp_mbedtls_set_poll,
1337 altcp_mbedtls_recved,
1339 altcp_mbedtls_connect,
1340 altcp_mbedtls_listen,
1341 altcp_mbedtls_abort,
1342 altcp_mbedtls_close,
1343 altcp_default_shutdown,
1344 altcp_mbedtls_write,
1345 altcp_default_output,
1347 altcp_mbedtls_sndbuf,
1348 altcp_default_sndqueuelen,
1349 altcp_default_nagle_disable,
1350 altcp_default_nagle_enable,
1351 altcp_default_nagle_disabled,
1352 altcp_default_setprio,
1353 altcp_mbedtls_dealloc,
1354 altcp_default_get_tcp_addrinfo,
1355 altcp_default_get_ip,
1356 altcp_default_get_port
1357#if LWIP_TCP_KEEPALIVE
1358 , altcp_default_keepalive_disable
1359 , altcp_default_keepalive_enable
1362 , altcp_default_dbg_get_tcp_state
#define altcp_listen_with_backlog_and_err
#define altcp_connected_fn
Sample certificates and DHM parameters for testing.
This file contains definitions and functions for the CTR_DRBG pseudorandom generator.
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
Entropy accumulator implementation.
GLenum GLuint GLenum GLsizei const GLchar * buf
#define LWIP_UNUSED_ARG(x)
#define LWIP_DBG_LEVEL_SERIOUS
#define LWIP_ASSERT_CORE_LOCKED()
#define PBUF_POOL_BUFSIZE
void pbuf_realloc(struct pbuf *p, u16_t new_len)
void pbuf_cat(struct pbuf *h, struct pbuf *t)
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
u8_t pbuf_free(struct pbuf *p)
u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
void mbedtls_x509_crt_init(mbedtls_x509_crt *crt)
Initialize a certificate (chain)
int mbedtls_x509_crt_parse(mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen)
Parse one DER-encoded or one or more concatenated PEM-encoded certificates and add them to the chaine...
void mbedtls_x509_crt_free(mbedtls_x509_crt *crt)
Unallocate all certificate data.
int const JOCTET * dataptr
Buffer-based memory allocator.
Network sockets abstraction layer to integrate Mbed TLS into a BSD-style sockets API.
#define MBEDTLS_ERR_NET_CONN_RESET
#define MBEDTLS_ERR_NET_INVALID_CONTEXT
#define MBEDTLS_ERR_NET_SEND_FAILED
u8_t pbuf_remove_header(struct pbuf *p, size_t header_size_decrement)
int mbedtls_pk_parse_key(mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen)
Parse a private key in PEM or DER format.
void mbedtls_pk_init(mbedtls_pk_context *ctx)
Initialize a mbedtls_pk_context (as NONE).
void mbedtls_pk_free(mbedtls_pk_context *ctx)
Free the components of a mbedtls_pk_context.
#define mbedtls_ssl_get_max_frag_len
#define mbedtls_ctr_drbg_seed
#define mbedtls_ctr_drbg_random
#define mbedtls_entropy_free
#define mbedtls_ctr_drbg_init
#define mbedtls_entropy_init
#define mbedtls_ssl_conf_authmode
#define mbedtls_ssl_write
#define mbedtls_ssl_config_defaults
#define mbedtls_ssl_setup
#define mbedtls_ssl_set_bio
#define mbedtls_ssl_conf_rng
#define mbedtls_ssl_config_free
#define mbedtls_ssl_handshake
#define mbedtls_ctr_drbg_free
#define mbedtls_ssl_conf_dbg
#define mbedtls_ssl_config_init
Functions for controlling and providing debug output from the library.
Error to string translation.
#define MBEDTLS_SSL_IS_CLIENT
#define MBEDTLS_SSL_MAX_CONTENT_LEN
This macro is invoked by the library when an invalid parameter is detected that is only checked with ...
int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key)
Set own certificate chain and private key.
#define MBEDTLS_ERR_SSL_WANT_WRITE
#define MBEDTLS_ERR_SSL_WANT_READ
#define MBEDTLS_SSL_IS_SERVER
void mbedtls_ssl_session_init(mbedtls_ssl_session *session)
Initialize SSL session structure.
void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl)
Set the data required to verify peer certificate.
int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session)
Request resumption of session (client-side only) Session data is copied from presented session struct...
int mbedtls_ssl_get_record_expansion(const mbedtls_ssl_context *ssl)
Return the (maximum) number of bytes added by the record layer: header + encryption/MAC overhead (inc...
void mbedtls_ssl_session_free(mbedtls_ssl_session *session)
Free referenced items in an SSL session including the peer certificate and clear memory.
#define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY
#define MBEDTLS_SSL_TRANSPORT_STREAM
size_t mbedtls_ssl_get_bytes_avail(const mbedtls_ssl_context *ssl)
Return the number of application data bytes remaining to be read from the current record.
int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session)
Save session in order to resume it later (client-side only) Session data is copied to presented sessi...
int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf, const char **protos)
Set the supported Application Layer Protocols.
#define MBEDTLS_ERR_SSL_CLIENT_RECONNECT
#define MBEDTLS_SSL_PRESET_DEFAULT
SSL session cache implementation.
int mbedtls_ssl_cache_set(void *data, const mbedtls_ssl_session *session)
Cache set callback implementation (Thread-safe if MBEDTLS_THREADING_C is enabled)
void mbedtls_ssl_cache_set_max_entries(mbedtls_ssl_cache_context *cache, int max)
Set the maximum number of cache entries (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50))
int mbedtls_ssl_cache_get(void *data, mbedtls_ssl_session *session)
Cache get callback implementation (Thread-safe if MBEDTLS_THREADING_C is enabled)
Internal functions shared by the SSL modules.
int mbedtls_ssl_flush_output(mbedtls_ssl_context *ssl)
TLS server ticket callbacks implementation.
void mbedtls_ssl_ticket_init(mbedtls_ssl_ticket_context *ctx)
Initialize a ticket context. (Just make it ready for mbedtls_ssl_ticket_setup() or mbedtls_ssl_ticket...
int mbedtls_ssl_ticket_setup(mbedtls_ssl_ticket_context *ctx, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_cipher_type_t cipher, uint32_t lifetime)
Prepare context to be actually used.
mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write
Implementation of the ticket write callback.
mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse
Implementation of the ticket parse callback.
The CTR_DRBG context structure.
Entropy context structure.
Context for session ticket handling functions.
X.509 generic defines and structures.