1a8e1175bSopenharmony_ci/* 2a8e1175bSopenharmony_ci * Minimal SSL client, used for memory measurements. 3a8e1175bSopenharmony_ci * (meant to be used with config-suite-b.h or config-ccm-psk-tls1_2.h) 4a8e1175bSopenharmony_ci * 5a8e1175bSopenharmony_ci * Copyright The Mbed TLS Contributors 6a8e1175bSopenharmony_ci * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 7a8e1175bSopenharmony_ci */ 8a8e1175bSopenharmony_ci 9a8e1175bSopenharmony_ci#include "mbedtls/build_info.h" 10a8e1175bSopenharmony_ci 11a8e1175bSopenharmony_ci#include "mbedtls/platform.h" 12a8e1175bSopenharmony_ci 13a8e1175bSopenharmony_ci/* 14a8e1175bSopenharmony_ci * We're creating and connecting the socket "manually" rather than using the 15a8e1175bSopenharmony_ci * NET module, in order to avoid the overhead of getaddrinfo() which tends to 16a8e1175bSopenharmony_ci * dominate memory usage in small configurations. For the sake of simplicity, 17a8e1175bSopenharmony_ci * only a Unix version is implemented. 18a8e1175bSopenharmony_ci * 19a8e1175bSopenharmony_ci * Warning: we are breaking some of the abstractions from the NET layer here. 20a8e1175bSopenharmony_ci * This is not a good example for general use. This programs has the specific 21a8e1175bSopenharmony_ci * goal of minimizing use of the libc functions on full-blown OSes. 22a8e1175bSopenharmony_ci */ 23a8e1175bSopenharmony_ci#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__) 24a8e1175bSopenharmony_ci#define UNIX 25a8e1175bSopenharmony_ci#endif 26a8e1175bSopenharmony_ci 27a8e1175bSopenharmony_ci#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \ 28a8e1175bSopenharmony_ci !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \ 29a8e1175bSopenharmony_ci !defined(UNIX) 30a8e1175bSopenharmony_ci 31a8e1175bSopenharmony_ciint main(void) 32a8e1175bSopenharmony_ci{ 33a8e1175bSopenharmony_ci mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or " 34a8e1175bSopenharmony_ci "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX " 35a8e1175bSopenharmony_ci "not defined.\n"); 36a8e1175bSopenharmony_ci mbedtls_exit(0); 37a8e1175bSopenharmony_ci} 38a8e1175bSopenharmony_ci#else 39a8e1175bSopenharmony_ci 40a8e1175bSopenharmony_ci#include <string.h> 41a8e1175bSopenharmony_ci 42a8e1175bSopenharmony_ci#include "mbedtls/net_sockets.h" 43a8e1175bSopenharmony_ci#include "mbedtls/ssl.h" 44a8e1175bSopenharmony_ci#include "mbedtls/entropy.h" 45a8e1175bSopenharmony_ci#include "mbedtls/ctr_drbg.h" 46a8e1175bSopenharmony_ci 47a8e1175bSopenharmony_ci#include <sys/socket.h> 48a8e1175bSopenharmony_ci#include <netinet/in.h> 49a8e1175bSopenharmony_ci#include <arpa/inet.h> 50a8e1175bSopenharmony_ci 51a8e1175bSopenharmony_ci/* 52a8e1175bSopenharmony_ci * Hardcoded values for server host and port 53a8e1175bSopenharmony_ci */ 54a8e1175bSopenharmony_ci#define PORT_BE 0x1151 /* 4433 */ 55a8e1175bSopenharmony_ci#define PORT_LE 0x5111 56a8e1175bSopenharmony_ci#define ADDR_BE 0x7f000001 /* 127.0.0.1 */ 57a8e1175bSopenharmony_ci#define ADDR_LE 0x0100007f 58a8e1175bSopenharmony_ci#define HOSTNAME "localhost" /* for cert verification if enabled */ 59a8e1175bSopenharmony_ci 60a8e1175bSopenharmony_ci#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n" 61a8e1175bSopenharmony_ci 62a8e1175bSopenharmony_ciconst char *pers = "mini_client"; 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_ci#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) 65a8e1175bSopenharmony_ciconst unsigned char psk[] = { 66a8e1175bSopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 67a8e1175bSopenharmony_ci 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f 68a8e1175bSopenharmony_ci}; 69a8e1175bSopenharmony_ciconst char psk_id[] = "Client_identity"; 70a8e1175bSopenharmony_ci#endif 71a8e1175bSopenharmony_ci 72a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 73a8e1175bSopenharmony_ci/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */ 74a8e1175bSopenharmony_ciconst unsigned char ca_cert[] = { 75a8e1175bSopenharmony_ci 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01, 76a8e1175bSopenharmony_ci 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 77a8e1175bSopenharmony_ci 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 78a8e1175bSopenharmony_ci 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 79a8e1175bSopenharmony_ci 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 80a8e1175bSopenharmony_ci 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 81a8e1175bSopenharmony_ci 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 82a8e1175bSopenharmony_ci 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 83a8e1175bSopenharmony_ci 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39, 84a8e1175bSopenharmony_ci 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32, 85a8e1175bSopenharmony_ci 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 86a8e1175bSopenharmony_ci 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 87a8e1175bSopenharmony_ci 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 88a8e1175bSopenharmony_ci 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 89a8e1175bSopenharmony_ci 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 90a8e1175bSopenharmony_ci 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 91a8e1175bSopenharmony_ci 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 92a8e1175bSopenharmony_ci 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22, 93a8e1175bSopenharmony_ci 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f, 94a8e1175bSopenharmony_ci 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e, 95a8e1175bSopenharmony_ci 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95, 96a8e1175bSopenharmony_ci 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95, 97a8e1175bSopenharmony_ci 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a, 98a8e1175bSopenharmony_ci 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2, 99a8e1175bSopenharmony_ci 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47, 100a8e1175bSopenharmony_ci 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66, 101a8e1175bSopenharmony_ci 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d, 102a8e1175bSopenharmony_ci 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20, 103a8e1175bSopenharmony_ci 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 104a8e1175bSopenharmony_ci 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23, 105a8e1175bSopenharmony_ci 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01, 106a8e1175bSopenharmony_ci 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb, 107a8e1175bSopenharmony_ci 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 108a8e1175bSopenharmony_ci 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 109a8e1175bSopenharmony_ci 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 110a8e1175bSopenharmony_ci 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 111a8e1175bSopenharmony_ci 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 112a8e1175bSopenharmony_ci 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09, 113a8e1175bSopenharmony_ci 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06, 114a8e1175bSopenharmony_ci 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 115a8e1175bSopenharmony_ci 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 116a8e1175bSopenharmony_ci 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56, 117a8e1175bSopenharmony_ci 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8, 118a8e1175bSopenharmony_ci 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a, 119a8e1175bSopenharmony_ci 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67, 120a8e1175bSopenharmony_ci 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67, 121a8e1175bSopenharmony_ci 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6, 122a8e1175bSopenharmony_ci 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f, 123a8e1175bSopenharmony_ci 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c, 124a8e1175bSopenharmony_ci 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20, 125a8e1175bSopenharmony_ci}; 126a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_CRT_PARSE_C */ 127a8e1175bSopenharmony_ci 128a8e1175bSopenharmony_cienum exit_codes { 129a8e1175bSopenharmony_ci exit_ok = 0, 130a8e1175bSopenharmony_ci ctr_drbg_seed_failed, 131a8e1175bSopenharmony_ci ssl_config_defaults_failed, 132a8e1175bSopenharmony_ci ssl_setup_failed, 133a8e1175bSopenharmony_ci hostname_failed, 134a8e1175bSopenharmony_ci socket_failed, 135a8e1175bSopenharmony_ci connect_failed, 136a8e1175bSopenharmony_ci x509_crt_parse_failed, 137a8e1175bSopenharmony_ci ssl_handshake_failed, 138a8e1175bSopenharmony_ci ssl_write_failed, 139a8e1175bSopenharmony_ci}; 140a8e1175bSopenharmony_ci 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_ciint main(void) 143a8e1175bSopenharmony_ci{ 144a8e1175bSopenharmony_ci int ret = exit_ok; 145a8e1175bSopenharmony_ci mbedtls_net_context server_fd; 146a8e1175bSopenharmony_ci struct sockaddr_in addr; 147a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 148a8e1175bSopenharmony_ci mbedtls_x509_crt ca; 149a8e1175bSopenharmony_ci#endif 150a8e1175bSopenharmony_ci 151a8e1175bSopenharmony_ci mbedtls_entropy_context entropy; 152a8e1175bSopenharmony_ci mbedtls_ctr_drbg_context ctr_drbg; 153a8e1175bSopenharmony_ci mbedtls_ssl_context ssl; 154a8e1175bSopenharmony_ci mbedtls_ssl_config conf; 155a8e1175bSopenharmony_ci mbedtls_ctr_drbg_init(&ctr_drbg); 156a8e1175bSopenharmony_ci 157a8e1175bSopenharmony_ci /* 158a8e1175bSopenharmony_ci * 0. Initialize and setup stuff 159a8e1175bSopenharmony_ci */ 160a8e1175bSopenharmony_ci mbedtls_net_init(&server_fd); 161a8e1175bSopenharmony_ci mbedtls_ssl_init(&ssl); 162a8e1175bSopenharmony_ci mbedtls_ssl_config_init(&conf); 163a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 164a8e1175bSopenharmony_ci mbedtls_x509_crt_init(&ca); 165a8e1175bSopenharmony_ci#endif 166a8e1175bSopenharmony_ci mbedtls_entropy_init(&entropy); 167a8e1175bSopenharmony_ci 168a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 169a8e1175bSopenharmony_ci psa_status_t status = psa_crypto_init(); 170a8e1175bSopenharmony_ci if (status != PSA_SUCCESS) { 171a8e1175bSopenharmony_ci ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED; 172a8e1175bSopenharmony_ci goto exit; 173a8e1175bSopenharmony_ci } 174a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 175a8e1175bSopenharmony_ci 176a8e1175bSopenharmony_ci if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, 177a8e1175bSopenharmony_ci (const unsigned char *) pers, strlen(pers)) != 0) { 178a8e1175bSopenharmony_ci ret = ctr_drbg_seed_failed; 179a8e1175bSopenharmony_ci goto exit; 180a8e1175bSopenharmony_ci } 181a8e1175bSopenharmony_ci 182a8e1175bSopenharmony_ci if (mbedtls_ssl_config_defaults(&conf, 183a8e1175bSopenharmony_ci MBEDTLS_SSL_IS_CLIENT, 184a8e1175bSopenharmony_ci MBEDTLS_SSL_TRANSPORT_STREAM, 185a8e1175bSopenharmony_ci MBEDTLS_SSL_PRESET_DEFAULT) != 0) { 186a8e1175bSopenharmony_ci ret = ssl_config_defaults_failed; 187a8e1175bSopenharmony_ci goto exit; 188a8e1175bSopenharmony_ci } 189a8e1175bSopenharmony_ci 190a8e1175bSopenharmony_ci mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg); 191a8e1175bSopenharmony_ci 192a8e1175bSopenharmony_ci#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED) 193a8e1175bSopenharmony_ci mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk), 194a8e1175bSopenharmony_ci (const unsigned char *) psk_id, sizeof(psk_id) - 1); 195a8e1175bSopenharmony_ci#endif 196a8e1175bSopenharmony_ci 197a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 198a8e1175bSopenharmony_ci if (mbedtls_x509_crt_parse_der(&ca, ca_cert, sizeof(ca_cert)) != 0) { 199a8e1175bSopenharmony_ci ret = x509_crt_parse_failed; 200a8e1175bSopenharmony_ci goto exit; 201a8e1175bSopenharmony_ci } 202a8e1175bSopenharmony_ci 203a8e1175bSopenharmony_ci mbedtls_ssl_conf_ca_chain(&conf, &ca, NULL); 204a8e1175bSopenharmony_ci mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED); 205a8e1175bSopenharmony_ci#endif 206a8e1175bSopenharmony_ci 207a8e1175bSopenharmony_ci if (mbedtls_ssl_setup(&ssl, &conf) != 0) { 208a8e1175bSopenharmony_ci ret = ssl_setup_failed; 209a8e1175bSopenharmony_ci goto exit; 210a8e1175bSopenharmony_ci } 211a8e1175bSopenharmony_ci 212a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 213a8e1175bSopenharmony_ci if (mbedtls_ssl_set_hostname(&ssl, HOSTNAME) != 0) { 214a8e1175bSopenharmony_ci ret = hostname_failed; 215a8e1175bSopenharmony_ci goto exit; 216a8e1175bSopenharmony_ci } 217a8e1175bSopenharmony_ci#endif 218a8e1175bSopenharmony_ci 219a8e1175bSopenharmony_ci /* 220a8e1175bSopenharmony_ci * 1. Start the connection 221a8e1175bSopenharmony_ci */ 222a8e1175bSopenharmony_ci memset(&addr, 0, sizeof(addr)); 223a8e1175bSopenharmony_ci addr.sin_family = AF_INET; 224a8e1175bSopenharmony_ci 225a8e1175bSopenharmony_ci ret = 1; /* for endianness detection */ 226a8e1175bSopenharmony_ci addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE; 227a8e1175bSopenharmony_ci addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE; 228a8e1175bSopenharmony_ci ret = 0; 229a8e1175bSopenharmony_ci 230a8e1175bSopenharmony_ci if ((server_fd.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 231a8e1175bSopenharmony_ci ret = socket_failed; 232a8e1175bSopenharmony_ci goto exit; 233a8e1175bSopenharmony_ci } 234a8e1175bSopenharmony_ci 235a8e1175bSopenharmony_ci if (connect(server_fd.fd, 236a8e1175bSopenharmony_ci (const struct sockaddr *) &addr, sizeof(addr)) < 0) { 237a8e1175bSopenharmony_ci ret = connect_failed; 238a8e1175bSopenharmony_ci goto exit; 239a8e1175bSopenharmony_ci } 240a8e1175bSopenharmony_ci 241a8e1175bSopenharmony_ci mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL); 242a8e1175bSopenharmony_ci 243a8e1175bSopenharmony_ci if (mbedtls_ssl_handshake(&ssl) != 0) { 244a8e1175bSopenharmony_ci ret = ssl_handshake_failed; 245a8e1175bSopenharmony_ci goto exit; 246a8e1175bSopenharmony_ci } 247a8e1175bSopenharmony_ci 248a8e1175bSopenharmony_ci /* 249a8e1175bSopenharmony_ci * 2. Write the GET request and close the connection 250a8e1175bSopenharmony_ci */ 251a8e1175bSopenharmony_ci if (mbedtls_ssl_write(&ssl, (const unsigned char *) GET_REQUEST, 252a8e1175bSopenharmony_ci sizeof(GET_REQUEST) - 1) <= 0) { 253a8e1175bSopenharmony_ci ret = ssl_write_failed; 254a8e1175bSopenharmony_ci goto exit; 255a8e1175bSopenharmony_ci } 256a8e1175bSopenharmony_ci 257a8e1175bSopenharmony_ci mbedtls_ssl_close_notify(&ssl); 258a8e1175bSopenharmony_ci 259a8e1175bSopenharmony_ciexit: 260a8e1175bSopenharmony_ci mbedtls_net_free(&server_fd); 261a8e1175bSopenharmony_ci mbedtls_ssl_free(&ssl); 262a8e1175bSopenharmony_ci mbedtls_ssl_config_free(&conf); 263a8e1175bSopenharmony_ci mbedtls_ctr_drbg_free(&ctr_drbg); 264a8e1175bSopenharmony_ci mbedtls_entropy_free(&entropy); 265a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_CRT_PARSE_C) 266a8e1175bSopenharmony_ci mbedtls_x509_crt_free(&ca); 267a8e1175bSopenharmony_ci#endif 268a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 269a8e1175bSopenharmony_ci mbedtls_psa_crypto_free(); 270a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 271a8e1175bSopenharmony_ci 272a8e1175bSopenharmony_ci mbedtls_exit(ret); 273a8e1175bSopenharmony_ci} 274a8e1175bSopenharmony_ci#endif 275