esp_ssl_cli.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 (ssl->MBEDTLS_PRIVATE(state) == MBEDTLS_SSL_HANDSHAKE_OVER || 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_SERVER_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. mbedtls_ssl_key_cert *key_cert = ssl->MBEDTLS_PRIVATE(conf)->MBEDTLS_PRIVATE(key_cert);
  93. while (key_cert && key_cert->cert) {
  94. size_t num;
  95. buffer_len += esp_mbedtls_get_crt_size(key_cert->cert, &num);
  96. buffer_len += num * 3;
  97. key_cert = key_cert->next;
  98. }
  99. buffer_len = MAX(buffer_len, MBEDTLS_SSL_OUT_BUFFER_LEN);
  100. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  101. }
  102. break;
  103. case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
  104. if (add) {
  105. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  106. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  107. }
  108. break;
  109. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  110. if (add) {
  111. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  112. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  113. } else {
  114. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA
  115. esp_mbedtls_free_dhm(ssl);
  116. esp_mbedtls_free_keycert_key(ssl);
  117. esp_mbedtls_free_keycert(ssl);
  118. #endif
  119. }
  120. break;
  121. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  122. if (add) {
  123. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  124. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  125. }
  126. break;
  127. case MBEDTLS_SSL_CLIENT_FINISHED:
  128. if (add) {
  129. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  130. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  131. }
  132. break;
  133. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  134. case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
  135. if (add) {
  136. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  137. } else {
  138. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  139. }
  140. break;
  141. #endif
  142. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  143. if (add) {
  144. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  145. } else {
  146. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  147. }
  148. break;
  149. case MBEDTLS_SSL_SERVER_FINISHED:
  150. if (add) {
  151. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  152. } else {
  153. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  154. }
  155. break;
  156. case MBEDTLS_SSL_FLUSH_BUFFERS:
  157. break;
  158. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  159. break;
  160. default:
  161. break;
  162. }
  163. return 0;
  164. }
  165. int __wrap_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl)
  166. {
  167. CHECK_OK(manage_resource(ssl, true));
  168. CHECK_OK(__real_mbedtls_ssl_handshake_client_step(ssl));
  169. CHECK_OK(manage_resource(ssl, false));
  170. return 0;
  171. }
  172. int __wrap_mbedtls_ssl_write_client_hello(mbedtls_ssl_context *ssl)
  173. {
  174. CHECK_OK(manage_resource(ssl, true));
  175. CHECK_OK(__real_mbedtls_ssl_write_client_hello(ssl));
  176. CHECK_OK(manage_resource(ssl, false));
  177. return 0;
  178. }