esp_ssl_cli.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <sys/param.h>
  7. #include <stdbool.h>
  8. #include "esp_mbedtls_dynamic_impl.h"
  9. int __real_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl);
  10. int __real_mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl);
  11. int __wrap_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl);
  12. int __wrap_mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl);
  13. static const char *TAG = "SSL client";
  14. static int manage_resource(mbedtls_ssl_context *ssl, bool add)
  15. {
  16. int state = add ? ssl->MBEDTLS_PRIVATE(state) : ssl->MBEDTLS_PRIVATE(state) - 1;
  17. if (mbedtls_ssl_is_handshake_over(ssl) || ssl->MBEDTLS_PRIVATE(handshake) == NULL) {
  18. return 0;
  19. }
  20. if (!add) {
  21. if (!ssl->MBEDTLS_PRIVATE(out_left)) {
  22. CHECK_OK(esp_mbedtls_free_tx_buffer(ssl));
  23. }
  24. }
  25. /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
  26. * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
  27. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  28. if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
  29. ssl->handshake->new_session_ticket != 0 )
  30. {
  31. ssl->state = MBEDTLS_SSL_NEW_SESSION_TICKET;
  32. }
  33. #endif
  34. switch (state) {
  35. case MBEDTLS_SSL_HELLO_REQUEST:
  36. break;
  37. case MBEDTLS_SSL_CLIENT_HELLO:
  38. if (add) {
  39. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  40. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  41. }
  42. break;
  43. case MBEDTLS_SSL_SERVER_HELLO:
  44. if (add) {
  45. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  46. } else {
  47. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  48. }
  49. break;
  50. case MBEDTLS_SSL_SERVER_CERTIFICATE:
  51. if (add) {
  52. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  53. } else {
  54. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  55. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT
  56. esp_mbedtls_free_cacert(ssl);
  57. #endif
  58. }
  59. break;
  60. case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
  61. if (add) {
  62. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  63. } else {
  64. if (!ssl->MBEDTLS_PRIVATE(keep_current_message)) {
  65. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  66. }
  67. }
  68. break;
  69. case MBEDTLS_SSL_CERTIFICATE_REQUEST:
  70. if (add) {
  71. if (!ssl->MBEDTLS_PRIVATE(keep_current_message)) {
  72. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  73. }
  74. } else {
  75. if (!ssl->MBEDTLS_PRIVATE(keep_current_message)) {
  76. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  77. }
  78. }
  79. break;
  80. case MBEDTLS_SSL_SERVER_HELLO_DONE:
  81. if (add) {
  82. if (!ssl->MBEDTLS_PRIVATE(keep_current_message)) {
  83. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  84. }
  85. } else {
  86. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  87. }
  88. break;
  89. case MBEDTLS_SSL_CLIENT_CERTIFICATE:
  90. if (add) {
  91. size_t buffer_len = 3;
  92. const mbedtls_ssl_config *conf = mbedtls_ssl_context_get_config(ssl);
  93. mbedtls_ssl_key_cert *key_cert = conf->MBEDTLS_PRIVATE(key_cert);
  94. while (key_cert && key_cert->cert) {
  95. size_t num;
  96. buffer_len += esp_mbedtls_get_crt_size(key_cert->cert, &num);
  97. buffer_len += num * 3;
  98. key_cert = key_cert->next;
  99. }
  100. buffer_len = MAX(buffer_len, MBEDTLS_SSL_OUT_BUFFER_LEN);
  101. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  102. }
  103. break;
  104. case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
  105. if (add) {
  106. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  107. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  108. }
  109. break;
  110. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  111. if (add) {
  112. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  113. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  114. } else {
  115. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA
  116. esp_mbedtls_free_dhm(ssl);
  117. esp_mbedtls_free_keycert_key(ssl);
  118. esp_mbedtls_free_keycert(ssl);
  119. #endif
  120. }
  121. break;
  122. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  123. if (add) {
  124. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  125. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  126. }
  127. break;
  128. case MBEDTLS_SSL_CLIENT_FINISHED:
  129. if (add) {
  130. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  131. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  132. }
  133. break;
  134. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  135. case MBEDTLS_SSL_NEW_SESSION_TICKET:
  136. if (add) {
  137. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  138. } else {
  139. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  140. }
  141. break;
  142. #endif
  143. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  144. if (add) {
  145. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  146. } else {
  147. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  148. }
  149. break;
  150. case MBEDTLS_SSL_SERVER_FINISHED:
  151. if (add) {
  152. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  153. } else {
  154. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  155. }
  156. break;
  157. case MBEDTLS_SSL_FLUSH_BUFFERS:
  158. break;
  159. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  160. break;
  161. default:
  162. break;
  163. }
  164. return 0;
  165. }
  166. int __wrap_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl)
  167. {
  168. CHECK_OK(manage_resource(ssl, true));
  169. CHECK_OK(__real_mbedtls_ssl_handshake_client_step(ssl));
  170. CHECK_OK(manage_resource(ssl, false));
  171. return 0;
  172. }
  173. int __wrap_mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl)
  174. {
  175. CHECK_OK(manage_resource(ssl, true));
  176. CHECK_OK(__real_mbedtls_ssl_write_client_hello(ssl));
  177. CHECK_OK(manage_resource(ssl, false));
  178. return 0;
  179. }