1 /*
2  * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef _DYNAMIC_IMPL_H_
7 #define _DYNAMIC_IMPL_H_
8 
9 #include <stddef.h>
10 #include <string.h>
11 #include <stdbool.h>
12 
13 /* TODO: Remove this once the appropriate solution is found
14  *
15  * ssl_misc.h header uses private elements from
16  * mbedtls, which become undefined if the following flag
17  * is not defined
18  */
19 #define MBEDTLS_ALLOW_PRIVATE_ACCESS
20 
21 // located at mbedtls/library/ssl_misc.h
22 #include "ssl_misc.h"
23 
24 #include "mbedtls/ssl.h"
25 #include "mbedtls/platform.h"
26 #include "esp_log.h"
27 #include "sdkconfig.h"
28 
29 #define TRACE_CHECK(_fn, _state) \
30 ({ \
31     ESP_LOGV(TAG, "%d " _state " to do \"%s\"", __LINE__, # _fn); \
32 })
33 
34 #define CHECK_OK(_fn) \
35 ({ \
36     int _ret; \
37  \
38     TRACE_CHECK(_fn, "state"); \
39  \
40     if ((_ret = _fn) != 0) { \
41         ESP_LOGV(TAG, "\"%s\" result is %d", # _fn, -_ret); \
42         TRACE_CHECK(_fn, "fail"); \
43         return _ret; \
44     } \
45  \
46     TRACE_CHECK(_fn, "end"); \
47  \
48 })
49 
50 typedef enum {
51     ESP_MBEDTLS_SSL_BUF_CACHED,
52     ESP_MBEDTLS_SSL_BUF_NO_CACHED,
53 } esp_mbedtls_ssl_buf_states;
54 
55 struct esp_mbedtls_ssl_buf {
56     esp_mbedtls_ssl_buf_states state;
57     unsigned int len;
58     unsigned char buf[];
59 };
60 
61 #define SSL_BUF_HEAD_OFFSET_SIZE ((int)offsetof(struct esp_mbedtls_ssl_buf, buf))
62 
63 void esp_mbedtls_free_buf(unsigned char *buf);
64 
65 int esp_mbedtls_setup_tx_buffer(mbedtls_ssl_context *ssl);
66 
67 void esp_mbedtls_setup_rx_buffer(mbedtls_ssl_context *ssl);
68 
69 int esp_mbedtls_reset_add_tx_buffer(mbedtls_ssl_context *ssl);
70 
71 int esp_mbedtls_reset_add_rx_buffer(mbedtls_ssl_context *ssl);
72 
73 int esp_mbedtls_reset_free_tx_buffer(mbedtls_ssl_context *ssl);
74 
75 void esp_mbedtls_reset_free_rx_buffer(mbedtls_ssl_context *ssl);
76 
77 int esp_mbedtls_add_tx_buffer(mbedtls_ssl_context *ssl, size_t buffer_len);
78 
79 int esp_mbedtls_add_rx_buffer(mbedtls_ssl_context *ssl);
80 
81 int esp_mbedtls_free_tx_buffer(mbedtls_ssl_context *ssl);
82 
83 int esp_mbedtls_free_rx_buffer(mbedtls_ssl_context *ssl);
84 
85 size_t esp_mbedtls_get_crt_size(mbedtls_x509_crt *cert, size_t *num);
86 
87 #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA
88 void esp_mbedtls_free_dhm(mbedtls_ssl_context *ssl);
89 
90 void esp_mbedtls_free_keycert(mbedtls_ssl_context *ssl);
91 
92 void esp_mbedtls_free_keycert_cert(mbedtls_ssl_context *ssl);
93 
94 void esp_mbedtls_free_keycert_key(mbedtls_ssl_context *ssl);
95 #endif
96 
97 #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT
98 void esp_mbedtls_free_cacert(mbedtls_ssl_context *ssl);
99 #endif
100 
101 #endif /* _DYNAMIC_IMPL_H_ */
102