esp_tls_wolfssl.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. // Copyright 2019 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. // limitations under the License.
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <unistd.h>
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <netdb.h>
  20. #include <http_parser.h>
  21. #include "esp_tls_wolfssl.h"
  22. #include "esp_tls_error_capture_internal.h"
  23. #include <errno.h>
  24. #include "esp_log.h"
  25. static unsigned char *global_cacert = NULL;
  26. static unsigned int global_cacert_pem_bytes = 0;
  27. static const char *TAG = "esp-tls-wolfssl";
  28. /* Prototypes for the static functions */
  29. static esp_err_t set_client_config(const char *hostname, size_t hostlen, esp_tls_cfg_t *cfg, esp_tls_t *tls);
  30. #if defined(CONFIG_ESP_TLS_PSK_VERIFICATION)
  31. #include "freertos/semphr.h"
  32. static SemaphoreHandle_t tls_conn_lock;
  33. static inline unsigned int esp_wolfssl_psk_client_cb(WOLFSSL* ssl, const char* hint, char* identity,
  34. unsigned int id_max_len, unsigned char* key,unsigned int key_max_len);
  35. static esp_err_t esp_wolfssl_set_cipher_list(WOLFSSL_CTX *ctx);
  36. #ifdef WOLFSSL_TLS13
  37. #define PSK_MAX_ID_LEN 128
  38. #else
  39. #define PSK_MAX_ID_LEN 64
  40. #endif
  41. #define PSK_MAX_KEY_LEN 64
  42. static char psk_id_str[PSK_MAX_ID_LEN];
  43. static uint8_t psk_key_array[PSK_MAX_KEY_LEN];
  44. static uint8_t psk_key_max_len = 0;
  45. #endif /* CONFIG_ESP_TLS_PSK_VERIFICATION */
  46. #ifdef CONFIG_ESP_TLS_SERVER
  47. static esp_err_t set_server_config(esp_tls_cfg_server_t *cfg, esp_tls_t *tls);
  48. #endif /* CONFIG_ESP_TLS_SERVER */
  49. typedef enum x509_file_type {
  50. FILE_TYPE_CA_CERT = 0, /* CA certificate to authenticate entity at other end */
  51. FILE_TYPE_SELF_CERT, /* Self certificate of the entity */
  52. FILE_TYPE_SELF_KEY, /* Private key in the self cert-key pair */
  53. } x509_file_type_t;
  54. /* Checks whether the certificate provided is in pem format or not */
  55. static esp_err_t esp_load_wolfssl_verify_buffer(esp_tls_t *tls, const unsigned char *cert_buf, unsigned int cert_len, x509_file_type_t type, int *err_ret)
  56. {
  57. int wolf_fileformat = WOLFSSL_FILETYPE_DEFAULT;
  58. if (type == FILE_TYPE_SELF_KEY) {
  59. if (cert_buf[cert_len - 1] == '\0' && strstr( (const char *) cert_buf, "-----BEGIN " )) {
  60. wolf_fileformat = WOLFSSL_FILETYPE_PEM;
  61. } else {
  62. wolf_fileformat = WOLFSSL_FILETYPE_ASN1;
  63. }
  64. if ((*err_ret = wolfSSL_CTX_use_PrivateKey_buffer( (WOLFSSL_CTX *)tls->priv_ctx, cert_buf, cert_len, wolf_fileformat)) == WOLFSSL_SUCCESS) {
  65. return ESP_OK;
  66. }
  67. return ESP_FAIL;
  68. } else {
  69. if (cert_buf[cert_len - 1] == '\0' && strstr( (const char *) cert_buf, "-----BEGIN CERTIFICATE-----" )) {
  70. wolf_fileformat = WOLFSSL_FILETYPE_PEM;
  71. } else {
  72. wolf_fileformat = WOLFSSL_FILETYPE_ASN1;
  73. }
  74. if (type == FILE_TYPE_SELF_CERT) {
  75. if ((*err_ret = wolfSSL_CTX_use_certificate_buffer( (WOLFSSL_CTX *)tls->priv_ctx, cert_buf, cert_len, wolf_fileformat)) == WOLFSSL_SUCCESS) {
  76. return ESP_OK;
  77. }
  78. return ESP_FAIL;
  79. } else if (type == FILE_TYPE_CA_CERT) {
  80. if ((*err_ret = wolfSSL_CTX_load_verify_buffer( (WOLFSSL_CTX *)tls->priv_ctx, cert_buf, cert_len, wolf_fileformat)) == WOLFSSL_SUCCESS) {
  81. return ESP_OK;
  82. }
  83. return ESP_FAIL;
  84. } else {
  85. /* Wrong file type provided */
  86. return ESP_FAIL;
  87. }
  88. }
  89. }
  90. esp_err_t esp_create_wolfssl_handle(const char *hostname, size_t hostlen, const void *cfg, esp_tls_t *tls)
  91. {
  92. #ifdef CONFIG_ESP_DEBUG_WOLFSSL
  93. wolfSSL_Debugging_ON();
  94. #endif
  95. assert(cfg != NULL);
  96. assert(tls != NULL);
  97. esp_err_t esp_ret = ESP_FAIL;
  98. int ret;
  99. ret = wolfSSL_Init();
  100. if (ret != WOLFSSL_SUCCESS) {
  101. ESP_LOGE(TAG, "Init wolfSSL failed: %d", ret);
  102. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  103. goto exit;
  104. }
  105. if (tls->role == ESP_TLS_CLIENT) {
  106. esp_ret = set_client_config(hostname, hostlen, (esp_tls_cfg_t *)cfg, tls);
  107. if (esp_ret != ESP_OK) {
  108. ESP_LOGE(TAG, "Failed to set client configurations");
  109. goto exit;
  110. }
  111. } else if (tls->role == ESP_TLS_SERVER) {
  112. #ifdef CONFIG_ESP_TLS_SERVER
  113. esp_ret = set_server_config((esp_tls_cfg_server_t *) cfg, tls);
  114. if (esp_ret != ESP_OK) {
  115. ESP_LOGE(TAG, "Failed to set server configurations");
  116. goto exit;
  117. }
  118. #else
  119. ESP_LOGE(TAG, "ESP_TLS_SERVER Not enabled in menuconfig");
  120. goto exit;
  121. #endif
  122. }
  123. else {
  124. ESP_LOGE(TAG, "tls->role is not valid");
  125. goto exit;
  126. }
  127. return ESP_OK;
  128. exit:
  129. esp_wolfssl_cleanup(tls);
  130. return esp_ret;
  131. }
  132. static esp_err_t set_client_config(const char *hostname, size_t hostlen, esp_tls_cfg_t *cfg, esp_tls_t *tls)
  133. {
  134. int ret = WOLFSSL_FAILURE;
  135. tls->priv_ctx = (void *)wolfSSL_CTX_new(wolfTLSv1_2_client_method());
  136. if (!tls->priv_ctx) {
  137. ESP_LOGE(TAG, "Set wolfSSL ctx failed");
  138. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  139. return ESP_ERR_WOLFSSL_CTX_SETUP_FAILED;
  140. }
  141. if (cfg->crt_bundle_attach != NULL) {
  142. ESP_LOGE(TAG,"use_crt_bundle not supported in wolfssl");
  143. return ESP_FAIL;
  144. }
  145. if (cfg->use_global_ca_store == true) {
  146. if ((esp_load_wolfssl_verify_buffer(tls, global_cacert, global_cacert_pem_bytes, FILE_TYPE_CA_CERT, &ret)) != ESP_OK) {
  147. ESP_LOGE(TAG, "Error in loading certificate verify buffer, returned %d", ret);
  148. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  149. }
  150. wolfSSL_CTX_set_verify( (WOLFSSL_CTX *)tls->priv_ctx, WOLFSSL_VERIFY_PEER, NULL);
  151. } else if (cfg->cacert_buf != NULL) {
  152. if ((esp_load_wolfssl_verify_buffer(tls, cfg->cacert_buf, cfg->cacert_bytes, FILE_TYPE_CA_CERT, &ret)) != ESP_OK) {
  153. ESP_LOGE(TAG, "Error in loading certificate verify buffer, returned %d", ret);
  154. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  155. }
  156. wolfSSL_CTX_set_verify( (WOLFSSL_CTX *)tls->priv_ctx, WOLFSSL_VERIFY_PEER, NULL);
  157. } else if (cfg->psk_hint_key) {
  158. #if defined(CONFIG_ESP_TLS_PSK_VERIFICATION)
  159. /*** PSK encryption mode is configured only if no certificate supplied and psk pointer not null ***/
  160. if(cfg->psk_hint_key->key == NULL || cfg->psk_hint_key->hint == NULL || cfg->psk_hint_key->key_size <= 0) {
  161. ESP_LOGE(TAG, "Please provide appropriate key, keysize and hint to use PSK");
  162. return ESP_FAIL;
  163. }
  164. /* mutex is given back when call back function executes or in case of failure (at cleanup) */
  165. if ((xSemaphoreTake(tls_conn_lock, 1000/portTICK_PERIOD_MS) != pdTRUE)) {
  166. ESP_LOGE(TAG, "tls_conn_lock could not be obtained in specified time");
  167. return -1;
  168. }
  169. ESP_LOGI(TAG, "setting psk configurations");
  170. if((cfg->psk_hint_key->key_size > PSK_MAX_KEY_LEN) || (strlen(cfg->psk_hint_key->hint) > PSK_MAX_ID_LEN)) {
  171. ESP_LOGE(TAG, "psk key length should be <= %d and identity hint length should be <= %d", PSK_MAX_KEY_LEN, PSK_MAX_ID_LEN);
  172. return ESP_ERR_INVALID_ARG;
  173. }
  174. psk_key_max_len = cfg->psk_hint_key->key_size;
  175. memset(psk_key_array, 0, sizeof(psk_key_array));
  176. memset(psk_id_str, 0, sizeof(psk_id_str));
  177. memcpy(psk_key_array, cfg->psk_hint_key->key, psk_key_max_len);
  178. memcpy(psk_id_str, cfg->psk_hint_key->hint, strlen(cfg->psk_hint_key->hint));
  179. wolfSSL_CTX_set_psk_client_callback( (WOLFSSL_CTX *)tls->priv_ctx, esp_wolfssl_psk_client_cb);
  180. if(esp_wolfssl_set_cipher_list( (WOLFSSL_CTX *)tls->priv_ctx) != ESP_OK) {
  181. ESP_LOGE(TAG, "error in setting cipher-list");
  182. return ESP_FAIL;
  183. }
  184. #else
  185. ESP_LOGE(TAG, "psk_hint_key configured but not enabled in menuconfig: Please enable ESP_TLS_PSK_VERIFICATION option");
  186. return ESP_ERR_INVALID_STATE;
  187. #endif
  188. } else {
  189. wolfSSL_CTX_set_verify( (WOLFSSL_CTX *)tls->priv_ctx, WOLFSSL_VERIFY_NONE, NULL);
  190. }
  191. if (cfg->clientcert_buf != NULL && cfg->clientkey_buf != NULL) {
  192. if ((esp_load_wolfssl_verify_buffer(tls,cfg->clientcert_buf, cfg->clientcert_bytes, FILE_TYPE_SELF_CERT, &ret)) != ESP_OK) {
  193. ESP_LOGE(TAG, "Error in loading certificate verify buffer, returned %d", ret);
  194. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  195. }
  196. if ((esp_load_wolfssl_verify_buffer(tls,cfg->clientkey_buf, cfg->clientkey_bytes, FILE_TYPE_SELF_KEY, &ret)) != ESP_OK) {
  197. ESP_LOGE(TAG, "Error in loading private key verify buffer, returned %d", ret);
  198. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  199. }
  200. } else if (cfg->clientcert_buf != NULL || cfg->clientkey_buf != NULL) {
  201. ESP_LOGE(TAG, "You have to provide both clientcert_buf and clientkey_buf for mutual authentication\n\n");
  202. return ESP_FAIL;
  203. }
  204. tls->priv_ssl =(void *)wolfSSL_new( (WOLFSSL_CTX *)tls->priv_ctx);
  205. if (!tls->priv_ssl) {
  206. ESP_LOGE(TAG, "Create wolfSSL failed");
  207. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  208. return ESP_ERR_WOLFSSL_SSL_SETUP_FAILED;
  209. }
  210. if (!cfg->skip_common_name) {
  211. char *use_host = NULL;
  212. if (cfg->common_name != NULL) {
  213. use_host = strdup(cfg->common_name);
  214. } else {
  215. use_host = strndup(hostname, hostlen);
  216. }
  217. if (use_host == NULL) {
  218. return ESP_ERR_NO_MEM;
  219. }
  220. /* Hostname set here should match CN in server certificate */
  221. if ((ret = (wolfSSL_check_domain_name( (WOLFSSL *)tls->priv_ssl, use_host))) != WOLFSSL_SUCCESS) {
  222. ESP_LOGE(TAG, "wolfSSL_check_domain_name returned -0x%x", -ret);
  223. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  224. free(use_host);
  225. return ESP_ERR_WOLFSSL_SSL_SET_HOSTNAME_FAILED;
  226. }
  227. free(use_host);
  228. }
  229. if (cfg->alpn_protos) {
  230. #ifdef CONFIG_WOLFSSL_HAVE_ALPN
  231. char **alpn_list = (char **)cfg->alpn_protos;
  232. for (; *alpn_list != NULL; alpn_list ++) {
  233. ESP_LOGD(TAG, "alpn protocol is %s", *alpn_list);
  234. if ((ret = wolfSSL_UseALPN( (WOLFSSL *)tls->priv_ssl, *alpn_list, strlen(*alpn_list), WOLFSSL_ALPN_FAILED_ON_MISMATCH)) != WOLFSSL_SUCCESS) {
  235. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  236. ESP_LOGE(TAG, "wolfSSL UseALPN failed, returned %d", ret);
  237. return ESP_ERR_WOLFSSL_SSL_CONF_ALPN_PROTOCOLS_FAILED;
  238. }
  239. }
  240. #else
  241. ESP_LOGE(TAG, "CONFIG_WOLFSSL_HAVE_ALPN not enabled in menuconfig");
  242. return ESP_FAIL;
  243. #endif /* CONFIG_WOLFSSL_HAVE_ALPN */
  244. }
  245. wolfSSL_set_fd((WOLFSSL *)tls->priv_ssl, tls->sockfd);
  246. return ESP_OK;
  247. }
  248. #ifdef CONFIG_ESP_TLS_SERVER
  249. static esp_err_t set_server_config(esp_tls_cfg_server_t *cfg, esp_tls_t *tls)
  250. {
  251. int ret = WOLFSSL_FAILURE;
  252. tls->priv_ctx = (void *)wolfSSL_CTX_new(wolfTLSv1_2_server_method());
  253. if (!tls->priv_ctx) {
  254. ESP_LOGE(TAG, "Set wolfSSL ctx failed");
  255. return ESP_ERR_WOLFSSL_CTX_SETUP_FAILED;
  256. }
  257. if (cfg->cacert_buf != NULL) {
  258. if ((esp_load_wolfssl_verify_buffer(tls,cfg->cacert_buf, cfg->cacert_bytes, FILE_TYPE_CA_CERT, &ret)) != ESP_OK) {
  259. ESP_LOGE(TAG, "Error in loading certificate verify buffer, returned %d", ret);
  260. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  261. }
  262. wolfSSL_CTX_set_verify( (WOLFSSL_CTX *)tls->priv_ctx, WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
  263. ESP_LOGD(TAG," Verify Client for Mutual Auth");
  264. } else {
  265. ESP_LOGD(TAG," Not verifying Client ");
  266. wolfSSL_CTX_set_verify( (WOLFSSL_CTX *)tls->priv_ctx, WOLFSSL_VERIFY_NONE, NULL);
  267. }
  268. if (cfg->servercert_buf != NULL && cfg->serverkey_buf != NULL) {
  269. if ((esp_load_wolfssl_verify_buffer(tls,cfg->servercert_buf, cfg->servercert_bytes, FILE_TYPE_SELF_CERT, &ret)) != ESP_OK) {
  270. ESP_LOGE(TAG, "Error in loading certificate verify buffer, returned %d", ret);
  271. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  272. }
  273. if ((esp_load_wolfssl_verify_buffer(tls,cfg->serverkey_buf, cfg->serverkey_bytes, FILE_TYPE_SELF_KEY, &ret)) != ESP_OK) {
  274. ESP_LOGE(TAG, "Error in loading private key verify buffer, returned %d", ret);
  275. return ESP_ERR_WOLFSSL_CERT_VERIFY_SETUP_FAILED;
  276. }
  277. } else {
  278. ESP_LOGE(TAG, "You have to provide both servercert_buf and serverkey_buf for https_server\n\n");
  279. return ESP_FAIL;
  280. }
  281. tls->priv_ssl =(void *)wolfSSL_new( (WOLFSSL_CTX *)tls->priv_ctx);
  282. if (!tls->priv_ssl) {
  283. ESP_LOGE(TAG, "Create wolfSSL failed");
  284. return ESP_ERR_WOLFSSL_SSL_SETUP_FAILED;
  285. }
  286. wolfSSL_set_fd((WOLFSSL *)tls->priv_ssl, tls->sockfd);
  287. return ESP_OK;
  288. }
  289. #endif
  290. int esp_wolfssl_handshake(esp_tls_t *tls, const esp_tls_cfg_t *cfg)
  291. {
  292. int ret;
  293. ret = wolfSSL_connect( (WOLFSSL *)tls->priv_ssl);
  294. if (ret == WOLFSSL_SUCCESS) {
  295. tls->conn_state = ESP_TLS_DONE;
  296. return 1;
  297. } else {
  298. int err = wolfSSL_get_error( (WOLFSSL *)tls->priv_ssl, ret);
  299. if (err != ESP_TLS_ERR_SSL_WANT_READ && err != ESP_TLS_ERR_SSL_WANT_WRITE) {
  300. ESP_LOGE(TAG, "wolfSSL_connect returned -0x%x", -ret);
  301. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  302. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_ESP, ESP_ERR_WOLFSSL_SSL_HANDSHAKE_FAILED);
  303. if (cfg->cacert_buf != NULL || cfg->use_global_ca_store == true) {
  304. /* This is to check whether handshake failed due to invalid certificate*/
  305. esp_wolfssl_verify_certificate(tls);
  306. }
  307. tls->conn_state = ESP_TLS_FAIL;
  308. return -1;
  309. }
  310. /* Irrespective of blocking or non-blocking I/O, we return on getting wolfSSL_want_read
  311. or wolfSSL_want_write during handshake */
  312. return 0;
  313. }
  314. }
  315. ssize_t esp_wolfssl_read(esp_tls_t *tls, char *data, size_t datalen)
  316. {
  317. ssize_t ret = wolfSSL_read( (WOLFSSL *)tls->priv_ssl, (unsigned char *)data, datalen);
  318. if (ret < 0) {
  319. ret = wolfSSL_get_error( (WOLFSSL *)tls->priv_ssl, ret);
  320. /* peer sent close notify */
  321. if (ret == WOLFSSL_ERROR_ZERO_RETURN) {
  322. return 0;
  323. }
  324. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  325. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  326. ESP_LOGE(TAG, "read error :%d:", ret);
  327. }
  328. }
  329. return ret;
  330. }
  331. ssize_t esp_wolfssl_write(esp_tls_t *tls, const char *data, size_t datalen)
  332. {
  333. ssize_t ret = wolfSSL_write( (WOLFSSL *)tls->priv_ssl, (unsigned char *) data, datalen);
  334. if (ret <= 0) {
  335. ret = wolfSSL_get_error( (WOLFSSL *)tls->priv_ssl, ret);
  336. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  337. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  338. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_ESP, ESP_ERR_WOLFSSL_SSL_WRITE_FAILED);
  339. ESP_LOGE(TAG, "write error :%d:", ret);
  340. }
  341. }
  342. return ret;
  343. }
  344. void esp_wolfssl_verify_certificate(esp_tls_t *tls)
  345. {
  346. int flags;
  347. if ((flags = wolfSSL_get_verify_result( (WOLFSSL *)tls->priv_ssl)) != X509_V_OK) {
  348. ESP_LOGE(TAG, "Failed to verify peer certificate , returned %d!", flags);
  349. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL_CERT_FLAGS, flags);
  350. } else {
  351. ESP_LOGI(TAG, "Certificate verified.");
  352. }
  353. }
  354. ssize_t esp_wolfssl_get_bytes_avail(esp_tls_t *tls)
  355. {
  356. if (!tls) {
  357. ESP_LOGE(TAG, "empty arg passed to esp_tls_get_bytes_avail()");
  358. return ESP_FAIL;
  359. }
  360. return wolfSSL_pending( (WOLFSSL *)tls->priv_ssl);
  361. }
  362. void esp_wolfssl_conn_delete(esp_tls_t *tls)
  363. {
  364. if (tls != NULL) {
  365. esp_wolfssl_cleanup(tls);
  366. }
  367. }
  368. void esp_wolfssl_cleanup(esp_tls_t *tls)
  369. {
  370. if (!tls) {
  371. return;
  372. }
  373. #ifdef CONFIG_ESP_TLS_PSK_VERIFICATION
  374. xSemaphoreGive(tls_conn_lock);
  375. #endif /* CONFIG_ESP_TLS_PSK_VERIFICATION */
  376. wolfSSL_shutdown( (WOLFSSL *)tls->priv_ssl);
  377. wolfSSL_free( (WOLFSSL *)tls->priv_ssl);
  378. tls->priv_ssl = NULL;
  379. wolfSSL_CTX_free( (WOLFSSL_CTX *)tls->priv_ctx);
  380. tls->priv_ctx = NULL;
  381. wolfSSL_Cleanup();
  382. }
  383. #ifdef CONFIG_ESP_TLS_SERVER
  384. /**
  385. * @brief Create TLS/SSL server session
  386. */
  387. int esp_wolfssl_server_session_create(esp_tls_cfg_server_t *cfg, int sockfd, esp_tls_t *tls)
  388. {
  389. if (tls == NULL || cfg == NULL) {
  390. return -1;
  391. }
  392. tls->role = ESP_TLS_SERVER;
  393. tls->sockfd = sockfd;
  394. esp_err_t esp_ret = esp_create_wolfssl_handle(NULL, 0, cfg, tls);
  395. if (esp_ret != ESP_OK) {
  396. ESP_LOGE(TAG, "create_ssl_handle failed");
  397. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_ESP, esp_ret);
  398. tls->conn_state = ESP_TLS_FAIL;
  399. return -1;
  400. }
  401. tls->read = esp_wolfssl_read;
  402. tls->write = esp_wolfssl_write;
  403. int ret;
  404. while ((ret = wolfSSL_accept((WOLFSSL *)tls->priv_ssl)) != WOLFSSL_SUCCESS) {
  405. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  406. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ERR_TYPE_WOLFSSL, -ret);
  407. ESP_LOGE(TAG, "wolfSSL_handshake_server returned %d", ret);
  408. tls->conn_state = ESP_TLS_FAIL;
  409. return ret;
  410. }
  411. }
  412. return 0;
  413. }
  414. /**
  415. * @brief Close the server side TLS/SSL connection and free any allocated resources.
  416. */
  417. void esp_wolfssl_server_session_delete(esp_tls_t *tls)
  418. {
  419. if (tls != NULL) {
  420. esp_wolfssl_cleanup(tls);
  421. free(tls);
  422. }
  423. }
  424. #endif /* CONFIG_ESP_TLS_SERVER */
  425. esp_err_t esp_wolfssl_init_global_ca_store(void)
  426. {
  427. /* This function is just to provide consistancy between function calls of esp_tls.h and wolfssl */
  428. return ESP_OK;
  429. }
  430. esp_err_t esp_wolfssl_set_global_ca_store(const unsigned char *cacert_pem_buf, const unsigned int cacert_pem_bytes)
  431. {
  432. if (cacert_pem_buf == NULL) {
  433. ESP_LOGE(TAG, "cacert_pem_buf is null");
  434. return ESP_ERR_INVALID_ARG;
  435. }
  436. if (global_cacert != NULL) {
  437. esp_wolfssl_free_global_ca_store();
  438. }
  439. global_cacert = (unsigned char *)strndup((const char *)cacert_pem_buf, cacert_pem_bytes);
  440. if (!global_cacert) {
  441. return ESP_FAIL;
  442. }
  443. global_cacert_pem_bytes = cacert_pem_bytes;
  444. return ESP_OK;
  445. }
  446. void esp_wolfssl_free_global_ca_store(void)
  447. {
  448. if (global_cacert) {
  449. free(global_cacert);
  450. global_cacert = NULL;
  451. global_cacert_pem_bytes = 0;
  452. }
  453. }
  454. #if defined(CONFIG_ESP_TLS_PSK_VERIFICATION)
  455. static esp_err_t esp_wolfssl_set_cipher_list(WOLFSSL_CTX *ctx)
  456. {
  457. const char *defaultCipherList;
  458. int ret;
  459. #if defined(HAVE_AESGCM) && !defined(NO_DH)
  460. #ifdef WOLFSSL_TLS13
  461. defaultCipherList = "DHE-PSK-AES128-GCM-SHA256:"
  462. "TLS13-AES128-GCM-SHA256";
  463. #else
  464. defaultCipherList = "DHE-PSK-AES128-GCM-SHA256";
  465. #endif
  466. #elif defined(HAVE_NULL_CIPHER)
  467. defaultCipherList = "PSK-NULL-SHA256";
  468. #else
  469. defaultCipherList = "PSK-AES128-CBC-SHA256";
  470. #endif
  471. ESP_LOGD(TAG, "cipher list is %s", defaultCipherList);
  472. if ((ret = wolfSSL_CTX_set_cipher_list(ctx,defaultCipherList)) != WOLFSSL_SUCCESS) {
  473. wolfSSL_CTX_free(ctx);
  474. ESP_LOGE(TAG, "can't set cipher list, returned %02x", ret);
  475. return ESP_FAIL;
  476. }
  477. return ESP_OK;
  478. }
  479. /* initialize the mutex before app_main() when using PSK */
  480. static void __attribute__((constructor))
  481. espt_tls_wolfssl_init_conn_lock (void)
  482. {
  483. if ((tls_conn_lock = xSemaphoreCreateMutex()) == NULL) {
  484. ESP_EARLY_LOGE(TAG, "mutex for tls psk connection could not be created");
  485. }
  486. }
  487. /* Some callback functions required by PSK */
  488. static inline unsigned int esp_wolfssl_psk_client_cb(WOLFSSL* ssl, const char* hint,
  489. char* identity, unsigned int id_max_len, unsigned char* key,
  490. unsigned int key_max_len)
  491. {
  492. (void)key_max_len;
  493. /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */
  494. memcpy(identity, psk_id_str, id_max_len);
  495. for(int count = 0; count < psk_key_max_len; count ++) {
  496. key[count] = psk_key_array[count];
  497. }
  498. xSemaphoreGive(tls_conn_lock);
  499. return psk_key_max_len;
  500. /* return length of key in octets or 0 or for error */
  501. }
  502. #endif /* CONFIG_ESP_TLS_PSK_VERIFICATION */