feat(http_client): Add support for TLS session tickets

This commit is contained in:
David Cermak
2023-09-19 18:52:45 +02:00
parent 1d7132ce6b
commit 7e22a13afe
5 changed files with 92 additions and 1 deletions
@@ -211,6 +211,28 @@ void esp_transport_ssl_set_keep_alive(esp_transport_handle_t t, esp_transport_ke
*/
void esp_transport_ssl_set_interface_name(esp_transport_handle_t t, struct ifreq *if_name);
#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
/**
* @brief Session ticket operation
*/
typedef enum {
ESP_TRANSPORT_SESSION_TICKET_INIT, /*!< Allocate and initialize a TLS session */
ESP_TRANSPORT_SESSION_TICKET_SAVE, /*!< Save TLS session so it can be restored for the next handshake */
ESP_TRANSPORT_SESSION_TICKET_USE, /*!< Use already saved session to reconnect faster */
ESP_TRANSPORT_SESSION_TICKET_FREE /*!< Deallocate and deinit the TLS session */
} esp_transport_session_ticket_operation_t;
/**
* @brief Perform desired session ticket operation (init, save, use)
*
* @param[in] t The transport handle
* @param[in] operation Operation to perform with TLS session
*
* @note This operation is only available if CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS=y
*/
esp_err_t esp_transport_ssl_session_ticket_operation(esp_transport_handle_t t, esp_transport_session_ticket_operation_t operation);
#endif // CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
#ifdef __cplusplus
}
#endif
+35
View File
@@ -38,6 +38,9 @@ typedef struct transport_esp_tls {
bool ssl_initialized;
transport_ssl_conn_state_t conn_state;
int sockfd;
#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
esp_tls_client_session_t *session_ticket;
#endif
} transport_esp_tls_t;
/**
@@ -523,6 +526,9 @@ esp_transport_handle_t esp_transport_ssl_init(void)
void esp_transport_esp_tls_destroy(struct transport_esp_tls *transport_esp_tls)
{
#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
esp_tls_free_client_session(transport_esp_tls->session_ticket);
#endif
free(transport_esp_tls);
}
@@ -548,3 +554,32 @@ void esp_transport_tcp_set_interface_name(esp_transport_handle_t t, struct ifreq
{
return esp_transport_ssl_set_interface_name(t, if_name);
}
#ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
esp_err_t esp_transport_ssl_session_ticket_operation(esp_transport_handle_t t, esp_transport_session_ticket_operation_t operation)
{
transport_esp_tls_t *ssl = ssl_get_context_data(t);
if (!ssl) {
return ESP_FAIL;
}
switch (operation) {
case ESP_TRANSPORT_SESSION_TICKET_INIT:
break;
case ESP_TRANSPORT_SESSION_TICKET_SAVE:
esp_tls_free_client_session(ssl->session_ticket);
ssl->session_ticket = esp_tls_get_client_session(ssl->tls);
break;
case ESP_TRANSPORT_SESSION_TICKET_USE:
if (ssl->session_ticket == NULL) {
return ESP_ERR_INVALID_STATE;
}
ssl->cfg.client_session = ssl->session_ticket;
break;
case ESP_TRANSPORT_SESSION_TICKET_FREE:
esp_tls_free_client_session(ssl->session_ticket);
ssl->session_ticket = NULL;
break;
}
return ESP_OK;
}
#endif // CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS