blob: 39d07ab37879f13032a9ab3509ac1451f3afad37 [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 Rodgman16799db2023-11-02 19:47:20 +00006 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +01007 */
8
Felix Conway998760a2025-03-24 11:37:33 +00009#define MBEDTLS_DECLARE_PRIVATE_IDENTIFIERS
10
Bence Szépkútic662b362021-05-27 11:25:03 +020011#include "mbedtls/build_info.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010012
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010013#include "mbedtls/platform.h"
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010014
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010015/*
16 * We're creating and connecting the socket "manually" rather than using the
17 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
18 * dominate memory usage in small configurations. For the sake of simplicity,
19 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020020 *
Shaun Case8b0ecbc2021-12-20 21:14:10 -080021 * Warning: we are breaking some of the abstractions from the NET layer here.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020022 * This is not a good example for general use. This programs has the specific
23 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010024 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010025#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010026#define UNIX
27#endif
28
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
30 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010031 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010032
Gilles Peskine449bd832023-01-11 14:50:10 +010033int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010034{
Gilles Peskine449bd832023-01-11 14:50:10 +010035 mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
36 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
37 "not defined.\n");
38 mbedtls_exit(0);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010039}
40#else
41
42#include <string.h>
43
Andres AG788aa4a2016-09-14 14:32:09 +010044#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/ssl.h"
46#include "mbedtls/entropy.h"
47#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010048
49#include <sys/socket.h>
50#include <netinet/in.h>
51#include <arpa/inet.h>
52
53/*
54 * Hardcoded values for server host and port
55 */
56#define PORT_BE 0x1151 /* 4433 */
57#define PORT_LE 0x5111
58#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
59#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010060#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010061
62#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
63
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010064const char *pers = "mini_client";
65
Gilles Peskineeccd8882020-03-10 12:19:08 +010066#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010067const unsigned char psk[] = {
68 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
69 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
70};
71const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010072#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010073
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074#if defined(MBEDTLS_X509_CRT_PARSE_C)
David Horstmanndcf18dd2024-06-11 17:44:00 +010075/* This is framework/data_files/test-ca2.crt, a CA using EC secp384r1 */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010076const unsigned char ca_cert[] = {
77 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
78 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
79 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
80 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
81 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
82 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
83 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
84 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
85 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
86 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
87 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
88 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
89 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
90 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
91 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
92 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
93 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
94 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
95 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
96 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
97 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
98 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
99 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
100 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
101 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
102 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
103 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
104 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
105 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
106 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
107 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
108 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
109 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
110 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
111 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
112 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
113 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
114 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
115 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
116 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
117 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
118 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
119 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
120 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
121 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
122 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
123 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
124 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
125 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
126 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
127};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200128#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100129
Gilles Peskine449bd832023-01-11 14:50:10 +0100130enum exit_codes {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100131 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200132 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200133 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200134 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100135 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100136 socket_failed,
137 connect_failed,
138 x509_crt_parse_failed,
139 ssl_handshake_failed,
140 ssl_write_failed,
141};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100142
Simon Butcher63cb97e2018-12-06 17:43:31 +0000143
Gilles Peskine449bd832023-01-11 14:50:10 +0100144int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100145{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100146 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200147 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100148 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149#if defined(MBEDTLS_X509_CRT_PARSE_C)
150 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100151#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153 mbedtls_entropy_context entropy;
154 mbedtls_ctr_drbg_context ctr_drbg;
155 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200156 mbedtls_ssl_config conf;
Gilles Peskine449bd832023-01-11 14:50:10 +0100157 mbedtls_ctr_drbg_init(&ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100158
Przemek Stekiela0a1c1e2023-04-17 11:10:05 +0200159 /*
160 * 0. Initialize and setup stuff
161 */
162 mbedtls_net_init(&server_fd);
163 mbedtls_ssl_init(&ssl);
164 mbedtls_ssl_config_init(&conf);
165#if defined(MBEDTLS_X509_CRT_PARSE_C)
166 mbedtls_x509_crt_init(&ca);
167#endif
168 mbedtls_entropy_init(&entropy);
169
Przemek Stekiel89c636e2023-04-14 09:26:39 +0200170 psa_status_t status = psa_crypto_init();
171 if (status != PSA_SUCCESS) {
Przemek Stekiel89c636e2023-04-14 09:26:39 +0200172 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
173 goto exit;
174 }
Przemek Stekiel89c636e2023-04-14 09:26:39 +0200175
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
177 (const unsigned char *) pers, strlen(pers)) != 0) {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200178 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100179 goto exit;
180 }
181
Gilles Peskine449bd832023-01-11 14:50:10 +0100182 if (mbedtls_ssl_config_defaults(&conf,
183 MBEDTLS_SSL_IS_CLIENT,
184 MBEDTLS_SSL_TRANSPORT_STREAM,
185 MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200186 ret = ssl_config_defaults_failed;
187 goto exit;
188 }
189
Gilles Peskine449bd832023-01-11 14:50:10 +0100190 mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100191
Gilles Peskineeccd8882020-03-10 12:19:08 +0100192#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk),
194 (const unsigned char *) psk_id, sizeof(psk_id) - 1);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100195#endif
196
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 if (mbedtls_x509_crt_parse_der(&ca, ca_cert, sizeof(ca_cert)) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100199 ret = x509_crt_parse_failed;
200 goto exit;
201 }
202
Gilles Peskine449bd832023-01-11 14:50:10 +0100203 mbedtls_ssl_conf_ca_chain(&conf, &ca, NULL);
204 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200205#endif
206
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200208 ret = ssl_setup_failed;
209 goto exit;
210 }
211
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200212#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100213 if (mbedtls_ssl_set_hostname(&ssl, HOSTNAME) != 0) {
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100214 ret = hostname_failed;
215 goto exit;
216 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200217#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100218
219 /*
220 * 1. Start the connection
221 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 memset(&addr, 0, sizeof(addr));
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100223 addr.sin_family = AF_INET;
224
225 ret = 1; /* for endianness detection */
226 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
227 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
228 ret = 0;
229
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 if ((server_fd.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100231 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100232 goto exit;
233 }
234
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 if (connect(server_fd.fd,
236 (const struct sockaddr *) &addr, sizeof(addr)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100237 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100238 goto exit;
239 }
240
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100242
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 if (mbedtls_ssl_handshake(&ssl) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100244 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100245 goto exit;
246 }
247
248 /*
249 * 2. Write the GET request and close the connection
250 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 if (mbedtls_ssl_write(&ssl, (const unsigned char *) GET_REQUEST,
252 sizeof(GET_REQUEST) - 1) <= 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100253 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100254 goto exit;
255 }
256
Gilles Peskine449bd832023-01-11 14:50:10 +0100257 mbedtls_ssl_close_notify(&ssl);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100258
259exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 mbedtls_net_free(&server_fd);
Gilles Peskine449bd832023-01-11 14:50:10 +0100261 mbedtls_ssl_free(&ssl);
262 mbedtls_ssl_config_free(&conf);
263 mbedtls_ctr_drbg_free(&ctr_drbg);
264 mbedtls_entropy_free(&entropy);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265#if defined(MBEDTLS_X509_CRT_PARSE_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 mbedtls_x509_crt_free(&ca);
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100267#endif
Przemek Stekiela8c560a2023-04-19 10:15:26 +0200268 mbedtls_psa_crypto_free();
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100269
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 mbedtls_exit(ret);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100271}
272#endif