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