esp_ssl_cli.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. // Copyright 2020 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. #include <sys/param.h>
  13. #include <stdbool.h>
  14. #include "esp_mbedtls_dynamic_impl.h"
  15. int __real_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl);
  16. int __wrap_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl);
  17. static const char *TAG = "SSL client";
  18. static int manage_resource(mbedtls_ssl_context *ssl, bool add)
  19. {
  20. int state = add ? ssl->state : ssl->state - 1;
  21. if (ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL) {
  22. return 0;
  23. }
  24. if (!add) {
  25. if (!ssl->out_left) {
  26. CHECK_OK(esp_mbedtls_free_tx_buffer(ssl));
  27. }
  28. }
  29. switch (state) {
  30. case MBEDTLS_SSL_HELLO_REQUEST:
  31. break;
  32. case MBEDTLS_SSL_CLIENT_HELLO:
  33. if (add) {
  34. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  35. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  36. }
  37. break;
  38. case MBEDTLS_SSL_SERVER_HELLO:
  39. if (add) {
  40. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  41. } else {
  42. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  43. }
  44. break;
  45. case MBEDTLS_SSL_SERVER_CERTIFICATE:
  46. if (add) {
  47. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  48. } else {
  49. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  50. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT
  51. esp_mbedtls_free_cacert(ssl);
  52. #endif
  53. }
  54. break;
  55. case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
  56. if (add) {
  57. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  58. } else {
  59. if (!ssl->keep_current_message) {
  60. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  61. }
  62. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_PEER_CERT
  63. /**
  64. * If current ciphersuite is RSA, we should free peer'
  65. * certificate at step MBEDTLS_SSL_CLIENT_KEY_EXCHANGE.
  66. *
  67. * And if it is other kinds of ciphersuite, we can free
  68. * peer certificate here.
  69. */
  70. if (esp_mbedtls_ssl_is_rsa(ssl) == false) {
  71. esp_mbedtls_free_peer_cert(ssl);
  72. }
  73. #endif
  74. }
  75. break;
  76. case MBEDTLS_SSL_CERTIFICATE_REQUEST:
  77. if (add) {
  78. if (!ssl->keep_current_message) {
  79. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  80. }
  81. } else {
  82. if (!ssl->keep_current_message) {
  83. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  84. }
  85. }
  86. break;
  87. case MBEDTLS_SSL_SERVER_HELLO_DONE:
  88. if (add) {
  89. if (!ssl->keep_current_message) {
  90. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  91. }
  92. } else {
  93. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  94. }
  95. break;
  96. case MBEDTLS_SSL_CLIENT_CERTIFICATE:
  97. if (add) {
  98. size_t buffer_len = 3;
  99. mbedtls_ssl_key_cert *key_cert = ssl->conf->key_cert;
  100. while (key_cert && key_cert->cert) {
  101. size_t num;
  102. buffer_len += esp_mbedtls_get_crt_size(key_cert->cert, &num);
  103. buffer_len += num * 3;
  104. key_cert = key_cert->next;
  105. }
  106. buffer_len = MAX(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_CLIENT_KEY_EXCHANGE:
  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_PEER_CERT
  116. if (esp_mbedtls_ssl_is_rsa(ssl) == true) {
  117. esp_mbedtls_free_peer_cert(ssl);
  118. }
  119. #endif
  120. }
  121. break;
  122. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  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. } else {
  127. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA
  128. esp_mbedtls_free_dhm(ssl);
  129. esp_mbedtls_free_keycert_key(ssl);
  130. esp_mbedtls_free_keycert(ssl);
  131. #endif
  132. }
  133. break;
  134. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  135. if (add) {
  136. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  137. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  138. }
  139. break;
  140. case MBEDTLS_SSL_CLIENT_FINISHED:
  141. if (add) {
  142. size_t buffer_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
  143. CHECK_OK(esp_mbedtls_add_tx_buffer(ssl, buffer_len));
  144. }
  145. break;
  146. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  147. case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
  148. if (add) {
  149. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  150. } else {
  151. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  152. }
  153. break;
  154. #endif
  155. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  156. if (add) {
  157. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  158. } else {
  159. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  160. }
  161. break;
  162. case MBEDTLS_SSL_SERVER_FINISHED:
  163. if (add) {
  164. CHECK_OK(esp_mbedtls_add_rx_buffer(ssl));
  165. } else {
  166. CHECK_OK(esp_mbedtls_free_rx_buffer(ssl));
  167. }
  168. break;
  169. case MBEDTLS_SSL_FLUSH_BUFFERS:
  170. break;
  171. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  172. break;
  173. default:
  174. break;
  175. }
  176. return 0;
  177. }
  178. int __wrap_mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl)
  179. {
  180. CHECK_OK(manage_resource(ssl, true));
  181. CHECK_OK(__real_mbedtls_ssl_handshake_client_step(ssl));
  182. CHECK_OK(manage_resource(ssl, false));
  183. return 0;
  184. }