blob: 27154d8f828d446f10aff4967d186bbca0517a95 [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02006 * SPDX-License-Identifier: Apache-2.0
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License"); you may
9 * not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010019 */
20
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020021#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000022#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010023#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010025#endif
26
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010027#include "mbedtls/platform.h"
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010028
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010029/*
30 * We're creating and connecting the socket "manually" rather than using the
31 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
32 * dominate memory usage in small configurations. For the sake of simplicity,
33 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020034 *
Shaun Case0e7791f2021-12-20 21:14:10 -080035 * Warning: we are breaking some of the abstractions from the NET layer here.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020036 * This is not a good example for general use. This programs has the specific
37 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010038 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010039#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010040#define UNIX
41#endif
42
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020043#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
44 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010045 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010046
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010047int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010048{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
50 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
51 "not defined.\n");
52 mbedtls_exit(0);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010053}
54#else
55
56#include <string.h>
57
Andres AG788aa4a2016-09-14 14:32:09 +010058#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000059#include "mbedtls/ssl.h"
60#include "mbedtls/entropy.h"
61#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010062
63#include <sys/socket.h>
64#include <netinet/in.h>
65#include <arpa/inet.h>
66
67/*
68 * Hardcoded values for server host and port
69 */
70#define PORT_BE 0x1151 /* 4433 */
71#define PORT_LE 0x5111
72#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
73#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010074#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010075
76#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
77
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010078const char *pers = "mini_client";
79
Gilles Peskineeccd8882020-03-10 12:19:08 +010080#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010081const unsigned char psk[] = {
82 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
83 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
84};
85const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010086#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010087
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010089/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
90const unsigned char ca_cert[] = {
91 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
92 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
93 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
94 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
95 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
96 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
97 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
98 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
99 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
100 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
101 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
102 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
103 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
104 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
105 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
106 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
107 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
108 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
109 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
110 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
111 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
112 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
113 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
114 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
115 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
116 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
117 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
118 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
119 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
120 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
121 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
122 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
123 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
124 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
125 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
126 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
127 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
128 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
129 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
130 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
131 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
132 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
133 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
134 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
135 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
136 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
137 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
138 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
139 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
140 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
141};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200142#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100143
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100144enum exit_codes {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100145 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200146 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200147 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200148 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100149 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100150 socket_failed,
151 connect_failed,
152 x509_crt_parse_failed,
153 ssl_handshake_failed,
154 ssl_write_failed,
155};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100156
Simon Butcher63cb97e2018-12-06 17:43:31 +0000157
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100158int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100159{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100160 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200161 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100162 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163#if defined(MBEDTLS_X509_CRT_PARSE_C)
164 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100165#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100166
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200167 mbedtls_entropy_context entropy;
168 mbedtls_ctr_drbg_context ctr_drbg;
169 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200170 mbedtls_ssl_config conf;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100171 mbedtls_ctr_drbg_init(&ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100172
Przemek Stekielb00688f2023-04-17 11:10:05 +0200173 /*
174 * 0. Initialize and setup stuff
175 */
176 mbedtls_net_init(&server_fd);
177 mbedtls_ssl_init(&ssl);
178 mbedtls_ssl_config_init(&conf);
179#if defined(MBEDTLS_X509_CRT_PARSE_C)
180 mbedtls_x509_crt_init(&ca);
181#endif
182 mbedtls_entropy_init(&entropy);
183
Przemek Stekield381d2d2023-04-14 09:26:39 +0200184#if defined(MBEDTLS_USE_PSA_CRYPTO)
185 psa_status_t status = psa_crypto_init();
186 if (status != PSA_SUCCESS) {
Przemek Stekield381d2d2023-04-14 09:26:39 +0200187 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
188 goto exit;
189 }
190#endif /* MBEDTLS_USE_PSA_CRYPTO */
191
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100192 if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
193 (const unsigned char *) pers, strlen(pers)) != 0) {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200194 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100195 goto exit;
196 }
197
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100198 if (mbedtls_ssl_config_defaults(&conf,
199 MBEDTLS_SSL_IS_CLIENT,
200 MBEDTLS_SSL_TRANSPORT_STREAM,
201 MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200202 ret = ssl_config_defaults_failed;
203 goto exit;
204 }
205
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100206 mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100207
Gilles Peskineeccd8882020-03-10 12:19:08 +0100208#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100209 mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk),
210 (const unsigned char *) psk_id, sizeof(psk_id) - 1);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100211#endif
212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100214 if (mbedtls_x509_crt_parse_der(&ca, ca_cert, sizeof(ca_cert)) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100215 ret = x509_crt_parse_failed;
216 goto exit;
217 }
218
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100219 mbedtls_ssl_conf_ca_chain(&conf, &ca, NULL);
220 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200221#endif
222
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100223 if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200224 ret = ssl_setup_failed;
225 goto exit;
226 }
227
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200228#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100229 if (mbedtls_ssl_set_hostname(&ssl, HOSTNAME) != 0) {
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100230 ret = hostname_failed;
231 goto exit;
232 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200233#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100234
235 /*
236 * 1. Start the connection
237 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100238 memset(&addr, 0, sizeof(addr));
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100239 addr.sin_family = AF_INET;
240
241 ret = 1; /* for endianness detection */
242 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
243 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
244 ret = 0;
245
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100246 if ((server_fd.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100247 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100248 goto exit;
249 }
250
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100251 if (connect(server_fd.fd,
252 (const struct sockaddr *) &addr, sizeof(addr)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100253 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100254 goto exit;
255 }
256
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100257 mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100258
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100259 if (mbedtls_ssl_handshake(&ssl) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100260 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100261 goto exit;
262 }
263
264 /*
265 * 2. Write the GET request and close the connection
266 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100267 if (mbedtls_ssl_write(&ssl, (const unsigned char *) GET_REQUEST,
268 sizeof(GET_REQUEST) - 1) <= 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100269 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100270 goto exit;
271 }
272
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100273 mbedtls_ssl_close_notify(&ssl);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100274
275exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100276 mbedtls_net_free(&server_fd);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100277 mbedtls_ssl_free(&ssl);
278 mbedtls_ssl_config_free(&conf);
279 mbedtls_ctr_drbg_free(&ctr_drbg);
280 mbedtls_entropy_free(&entropy);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100282 mbedtls_x509_crt_free(&ca);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100283#endif
Przemek Stekield4d049b2023-04-19 13:47:43 +0200284#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemek Stekielc4ddf922023-04-19 10:15:26 +0200285 mbedtls_psa_crypto_free();
Przemek Stekield4d049b2023-04-19 13:47:43 +0200286#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100287
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100288 mbedtls_exit(ret);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100289}
290#endif