blob: 3938530026db05169ef29104327a2cea84c3c807 [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
Bence Szépkútic662b362021-05-27 11:25:03 +020021#include "mbedtls/build_info.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010022
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010023#if defined(MBEDTLS_PLATFORM_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020024# include "mbedtls/platform.h"
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010025#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020026# include <stdio.h>
27# include <stdlib.h>
28# define mbedtls_printf printf
29# define mbedtls_exit exit
30# define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
31# define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010032#endif
33
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010034/*
35 * We're creating and connecting the socket "manually" rather than using the
36 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
37 * dominate memory usage in small configurations. For the sake of simplicity,
38 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020039 *
40 * Warning: we are breaking some of the abtractions from the NET layer here.
41 * This is not a good example for general use. This programs has the specific
42 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010043 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010044#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020045# define UNIX
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010046#endif
47
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020049 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010050
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020051int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010052{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020053 mbedtls_printf("MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
54 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
55 "not defined.\n");
56 mbedtls_exit(0);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010057}
58#else
59
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020060# include <string.h>
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010061
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020062# include "mbedtls/net_sockets.h"
63# include "mbedtls/ssl.h"
64# include "mbedtls/entropy.h"
65# include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010066
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020067# include <sys/socket.h>
68# include <netinet/in.h>
69# include <arpa/inet.h>
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010070
71/*
72 * Hardcoded values for server host and port
73 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020074# define PORT_BE 0x1151 /* 4433 */
75# define PORT_LE 0x5111
76# define ADDR_BE 0x7f000001 /* 127.0.0.1 */
77# define ADDR_LE 0x0100007f
78# define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010079
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020080# define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010081
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010082const char *pers = "mini_client";
83
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020084# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
85const unsigned char psk[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
86 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010087const char psk_id[] = "Client_identity";
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020088# endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010089
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020090# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010091/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
92const unsigned char ca_cert[] = {
93 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
94 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
95 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
96 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
97 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
98 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
99 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
100 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
101 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
102 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
103 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
104 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
105 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
106 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
107 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
108 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
109 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
110 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
111 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
112 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
113 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
114 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
115 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
116 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
117 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
118 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
119 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
120 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
121 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
122 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
123 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
124 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
125 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
126 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
127 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
128 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
129 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
130 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
131 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
132 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
133 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
134 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
135 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
136 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
137 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
138 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
139 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
140 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
141 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
142 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
143};
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200144# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100145
146enum exit_codes
147{
148 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200149 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200150 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200151 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100152 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100153 socket_failed,
154 connect_failed,
155 x509_crt_parse_failed,
156 ssl_handshake_failed,
157 ssl_write_failed,
158};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100159
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200160int main(void)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100161{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100162 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200163 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100164 struct sockaddr_in addr;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200165# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200166 mbedtls_x509_crt ca;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200167# endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100168
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200169 mbedtls_entropy_context entropy;
170 mbedtls_ctr_drbg_context ctr_drbg;
171 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200172 mbedtls_ssl_config conf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200173 mbedtls_ctr_drbg_init(&ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100174
175 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100176 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100177 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200178 mbedtls_net_init(&server_fd);
179 mbedtls_ssl_init(&ssl);
180 mbedtls_ssl_config_init(&conf);
181# if defined(MBEDTLS_X509_CRT_PARSE_C)
182 mbedtls_x509_crt_init(&ca);
183# endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100184
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200185 mbedtls_entropy_init(&entropy);
186 if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,
187 (const unsigned char *)pers, strlen(pers)) != 0) {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200188 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100189 goto exit;
190 }
191
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200192 if (mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,
193 MBEDTLS_SSL_TRANSPORT_STREAM,
194 MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200195 ret = ssl_config_defaults_failed;
196 goto exit;
197 }
198
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200199 mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100200
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200201# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
202 mbedtls_ssl_conf_psk(&conf, psk, sizeof(psk), (const unsigned char *)psk_id,
203 sizeof(psk_id) - 1);
204# endif
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100205
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200206# if defined(MBEDTLS_X509_CRT_PARSE_C)
207 if (mbedtls_x509_crt_parse_der(&ca, ca_cert, sizeof(ca_cert)) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100208 ret = x509_crt_parse_failed;
209 goto exit;
210 }
211
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200212 mbedtls_ssl_conf_ca_chain(&conf, &ca, NULL);
213 mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_REQUIRED);
214# endif
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200215
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200216 if (mbedtls_ssl_setup(&ssl, &conf) != 0) {
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200217 ret = ssl_setup_failed;
218 goto exit;
219 }
220
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200221# if defined(MBEDTLS_X509_CRT_PARSE_C)
222 if (mbedtls_ssl_set_hostname(&ssl, HOSTNAME) != 0) {
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100223 ret = hostname_failed;
224 goto exit;
225 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200226# endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100227
228 /*
229 * 1. Start the connection
230 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200231 memset(&addr, 0, sizeof(addr));
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100232 addr.sin_family = AF_INET;
233
234 ret = 1; /* for endianness detection */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200235 addr.sin_port = *((char *)&ret) == ret ? PORT_LE : PORT_BE;
236 addr.sin_addr.s_addr = *((char *)&ret) == ret ? ADDR_LE : ADDR_BE;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100237 ret = 0;
238
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200239 if ((server_fd.MBEDTLS_PRIVATE(fd) = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100240 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100241 goto exit;
242 }
243
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200244 if (connect(server_fd.MBEDTLS_PRIVATE(fd), (const struct sockaddr *)&addr,
245 sizeof(addr)) < 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100246 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100247 goto exit;
248 }
249
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200250 mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv,
251 NULL);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100252
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200253 if (mbedtls_ssl_handshake(&ssl) != 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100254 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100255 goto exit;
256 }
257
258 /*
259 * 2. Write the GET request and close the connection
260 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200261 if (mbedtls_ssl_write(&ssl, (const unsigned char *)GET_REQUEST,
262 sizeof(GET_REQUEST) - 1) <= 0) {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100263 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100264 goto exit;
265 }
266
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200267 mbedtls_ssl_close_notify(&ssl);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100268
269exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200270 mbedtls_net_free(&server_fd);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100271
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200272 mbedtls_ssl_free(&ssl);
273 mbedtls_ssl_config_free(&conf);
274 mbedtls_ctr_drbg_free(&ctr_drbg);
275 mbedtls_entropy_free(&entropy);
276# if defined(MBEDTLS_X509_CRT_PARSE_C)
277 mbedtls_x509_crt_free(&ca);
278# endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100279
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200280 mbedtls_exit(ret);
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100281}
282#endif