esp_tls_mbedtls.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <netdb.h>
  13. #include <http_parser.h>
  14. #include "esp_tls_mbedtls.h"
  15. #include "esp_tls_error_capture_internal.h"
  16. #include <errno.h>
  17. #include "esp_log.h"
  18. #ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
  19. #include "esp_crt_bundle.h"
  20. #endif
  21. #ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT
  22. #define ATECC608A_TNG_SLAVE_ADDR 0x6A
  23. #define ATECC608A_TFLEX_SLAVE_ADDR 0x6C
  24. #define ATECC608A_TCUSTOM_SLAVE_ADDR 0xC0
  25. /* cryptoauthlib includes */
  26. #include "mbedtls/atca_mbedtls_wrap.h"
  27. #include "tng_atca.h"
  28. #include "cryptoauthlib.h"
  29. static const atcacert_def_t *cert_def = NULL;
  30. /* Prototypes for functions */
  31. static esp_err_t esp_set_atecc608a_pki_context(esp_tls_t *tls, esp_tls_cfg_t *cfg);
  32. #endif /* CONFIG_ESP_TLS_USE_SECURE_ELEMENT */
  33. #if defined(CONFIG_ESP_TLS_USE_DS_PERIPHERAL)
  34. #include "rsa_sign_alt.h"
  35. static esp_err_t esp_mbedtls_init_pk_ctx_for_ds(const void *pki);
  36. #endif /* CONFIG_ESP_TLS_USE_DS_PERIPHERAL */
  37. static const char *TAG = "esp-tls-mbedtls";
  38. static mbedtls_x509_crt *global_cacert = NULL;
  39. /* This function shall return the error message when appropriate log level has been set, otherwise this function shall do nothing */
  40. static void mbedtls_print_error_msg(int error)
  41. {
  42. #if (CONFIG_LOG_DEFAULT_LEVEL_DEBUG || CONFIG_LOG_DEFAULT_LEVEL_VERBOSE)
  43. static char error_buf[100];
  44. mbedtls_strerror(error, error_buf, sizeof(error_buf));
  45. ESP_LOGI(TAG, "(%04X): %s", error, error_buf);
  46. #endif
  47. }
  48. typedef struct esp_tls_pki_t {
  49. mbedtls_x509_crt *public_cert;
  50. mbedtls_pk_context *pk_key;
  51. const unsigned char *publiccert_pem_buf;
  52. unsigned int publiccert_pem_bytes;
  53. const unsigned char *privkey_pem_buf;
  54. unsigned int privkey_pem_bytes;
  55. const unsigned char *privkey_password;
  56. unsigned int privkey_password_len;
  57. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  58. void *esp_ds_data;
  59. #endif
  60. } esp_tls_pki_t;
  61. esp_err_t esp_create_mbedtls_handle(const char *hostname, size_t hostlen, const void *cfg, esp_tls_t *tls)
  62. {
  63. assert(cfg != NULL);
  64. assert(tls != NULL);
  65. int ret;
  66. esp_err_t esp_ret = ESP_FAIL;
  67. tls->server_fd.fd = tls->sockfd;
  68. mbedtls_ssl_init(&tls->ssl);
  69. mbedtls_ctr_drbg_init(&tls->ctr_drbg);
  70. mbedtls_ssl_config_init(&tls->conf);
  71. mbedtls_entropy_init(&tls->entropy);
  72. if (tls->role == ESP_TLS_CLIENT) {
  73. esp_ret = set_client_config(hostname, hostlen, (esp_tls_cfg_t *)cfg, tls);
  74. if (esp_ret != ESP_OK) {
  75. ESP_LOGE(TAG, "Failed to set client configurations, returned [0x%04X] (%s)", esp_ret, esp_err_to_name(esp_ret));
  76. goto exit;
  77. }
  78. } else if (tls->role == ESP_TLS_SERVER) {
  79. #ifdef CONFIG_ESP_TLS_SERVER
  80. esp_ret = set_server_config((esp_tls_cfg_server_t *) cfg, tls);
  81. if (esp_ret != 0) {
  82. ESP_LOGE(TAG, "Failed to set server configurations, returned [0x%04X] (%s)", esp_ret, esp_err_to_name(esp_ret));
  83. goto exit;
  84. }
  85. #else
  86. ESP_LOGE(TAG, "ESP_TLS_SERVER Not enabled in Kconfig");
  87. goto exit;
  88. #endif
  89. }
  90. if ((ret = mbedtls_ctr_drbg_seed(&tls->ctr_drbg,
  91. mbedtls_entropy_func, &tls->entropy, NULL, 0)) != 0) {
  92. ESP_LOGE(TAG, "mbedtls_ctr_drbg_seed returned -0x%04X", -ret);
  93. mbedtls_print_error_msg(ret);
  94. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  95. esp_ret = ESP_ERR_MBEDTLS_CTR_DRBG_SEED_FAILED;
  96. goto exit;
  97. }
  98. mbedtls_ssl_conf_rng(&tls->conf, mbedtls_ctr_drbg_random, &tls->ctr_drbg);
  99. #ifdef CONFIG_MBEDTLS_DEBUG
  100. mbedtls_esp_enable_debug_log(&tls->conf, CONFIG_MBEDTLS_DEBUG_LEVEL);
  101. #endif
  102. if ((ret = mbedtls_ssl_setup(&tls->ssl, &tls->conf)) != 0) {
  103. ESP_LOGE(TAG, "mbedtls_ssl_setup returned -0x%04X", -ret);
  104. mbedtls_print_error_msg(ret);
  105. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  106. esp_ret = ESP_ERR_MBEDTLS_SSL_SETUP_FAILED;
  107. goto exit;
  108. }
  109. mbedtls_ssl_set_bio(&tls->ssl, &tls->server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
  110. return ESP_OK;
  111. exit:
  112. esp_mbedtls_cleanup(tls);
  113. return esp_ret;
  114. }
  115. #ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
  116. esp_tls_client_session_t *esp_mbedtls_get_client_session(esp_tls_t *tls)
  117. {
  118. if (tls == NULL) {
  119. ESP_LOGE(TAG, "esp_tls session context cannot be NULL");
  120. return NULL;
  121. }
  122. esp_tls_client_session_t *client_session = (esp_tls_client_session_t*)calloc(1, sizeof(esp_tls_client_session_t));
  123. if (client_session == NULL) {
  124. ESP_LOGE(TAG, "Failed to allocate memory for client session ctx");
  125. return NULL;
  126. }
  127. int ret = mbedtls_ssl_get_session(&tls->ssl, &(client_session->saved_session));
  128. if (ret != 0) {
  129. ESP_LOGE(TAG, "Error in obtaining the client ssl session");
  130. mbedtls_print_error_msg(ret);
  131. free(client_session);
  132. return NULL;
  133. }
  134. return client_session;
  135. }
  136. #endif /* CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS */
  137. int esp_mbedtls_handshake(esp_tls_t *tls, const esp_tls_cfg_t *cfg)
  138. {
  139. int ret;
  140. #ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
  141. if (cfg->client_session != NULL) {
  142. ESP_LOGD(TAG, "Reusing the already saved client session context");
  143. if ((ret = mbedtls_ssl_set_session(&tls->ssl, &(cfg->client_session->saved_session))) != 0 ) {
  144. ESP_LOGE(TAG, " mbedtls_ssl_conf_session returned -0x%04X", -ret);
  145. return -1;
  146. }
  147. }
  148. #endif
  149. ret = mbedtls_ssl_handshake(&tls->ssl);
  150. if (ret == 0) {
  151. tls->conn_state = ESP_TLS_DONE;
  152. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  153. esp_ds_release_ds_lock();
  154. #endif
  155. return 1;
  156. } else {
  157. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  158. ESP_LOGE(TAG, "mbedtls_ssl_handshake returned -0x%04X", -ret);
  159. mbedtls_print_error_msg(ret);
  160. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  161. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_ESP, ESP_ERR_MBEDTLS_SSL_HANDSHAKE_FAILED);
  162. if (cfg->cacert_buf != NULL || cfg->use_global_ca_store == true) {
  163. /* This is to check whether handshake failed due to invalid certificate*/
  164. esp_mbedtls_verify_certificate(tls);
  165. }
  166. tls->conn_state = ESP_TLS_FAIL;
  167. return -1;
  168. }
  169. /* Irrespective of blocking or non-blocking I/O, we return on getting ESP_TLS_ERR_SSL_WANT_READ
  170. or ESP_TLS_ERR_SSL_WANT_WRITE during handshake */
  171. return 0;
  172. }
  173. }
  174. ssize_t esp_mbedtls_read(esp_tls_t *tls, char *data, size_t datalen)
  175. {
  176. ssize_t ret = mbedtls_ssl_read(&tls->ssl, (unsigned char *)data, datalen);
  177. if (ret < 0) {
  178. if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) {
  179. return 0;
  180. }
  181. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  182. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  183. ESP_LOGE(TAG, "read error :-0x%04X:", -ret);
  184. mbedtls_print_error_msg(ret);
  185. }
  186. }
  187. return ret;
  188. }
  189. ssize_t esp_mbedtls_write(esp_tls_t *tls, const char *data, size_t datalen)
  190. {
  191. size_t written = 0;
  192. size_t write_len = datalen;
  193. while (written < datalen) {
  194. if (write_len > MBEDTLS_SSL_OUT_CONTENT_LEN) {
  195. write_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
  196. }
  197. if (datalen > MBEDTLS_SSL_OUT_CONTENT_LEN) {
  198. ESP_LOGD(TAG, "Fragmenting data of excessive size :%d, offset: %d, size %d", datalen, written, write_len);
  199. }
  200. ssize_t ret = mbedtls_ssl_write(&tls->ssl, (unsigned char*) data + written, write_len);
  201. if (ret <= 0) {
  202. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE && ret != 0) {
  203. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  204. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_ESP, ESP_ERR_MBEDTLS_SSL_WRITE_FAILED);
  205. ESP_LOGE(TAG, "write error :-0x%04X:", -ret);
  206. mbedtls_print_error_msg(ret);
  207. return ret;
  208. } else {
  209. // Exiting the tls-write process as less than desired datalen are writable
  210. ESP_LOGD(TAG, "mbedtls_ssl_write() returned -0x%04X, already written %d, exitting...", -ret, written);
  211. mbedtls_print_error_msg(ret);
  212. return (written > 0) ? written : ret;
  213. }
  214. }
  215. written += ret;
  216. write_len = datalen - written;
  217. }
  218. return written;
  219. }
  220. void esp_mbedtls_conn_delete(esp_tls_t *tls)
  221. {
  222. if (tls != NULL) {
  223. esp_mbedtls_cleanup(tls);
  224. if (tls->is_tls) {
  225. mbedtls_net_free(&tls->server_fd);
  226. tls->sockfd = tls->server_fd.fd;
  227. }
  228. }
  229. }
  230. void esp_mbedtls_verify_certificate(esp_tls_t *tls)
  231. {
  232. int flags;
  233. if ((flags = mbedtls_ssl_get_verify_result(&tls->ssl)) != 0) {
  234. ESP_LOGI(TAG, "Failed to verify peer certificate!");
  235. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS_CERT_FLAGS, flags);
  236. #if (CONFIG_LOG_DEFAULT_LEVEL > CONFIG_LOG_DEFAULT_LEVEL_DEBUG)
  237. char buf[100];
  238. bzero(buf, sizeof(buf));
  239. mbedtls_x509_crt_verify_info(buf, sizeof(buf), " ! ", flags);
  240. ESP_LOGD(TAG, "verification info: %s", buf);
  241. #endif
  242. } else {
  243. ESP_LOGI(TAG, "Certificate verified.");
  244. }
  245. }
  246. ssize_t esp_mbedtls_get_bytes_avail(esp_tls_t *tls)
  247. {
  248. if (!tls) {
  249. ESP_LOGE(TAG, "empty arg passed to esp_tls_get_bytes_avail()");
  250. return ESP_FAIL;
  251. }
  252. return mbedtls_ssl_get_bytes_avail(&tls->ssl);
  253. }
  254. void esp_mbedtls_cleanup(esp_tls_t *tls)
  255. {
  256. if (!tls) {
  257. return;
  258. }
  259. if (tls->cacert_ptr != global_cacert) {
  260. mbedtls_x509_crt_free(tls->cacert_ptr);
  261. }
  262. tls->cacert_ptr = NULL;
  263. #ifdef CONFIG_ESP_TLS_SERVER
  264. mbedtls_x509_crt_free(&tls->servercert);
  265. mbedtls_pk_free(&tls->serverkey);
  266. #endif
  267. mbedtls_x509_crt_free(&tls->cacert);
  268. mbedtls_x509_crt_free(&tls->clientcert);
  269. mbedtls_pk_free(&tls->clientkey);
  270. mbedtls_entropy_free(&tls->entropy);
  271. mbedtls_ssl_config_free(&tls->conf);
  272. mbedtls_ctr_drbg_free(&tls->ctr_drbg);
  273. mbedtls_ssl_free(&tls->ssl);
  274. #ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT
  275. atcab_release();
  276. #endif
  277. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  278. esp_ds_release_ds_lock();
  279. #endif
  280. }
  281. static esp_err_t set_ca_cert(esp_tls_t *tls, const unsigned char *cacert, size_t cacert_len)
  282. {
  283. assert(tls);
  284. tls->cacert_ptr = &tls->cacert;
  285. mbedtls_x509_crt_init(tls->cacert_ptr);
  286. int ret = mbedtls_x509_crt_parse(tls->cacert_ptr, cacert, cacert_len);
  287. if (ret < 0) {
  288. ESP_LOGE(TAG, "mbedtls_x509_crt_parse returned -0x%04X", -ret);
  289. mbedtls_print_error_msg(ret);
  290. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  291. return ESP_ERR_MBEDTLS_X509_CRT_PARSE_FAILED;
  292. }
  293. if (ret > 0) {
  294. /* This will happen if the CA chain contains one or more invalid certs, going ahead as the hadshake
  295. * may still succeed if the other certificates in the CA chain are enough for the authentication */
  296. ESP_LOGW(TAG, "mbedtls_x509_crt_parse was partly successful. No. of failed certificates: %d", ret);
  297. }
  298. mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
  299. mbedtls_ssl_conf_ca_chain(&tls->conf, tls->cacert_ptr, NULL);
  300. return ESP_OK;
  301. }
  302. static esp_err_t set_pki_context(esp_tls_t *tls, const esp_tls_pki_t *pki)
  303. {
  304. assert(tls);
  305. assert(pki);
  306. int ret;
  307. if (pki->publiccert_pem_buf != NULL &&
  308. pki->public_cert != NULL &&
  309. pki->pk_key != NULL) {
  310. mbedtls_x509_crt_init(pki->public_cert);
  311. mbedtls_pk_init(pki->pk_key);
  312. ret = mbedtls_x509_crt_parse(pki->public_cert, pki->publiccert_pem_buf, pki->publiccert_pem_bytes);
  313. if (ret < 0) {
  314. ESP_LOGE(TAG, "mbedtls_x509_crt_parse returned -0x%04X", -ret);
  315. mbedtls_print_error_msg(ret);
  316. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  317. return ESP_ERR_MBEDTLS_X509_CRT_PARSE_FAILED;
  318. }
  319. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  320. if (pki->esp_ds_data != NULL) {
  321. ret = esp_mbedtls_init_pk_ctx_for_ds(pki);
  322. if (ret != ESP_OK) {
  323. ESP_LOGE(TAG, "Failed to initialize pk context for esp_ds");
  324. return ret;
  325. }
  326. } else
  327. #endif
  328. if (pki->privkey_pem_buf != NULL) {
  329. ret = mbedtls_pk_parse_key(pki->pk_key, pki->privkey_pem_buf, pki->privkey_pem_bytes,
  330. pki->privkey_password, pki->privkey_password_len);
  331. } else {
  332. return ESP_ERR_INVALID_ARG;
  333. }
  334. if (ret < 0) {
  335. ESP_LOGE(TAG, "mbedtls_pk_parse_keyfile returned -0x%04X", -ret);
  336. mbedtls_print_error_msg(ret);
  337. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  338. return ESP_ERR_MBEDTLS_PK_PARSE_KEY_FAILED;
  339. }
  340. ret = mbedtls_ssl_conf_own_cert(&tls->conf, pki->public_cert, pki->pk_key);
  341. if (ret < 0) {
  342. ESP_LOGE(TAG, "mbedtls_ssl_conf_own_cert returned -0x%04X", -ret);
  343. mbedtls_print_error_msg(ret);
  344. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  345. return ESP_ERR_MBEDTLS_SSL_CONF_OWN_CERT_FAILED;
  346. }
  347. } else {
  348. return ESP_ERR_INVALID_ARG;
  349. }
  350. return ESP_OK;
  351. }
  352. static esp_err_t set_global_ca_store(esp_tls_t *tls)
  353. {
  354. assert(tls);
  355. if (global_cacert == NULL) {
  356. ESP_LOGE(TAG, "global_cacert is NULL");
  357. return ESP_ERR_INVALID_STATE;
  358. }
  359. tls->cacert_ptr = global_cacert;
  360. mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
  361. mbedtls_ssl_conf_ca_chain(&tls->conf, tls->cacert_ptr, NULL);
  362. return ESP_OK;
  363. }
  364. #ifdef CONFIG_ESP_TLS_SERVER
  365. #ifdef CONFIG_ESP_TLS_SERVER_SESSION_TICKETS
  366. int esp_mbedtls_server_session_ticket_write(void *p_ticket, const mbedtls_ssl_session *session, unsigned char *start, const unsigned char *end, size_t *tlen, uint32_t *lifetime)
  367. {
  368. int ret = mbedtls_ssl_ticket_write(p_ticket, session, start, end, tlen, lifetime);
  369. #ifndef NDEBUG
  370. if (ret != 0) {
  371. ESP_LOGE(TAG, "Writing session ticket resulted in error code -0x%04X", -ret);
  372. mbedtls_print_error_msg(ret);
  373. }
  374. #endif
  375. return ret;
  376. }
  377. int esp_mbedtls_server_session_ticket_parse(void *p_ticket, mbedtls_ssl_session *session, unsigned char *buf, size_t len)
  378. {
  379. int ret = mbedtls_ssl_ticket_parse(p_ticket, session, buf, len);
  380. #ifndef NDEBUG
  381. if (ret != 0) {
  382. ESP_LOGD(TAG, "Parsing session ticket resulted in error code -0x%04X", -ret);
  383. mbedtls_print_error_msg(ret);
  384. }
  385. #endif
  386. return ret;
  387. }
  388. esp_err_t esp_mbedtls_server_session_ticket_ctx_init(esp_tls_server_session_ticket_ctx_t *ctx)
  389. {
  390. if (!ctx) {
  391. return ESP_ERR_INVALID_ARG;
  392. }
  393. mbedtls_ctr_drbg_init(&ctx->ctr_drbg);
  394. mbedtls_entropy_init(&ctx->entropy);
  395. mbedtls_ssl_ticket_init(&ctx->ticket_ctx);
  396. int ret;
  397. esp_err_t esp_ret;
  398. if ((ret = mbedtls_ctr_drbg_seed(&ctx->ctr_drbg,
  399. mbedtls_entropy_func, &ctx->entropy, NULL, 0)) != 0) {
  400. ESP_LOGE(TAG, "mbedtls_ctr_drbg_seed returned -0x%04X", -ret);
  401. mbedtls_print_error_msg(ret);
  402. esp_ret = ESP_ERR_MBEDTLS_CTR_DRBG_SEED_FAILED;
  403. goto exit;
  404. }
  405. if((ret = mbedtls_ssl_ticket_setup(&ctx->ticket_ctx,
  406. mbedtls_ctr_drbg_random, &ctx->ctr_drbg,
  407. MBEDTLS_CIPHER_AES_256_GCM,
  408. CONFIG_ESP_TLS_SERVER_SESSION_TICKET_TIMEOUT)) != 0) {
  409. ESP_LOGE(TAG, "mbedtls_ssl_ticket_setup returned -0x%04X", -ret);
  410. mbedtls_print_error_msg(ret);
  411. esp_ret = ESP_ERR_MBEDTLS_SSL_TICKET_SETUP_FAILED;
  412. goto exit;
  413. }
  414. return ESP_OK;
  415. exit:
  416. esp_mbedtls_server_session_ticket_ctx_free(ctx);
  417. return esp_ret;
  418. }
  419. void esp_mbedtls_server_session_ticket_ctx_free(esp_tls_server_session_ticket_ctx_t *ctx)
  420. {
  421. if (ctx) {
  422. mbedtls_ssl_ticket_free(&ctx->ticket_ctx);
  423. mbedtls_ctr_drbg_init(&ctx->ctr_drbg);
  424. mbedtls_entropy_free(&ctx->entropy);
  425. }
  426. }
  427. #endif
  428. esp_err_t set_server_config(esp_tls_cfg_server_t *cfg, esp_tls_t *tls)
  429. {
  430. assert(cfg != NULL);
  431. assert(tls != NULL);
  432. int ret;
  433. esp_err_t esp_ret;
  434. if ((ret = mbedtls_ssl_config_defaults(&tls->conf,
  435. MBEDTLS_SSL_IS_SERVER,
  436. MBEDTLS_SSL_TRANSPORT_STREAM,
  437. MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
  438. ESP_LOGE(TAG, "mbedtls_ssl_config_defaults returned -0x%04X", -ret);
  439. mbedtls_print_error_msg(ret);
  440. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  441. return ESP_ERR_MBEDTLS_SSL_CONFIG_DEFAULTS_FAILED;
  442. }
  443. #ifdef CONFIG_MBEDTLS_SSL_ALPN
  444. if (cfg->alpn_protos) {
  445. mbedtls_ssl_conf_alpn_protocols(&tls->conf, cfg->alpn_protos);
  446. }
  447. #endif
  448. if (cfg->cacert_buf != NULL) {
  449. esp_ret = set_ca_cert(tls, cfg->cacert_buf, cfg->cacert_bytes);
  450. if (esp_ret != ESP_OK) {
  451. return esp_ret;
  452. }
  453. } else {
  454. mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
  455. }
  456. if (cfg->servercert_buf != NULL && cfg->serverkey_buf != NULL) {
  457. esp_tls_pki_t pki = {
  458. .public_cert = &tls->servercert,
  459. .pk_key = &tls->serverkey,
  460. .publiccert_pem_buf = cfg->servercert_buf,
  461. .publiccert_pem_bytes = cfg->servercert_bytes,
  462. .privkey_pem_buf = cfg->serverkey_buf,
  463. .privkey_pem_bytes = cfg->serverkey_bytes,
  464. .privkey_password = cfg->serverkey_password,
  465. .privkey_password_len = cfg->serverkey_password_len,
  466. };
  467. esp_ret = set_pki_context(tls, &pki);
  468. if (esp_ret != ESP_OK) {
  469. ESP_LOGE(TAG, "Failed to set server pki context");
  470. return esp_ret;
  471. }
  472. } else {
  473. ESP_LOGE(TAG, "Missing server certificate and/or key");
  474. return ESP_ERR_INVALID_STATE;
  475. }
  476. #ifdef CONFIG_ESP_TLS_SERVER_SESSION_TICKETS
  477. if (cfg->ticket_ctx) {
  478. ESP_LOGD(TAG, "Enabling server-side tls session ticket support");
  479. mbedtls_ssl_conf_session_tickets_cb( &tls->conf,
  480. esp_mbedtls_server_session_ticket_write,
  481. esp_mbedtls_server_session_ticket_parse,
  482. &cfg->ticket_ctx->ticket_ctx );
  483. }
  484. #endif
  485. return ESP_OK;
  486. }
  487. #endif /* ! CONFIG_ESP_TLS_SERVER */
  488. esp_err_t set_client_config(const char *hostname, size_t hostlen, esp_tls_cfg_t *cfg, esp_tls_t *tls)
  489. {
  490. assert(cfg != NULL);
  491. assert(tls != NULL);
  492. int ret;
  493. if (!cfg->skip_common_name) {
  494. char *use_host = NULL;
  495. if (cfg->common_name != NULL) {
  496. use_host = strndup(cfg->common_name, strlen(cfg->common_name));
  497. } else {
  498. use_host = strndup(hostname, hostlen);
  499. }
  500. if (use_host == NULL) {
  501. return ESP_ERR_NO_MEM;
  502. }
  503. /* Hostname set here should match CN in server certificate */
  504. if ((ret = mbedtls_ssl_set_hostname(&tls->ssl, use_host)) != 0) {
  505. ESP_LOGE(TAG, "mbedtls_ssl_set_hostname returned -0x%04X", -ret);
  506. mbedtls_print_error_msg(ret);
  507. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  508. free(use_host);
  509. return ESP_ERR_MBEDTLS_SSL_SET_HOSTNAME_FAILED;
  510. }
  511. free(use_host);
  512. }
  513. if ((ret = mbedtls_ssl_config_defaults(&tls->conf,
  514. MBEDTLS_SSL_IS_CLIENT,
  515. MBEDTLS_SSL_TRANSPORT_STREAM,
  516. MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {
  517. ESP_LOGE(TAG, "mbedtls_ssl_config_defaults returned -0x%04X", -ret);
  518. mbedtls_print_error_msg(ret);
  519. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  520. return ESP_ERR_MBEDTLS_SSL_CONFIG_DEFAULTS_FAILED;
  521. }
  522. #ifdef CONFIG_MBEDTLS_SSL_RENEGOTIATION
  523. mbedtls_ssl_conf_renegotiation(&tls->conf, MBEDTLS_SSL_RENEGOTIATION_ENABLED);
  524. #endif
  525. if (cfg->alpn_protos) {
  526. #ifdef CONFIG_MBEDTLS_SSL_ALPN
  527. if ((ret = mbedtls_ssl_conf_alpn_protocols(&tls->conf, cfg->alpn_protos)) != 0) {
  528. ESP_LOGE(TAG, "mbedtls_ssl_conf_alpn_protocols returned -0x%04X", -ret);
  529. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  530. mbedtls_print_error_msg(ret);
  531. return ESP_ERR_MBEDTLS_SSL_CONF_ALPN_PROTOCOLS_FAILED;
  532. }
  533. #else
  534. ESP_LOGE(TAG, "alpn_protos configured but not enabled in menuconfig: Please enable MBEDTLS_SSL_ALPN option");
  535. return ESP_ERR_INVALID_STATE;
  536. #endif
  537. }
  538. #ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
  539. ESP_LOGD(TAG, "Enabling client-side tls session ticket support");
  540. mbedtls_ssl_conf_session_tickets(&tls->conf, MBEDTLS_SSL_SESSION_TICKETS_ENABLED);
  541. mbedtls_ssl_conf_renegotiation(&tls->conf, MBEDTLS_SSL_RENEGOTIATION_ENABLED);
  542. #endif /* CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS */
  543. if (cfg->crt_bundle_attach != NULL) {
  544. #ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
  545. ESP_LOGD(TAG, "Use certificate bundle");
  546. mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
  547. cfg->crt_bundle_attach(&tls->conf);
  548. #else //CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
  549. ESP_LOGE(TAG, "use_crt_bundle configured but not enabled in menuconfig: Please enable MBEDTLS_CERTIFICATE_BUNDLE option");
  550. return ESP_ERR_INVALID_STATE;
  551. #endif
  552. } else if (cfg->use_global_ca_store == true) {
  553. esp_err_t esp_ret = set_global_ca_store(tls);
  554. if (esp_ret != ESP_OK) {
  555. return esp_ret;
  556. }
  557. } else if (cfg->cacert_buf != NULL) {
  558. esp_err_t esp_ret = set_ca_cert(tls, cfg->cacert_buf, cfg->cacert_bytes);
  559. if (esp_ret != ESP_OK) {
  560. return esp_ret;
  561. }
  562. mbedtls_ssl_conf_ca_chain(&tls->conf, tls->cacert_ptr, NULL);
  563. } else if (cfg->psk_hint_key) {
  564. #if defined(CONFIG_ESP_TLS_PSK_VERIFICATION)
  565. //
  566. // PSK encryption mode is configured only if no certificate supplied and psk pointer not null
  567. ESP_LOGD(TAG, "ssl psk authentication");
  568. ret = mbedtls_ssl_conf_psk(&tls->conf, cfg->psk_hint_key->key, cfg->psk_hint_key->key_size,
  569. (const unsigned char *)cfg->psk_hint_key->hint, strlen(cfg->psk_hint_key->hint));
  570. if (ret != 0) {
  571. ESP_LOGE(TAG, "mbedtls_ssl_conf_psk returned -0x%04X", -ret);
  572. mbedtls_print_error_msg(ret);
  573. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  574. return ESP_ERR_MBEDTLS_SSL_CONF_PSK_FAILED;
  575. }
  576. #else
  577. ESP_LOGE(TAG, "psk_hint_key configured but not enabled in menuconfig: Please enable ESP_TLS_PSK_VERIFICATION option");
  578. return ESP_ERR_INVALID_STATE;
  579. #endif
  580. #ifdef CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS
  581. } else if (cfg->client_session != NULL) {
  582. ESP_LOGD(TAG, "Resuing the saved client session");
  583. #endif
  584. } else {
  585. #ifdef CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY
  586. mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_NONE);
  587. #else
  588. ESP_LOGE(TAG, "No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference");
  589. return ESP_ERR_MBEDTLS_SSL_SETUP_FAILED;
  590. #endif
  591. }
  592. if (cfg->use_secure_element) {
  593. #ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT
  594. ret = esp_set_atecc608a_pki_context(tls, (esp_tls_cfg_t *)cfg);
  595. if (ret != ESP_OK) {
  596. return ret;
  597. }
  598. #else
  599. ESP_LOGE(TAG, "Please enable secure element support for ESP-TLS in menuconfig");
  600. return ESP_FAIL;
  601. #endif /* CONFIG_ESP_TLS_USE_SECURE_ELEMENT */
  602. } else if (cfg->ds_data != NULL) {
  603. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  604. if (cfg->clientcert_pem_buf == NULL) {
  605. ESP_LOGE(TAG, "Client certificate is also required with the DS parameters");
  606. return ESP_ERR_INVALID_STATE;
  607. }
  608. esp_ds_set_session_timeout(cfg->timeout_ms);
  609. /* set private key pointer to NULL since the DS peripheral with its own configuration data is used */
  610. esp_tls_pki_t pki = {
  611. .public_cert = &tls->clientcert,
  612. .pk_key = &tls->clientkey,
  613. .publiccert_pem_buf = cfg->clientcert_buf,
  614. .publiccert_pem_bytes = cfg->clientcert_bytes,
  615. .privkey_pem_buf = NULL,
  616. .privkey_pem_bytes = 0,
  617. .privkey_password = NULL,
  618. .privkey_password_len = 0,
  619. .esp_ds_data = cfg->ds_data,
  620. };
  621. esp_err_t esp_ret = set_pki_context(tls, &pki);
  622. if (esp_ret != ESP_OK) {
  623. ESP_LOGE(TAG, "Failed to set client pki context for the DS peripheral, returned [0x%04X] (%s)", ret, esp_err_to_name(esp_ret));
  624. return esp_ret;
  625. }
  626. #else
  627. ESP_LOGE(TAG, "Please enable the DS peripheral support for the ESP-TLS in menuconfig. (only supported for the ESP32-S2 chip)");
  628. return ESP_FAIL;
  629. #endif
  630. } else if (cfg->clientcert_pem_buf != NULL && cfg->clientkey_pem_buf != NULL) {
  631. esp_tls_pki_t pki = {
  632. .public_cert = &tls->clientcert,
  633. .pk_key = &tls->clientkey,
  634. .publiccert_pem_buf = cfg->clientcert_buf,
  635. .publiccert_pem_bytes = cfg->clientcert_bytes,
  636. .privkey_pem_buf = cfg->clientkey_buf,
  637. .privkey_pem_bytes = cfg->clientkey_bytes,
  638. .privkey_password = cfg->clientkey_password,
  639. .privkey_password_len = cfg->clientkey_password_len,
  640. };
  641. esp_err_t esp_ret = set_pki_context(tls, &pki);
  642. if (esp_ret != ESP_OK) {
  643. ESP_LOGE(TAG, "Failed to set client pki context");
  644. return esp_ret;
  645. }
  646. } else if (cfg->clientcert_buf != NULL || cfg->clientkey_buf != NULL) {
  647. ESP_LOGE(TAG, "You have to provide both clientcert_buf and clientkey_buf for mutual authentication");
  648. return ESP_ERR_INVALID_STATE;
  649. }
  650. return ESP_OK;
  651. }
  652. #ifdef CONFIG_ESP_TLS_SERVER
  653. /**
  654. * @brief Create TLS/SSL server session
  655. */
  656. int esp_mbedtls_server_session_create(esp_tls_cfg_server_t *cfg, int sockfd, esp_tls_t *tls)
  657. {
  658. if (tls == NULL || cfg == NULL) {
  659. return -1;
  660. }
  661. tls->role = ESP_TLS_SERVER;
  662. tls->sockfd = sockfd;
  663. esp_err_t esp_ret = esp_create_mbedtls_handle(NULL, 0, cfg, tls);
  664. if (esp_ret != ESP_OK) {
  665. ESP_LOGE(TAG, "create_ssl_handle failed, returned [0x%04X] (%s)", esp_ret, esp_err_to_name(esp_ret));
  666. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_ESP, esp_ret);
  667. tls->conn_state = ESP_TLS_FAIL;
  668. return -1;
  669. }
  670. tls->read = esp_mbedtls_read;
  671. tls->write = esp_mbedtls_write;
  672. int ret;
  673. while ((ret = mbedtls_ssl_handshake(&tls->ssl)) != 0) {
  674. if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
  675. ESP_LOGE(TAG, "mbedtls_ssl_handshake returned -0x%04X", -ret);
  676. mbedtls_print_error_msg(ret);
  677. tls->conn_state = ESP_TLS_FAIL;
  678. return ret;
  679. }
  680. }
  681. return 0;
  682. }
  683. /**
  684. * @brief Close the server side TLS/SSL connection and free any allocated resources.
  685. */
  686. void esp_mbedtls_server_session_delete(esp_tls_t *tls)
  687. {
  688. if (tls != NULL) {
  689. esp_mbedtls_cleanup(tls);
  690. esp_tls_internal_event_tracker_destroy(tls->error_handle);
  691. free(tls);
  692. }
  693. };
  694. #endif /* ! CONFIG_ESP_TLS_SERVER */
  695. esp_err_t esp_mbedtls_init_global_ca_store(void)
  696. {
  697. if (global_cacert == NULL) {
  698. global_cacert = (mbedtls_x509_crt *)calloc(1, sizeof(mbedtls_x509_crt));
  699. if (global_cacert == NULL) {
  700. ESP_LOGE(TAG, "global_cacert not allocated");
  701. return ESP_ERR_NO_MEM;
  702. }
  703. mbedtls_x509_crt_init(global_cacert);
  704. }
  705. return ESP_OK;
  706. }
  707. esp_err_t esp_mbedtls_set_global_ca_store(const unsigned char *cacert_pem_buf, const unsigned int cacert_pem_bytes)
  708. {
  709. #ifdef CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT
  710. ESP_LOGE(TAG, "Please disable dynamic freeing of ca cert in mbedtls (CONFIG_MBEDTLS_DYNAMIC_FREE_CA_CERT)\n in order to use the global ca_store");
  711. return ESP_FAIL;
  712. #endif
  713. if (cacert_pem_buf == NULL) {
  714. ESP_LOGE(TAG, "cacert_pem_buf is null");
  715. return ESP_ERR_INVALID_ARG;
  716. }
  717. int ret;
  718. if (global_cacert == NULL) {
  719. ret = esp_mbedtls_init_global_ca_store();
  720. if (ret != ESP_OK) {
  721. return ret;
  722. }
  723. }
  724. ret = mbedtls_x509_crt_parse(global_cacert, cacert_pem_buf, cacert_pem_bytes);
  725. if (ret < 0) {
  726. ESP_LOGE(TAG, "mbedtls_x509_crt_parse returned -0x%04X", -ret);
  727. mbedtls_print_error_msg(ret);
  728. mbedtls_x509_crt_free(global_cacert);
  729. free(global_cacert);
  730. global_cacert = NULL;
  731. return ESP_FAIL;
  732. } else if (ret > 0) {
  733. ESP_LOGE(TAG, "mbedtls_x509_crt_parse was partly successful. No. of failed certificates: %d", ret);
  734. return ESP_ERR_MBEDTLS_CERT_PARTLY_OK;
  735. }
  736. return ESP_OK;
  737. }
  738. mbedtls_x509_crt *esp_mbedtls_get_global_ca_store(void)
  739. {
  740. return global_cacert;
  741. }
  742. void esp_mbedtls_free_global_ca_store(void)
  743. {
  744. if (global_cacert) {
  745. mbedtls_x509_crt_free(global_cacert);
  746. free(global_cacert);
  747. global_cacert = NULL;
  748. }
  749. }
  750. #ifdef CONFIG_ESP_TLS_USE_SECURE_ELEMENT
  751. static esp_err_t esp_init_atecc608a(uint8_t i2c_addr)
  752. {
  753. cfg_ateccx08a_i2c_default.atcai2c.address = i2c_addr;
  754. int ret = atcab_init(&cfg_ateccx08a_i2c_default);
  755. if(ret != 0) {
  756. ESP_LOGE(TAG, "Failed to initialize atca device, returned -0x%04X", -ret);
  757. return ESP_FAIL;
  758. }
  759. return ESP_OK;
  760. }
  761. static esp_err_t esp_set_atecc608a_pki_context(esp_tls_t *tls, esp_tls_cfg_t *cfg)
  762. {
  763. int ret = 0;
  764. esp_err_t esp_ret = ESP_FAIL;
  765. ESP_LOGI(TAG, "Initialize the ATECC interface...");
  766. (void)esp_ret;
  767. (void)cert_def;
  768. #if defined(CONFIG_ATECC608A_TNG) || defined(CONFIG_ATECC608A_TFLEX)
  769. #ifdef CONFIG_ATECC608A_TNG
  770. esp_ret = esp_init_atecc608a(ATECC608A_TNG_SLAVE_ADDR);
  771. if (ret != ESP_OK) {
  772. return ESP_ERR_ESP_TLS_SE_FAILED;
  773. }
  774. #elif CONFIG_ATECC608A_TFLEX /* CONFIG_ATECC608A_TNG */
  775. esp_ret = esp_init_atecc608a(ATECC608A_TFLEX_SLAVE_ADDR);
  776. if (ret != ESP_OK) {
  777. return ESP_ERR_ESP_TLS_SE_FAILED;
  778. }
  779. #endif /* CONFIG_ATECC608A_TFLEX */
  780. mbedtls_x509_crt_init(&tls->clientcert);
  781. ret = tng_get_device_cert_def(&cert_def);
  782. if (ret != 0) {
  783. ESP_LOGE(TAG, "Failed to get device cert def");
  784. return ESP_ERR_ESP_TLS_SE_FAILED;
  785. }
  786. /* Extract the device certificate and convert to mbedtls cert */
  787. ret = atca_mbedtls_cert_add(&tls->clientcert, cert_def);
  788. if (ret != 0) {
  789. ESP_LOGE(TAG, "Failed to parse cert from device, return 0x%04X", ret);
  790. mbedtls_print_error_msg(ret);
  791. return ESP_ERR_ESP_TLS_SE_FAILED;
  792. }
  793. #elif CONFIG_ATECC608A_TCUSTOM
  794. esp_ret = esp_init_atecc608a(ATECC608A_TCUSTOM_SLAVE_ADDR);
  795. if (ret != ESP_OK) {
  796. return ESP_ERR_ESP_TLS_SE_FAILED;
  797. }
  798. mbedtls_x509_crt_init(&tls->clientcert);
  799. if(cfg->clientcert_buf != NULL) {
  800. ret = mbedtls_x509_crt_parse(&tls->clientcert, (const unsigned char*)cfg->clientcert_buf, cfg->clientcert_bytes);
  801. if (ret < 0) {
  802. ESP_LOGE(TAG, "mbedtls_x509_crt_parse returned -0x%04X", -ret);
  803. mbedtls_print_error_msg(ret);
  804. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  805. return ESP_ERR_MBEDTLS_X509_CRT_PARSE_FAILED;
  806. }
  807. } else {
  808. ESP_LOGE(TAG, "Device certificate must be provided for TrustCustom Certs");
  809. return ESP_FAIL;
  810. }
  811. #endif /* CONFIG_ATECC608A_TCUSTOM */
  812. ret = atca_mbedtls_pk_init(&tls->clientkey, 0);
  813. if (ret != 0) {
  814. ESP_LOGE(TAG, "Failed to parse key from device");
  815. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  816. mbedtls_print_error_msg(ret);
  817. return ESP_ERR_ESP_TLS_SE_FAILED;
  818. }
  819. ret = mbedtls_ssl_conf_own_cert(&tls->conf, &tls->clientcert, &tls->clientkey);
  820. if (ret != 0) {
  821. ESP_LOGE(TAG, "Failed to configure client cert, returned -0x%04X", ret);
  822. mbedtls_print_error_msg(ret);
  823. ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_MBEDTLS, -ret);
  824. return ESP_ERR_ESP_TLS_SE_FAILED;
  825. }
  826. return ESP_OK;
  827. }
  828. #endif /* CONFIG_ESP_TLS_USE_SECURE_ELEMENT */
  829. #ifdef CONFIG_ESP_TLS_USE_DS_PERIPHERAL
  830. static esp_err_t esp_mbedtls_init_pk_ctx_for_ds(const void *pki)
  831. {
  832. int ret = -1;
  833. /* initialize the mbedtls pk context with rsa context */
  834. mbedtls_rsa_context rsakey;
  835. mbedtls_rsa_init(&rsakey, MBEDTLS_RSA_PKCS_V15, 0);
  836. if ((ret = mbedtls_pk_setup_rsa_alt(((const esp_tls_pki_t*)pki)->pk_key, &rsakey, NULL, esp_ds_rsa_sign,
  837. esp_ds_get_keylen )) != 0) {
  838. ESP_LOGE(TAG, "Error in mbedtls_pk_setup_rsa_alt, returned -0x%04X", -ret);
  839. mbedtls_print_error_msg(ret);
  840. return ESP_FAIL;
  841. }
  842. ret = esp_ds_init_data_ctx(((const esp_tls_pki_t*)pki)->esp_ds_data);
  843. if (ret != ESP_OK) {
  844. ESP_LOGE(TAG, "Failed to initialize DS parameters from nvs");
  845. return ESP_FAIL;
  846. }
  847. ESP_LOGD(TAG, "DS peripheral params initialized.");
  848. return ESP_OK;
  849. }
  850. #endif /* CONFIG_ESP_TLS_USE_DS_PERIPHERAL */