blob: 8c7dcfa2dfa4b2e40fdeb5be18bf5c211935bcf3 [file] [log] [blame]
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +01001/*
2 * Minimal SSL client, used for memory measurements.
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +01003 * (meant to be used with config-suite-b.h or config-ccm-psk-tls1_2.h)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +01004 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02005 * Copyright The Mbed TLS Contributors
Dave Rodgman7ff79652023-11-03 12:04:52 +00006 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +01007 */
8
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000010#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010011#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020012#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010013#endif
14
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010015#include "mbedtls/platform.h"
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010016
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010017/*
18 * We're creating and connecting the socket "manually" rather than using the
19 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
20 * dominate memory usage in small configurations. For the sake of simplicity,
21 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020022 *
Shaun Case0e7791f2021-12-20 21:14:10 -080023 * Warning: we are breaking some of the abstractions from the NET layer here.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020024 * This is not a good example for general use. This programs has the specific
25 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010026 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010027#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010028#define UNIX
29#endif
30
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
32 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010033 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010034
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010035int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010036{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010037 mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
38 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
39 "not defined.\n");
40 mbedtls_exit(0);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010041}
42#else
43
44#include <string.h>
45
Andres AG788aa4a2016-09-14 14:32:09 +010046#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000047#include "mbedtls/ssl.h"
48#include "mbedtls/entropy.h"
49#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010050
51#include <sys/socket.h>
52#include <netinet/in.h>
53#include <arpa/inet.h>
54
55/*
56 * Hardcoded values for server host and port
57 */
58#define PORT_BE 0x1151 /* 4433 */
59#define PORT_LE 0x5111
60#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
61#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010062#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010063
64#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
65
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010066const char *pers = "mini_client";
67
Gilles Peskineeccd8882020-03-10 12:19:08 +010068#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010069const unsigned char psk[] = {
70 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
71 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
72};
73const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010074#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010075
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010077/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
78const unsigned char ca_cert[] = {
79 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
80 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
81 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
82 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
83 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
84 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
85 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
86 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
87 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
88 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
89 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
90 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
91 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
92 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
93 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
94 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
95 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
96 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
97 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
98 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
99 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
100 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
101 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
102 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
103 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
104 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
105 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
106 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
107 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
108 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
109 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
110 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
111 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
112 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
113 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
114 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
115 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
116 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
117 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
118 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
119 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
120 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
121 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
122 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
123 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
124 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
125 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
126 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
127 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
128 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
129};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200130#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100131
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100132enum exit_codes {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100133 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200134 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200135 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200136 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100137 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100138 socket_failed,
139 connect_failed,
140 x509_crt_parse_failed,
141 ssl_handshake_failed,
142 ssl_write_failed,
143};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100144
Simon Butcher63cb97e2018-12-06 17:43:31 +0000145
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100146int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100147{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100148 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200149 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100150 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200151#if defined(MBEDTLS_X509_CRT_PARSE_C)
152 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100153#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155 mbedtls_entropy_context entropy;
156 mbedtls_ctr_drbg_context ctr_drbg;
157 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200158 mbedtls_ssl_config conf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100159 mbedtls_ctr_drbg_init(&ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100160
Przemek Stekielb00688f2023-04-17 11:10:05 +0200161 /*
162 * 0. Initialize and setup stuff
163 */
164 mbedtls_net_init(&server_fd);
165 mbedtls_ssl_init(&ssl);
166 mbedtls_ssl_config_init(&conf);
167#if defined(MBEDTLS_X509_CRT_PARSE_C)
168 mbedtls_x509_crt_init(&ca);
169#endif
170 mbedtls_entropy_init(&entropy);
171
Przemek Stekield381d2d2023-04-14 09:26:39 +0200172#if defined(MBEDTLS_USE_PSA_CRYPTO)
173 psa_status_t status = psa_crypto_init();
174 if (status != PSA_SUCCESS) {
Przemek Stekield381d2d2023-04-14 09:26:39 +0200175 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
176 goto exit;
177 }
178#endif /* MBEDTLS_USE_PSA_CRYPTO */
179
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100180 if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
181 (const unsigned char *) pers, strlen(pers)) != 0) {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200182 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100183 goto exit;
184 }
185
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100186 if (mbedtls_ssl_config_defaults(&conf,
187 MBEDTLS_SSL_IS_CLIENT,
188 MBEDTLS_SSL_TRANSPORT_STREAM,
189 MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200190 ret = ssl_config_defaults_failed;
191 goto exit;
192 }
193
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100194 mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100195
Gilles Peskineeccd8882020-03-10 12:19:08 +0100196#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100197 mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk),
198 (const unsigned char *) psk_id, sizeof(psk_id) - 1);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100199#endif
200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100202 if (mbedtls_x509_crt_parse_der(&ca, ca_cert, sizeof(ca_cert)) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100203 ret = x509_crt_parse_failed;
204 goto exit;
205 }
206
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100207 mbedtls_ssl_conf_ca_chain(&conf, &ca, NULL);
208 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200209#endif
210
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100211 if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200212 ret = ssl_setup_failed;
213 goto exit;
214 }
215
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200216#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100217 if (mbedtls_ssl_set_hostname(&ssl, HOSTNAME) != 0) {
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100218 ret = hostname_failed;
219 goto exit;
220 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200221#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100222
223 /*
224 * 1. Start the connection
225 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100226 memset(&addr, 0, sizeof(addr));
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100227 addr.sin_family = AF_INET;
228
229 ret = 1; /* for endianness detection */
230 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
231 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
232 ret = 0;
233
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100234 if ((server_fd.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100235 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100236 goto exit;
237 }
238
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100239 if (connect(server_fd.fd,
240 (const struct sockaddr *) &addr, sizeof(addr)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100241 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100242 goto exit;
243 }
244
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100245 mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100246
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100247 if (mbedtls_ssl_handshake(&ssl) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100248 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100249 goto exit;
250 }
251
252 /*
253 * 2. Write the GET request and close the connection
254 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100255 if (mbedtls_ssl_write(&ssl, (const unsigned char *) GET_REQUEST,
256 sizeof(GET_REQUEST) - 1) <= 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100257 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100258 goto exit;
259 }
260
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100261 mbedtls_ssl_close_notify(&ssl);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100262
263exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100264 mbedtls_net_free(&server_fd);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100265 mbedtls_ssl_free(&ssl);
266 mbedtls_ssl_config_free(&conf);
267 mbedtls_ctr_drbg_free(&ctr_drbg);
268 mbedtls_entropy_free(&entropy);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100270 mbedtls_x509_crt_free(&ca);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100271#endif
Przemek Stekield4d049b2023-04-19 13:47:43 +0200272#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemek Stekielc4ddf922023-04-19 10:15:26 +0200273 mbedtls_psa_crypto_free();
Przemek Stekield4d049b2023-04-19 13:47:43 +0200274#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100275
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100276 mbedtls_exit(ret);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100277}
278#endif