blob: 1353d8b446f2272d820e92bf407019060626bc8c [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
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010047int main( void )
48{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049 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 "
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010051 "not defined.\n");
Krzysztof Stachowiak5e1b1952019-04-24 14:24:46 +020052 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
144enum exit_codes
145{
146 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200147 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200148 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200149 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100150 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100151 socket_failed,
152 connect_failed,
153 x509_crt_parse_failed,
154 ssl_handshake_failed,
155 ssl_write_failed,
156};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100157
Simon Butcher63cb97e2018-12-06 17:43:31 +0000158
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100159int main( void )
160{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100161 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200162 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100163 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200164#if defined(MBEDTLS_X509_CRT_PARSE_C)
165 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100166#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100167
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200168 mbedtls_entropy_context entropy;
169 mbedtls_ctr_drbg_context ctr_drbg;
170 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200171 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200172 mbedtls_ctr_drbg_init( &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100173
174 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100175 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100176 */
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200177 mbedtls_net_init( &server_fd );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200178 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200179 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200180#if defined(MBEDTLS_X509_CRT_PARSE_C)
181 mbedtls_x509_crt_init( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100182#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100183
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200184 mbedtls_entropy_init( &entropy );
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200185 if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100186 (const unsigned char *) pers, strlen( pers ) ) != 0 )
187 {
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
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +0200192 if( mbedtls_ssl_config_defaults( &conf,
193 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +0200194 MBEDTLS_SSL_TRANSPORT_STREAM,
195 MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200196 {
197 ret = ssl_config_defaults_failed;
198 goto exit;
199 }
200
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200201 mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100202
Gilles Peskineeccd8882020-03-10 12:19:08 +0100203#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200204 mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100205 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100206#endif
207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208#if defined(MBEDTLS_X509_CRT_PARSE_C)
209 if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100210 {
211 ret = x509_crt_parse_failed;
212 goto exit;
213 }
214
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200215 mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200216 mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
217#endif
218
219 if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
220 {
221 ret = ssl_setup_failed;
222 goto exit;
223 }
224
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200225#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100226 if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )
227 {
228 ret = hostname_failed;
229 goto exit;
230 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200231#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100232
233 /*
234 * 1. Start the connection
235 */
236 memset( &addr, 0, sizeof( addr ) );
237 addr.sin_family = AF_INET;
238
239 ret = 1; /* for endianness detection */
240 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
241 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
242 ret = 0;
243
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200244 if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100245 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100246 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100247 goto exit;
248 }
249
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200250 if( connect( server_fd.fd,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100251 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
252 {
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
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 if( mbedtls_ssl_handshake( &ssl ) != 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100260 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100261 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100262 goto exit;
263 }
264
265 /*
266 * 2. Write the GET request and close the connection
267 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100269 sizeof( GET_REQUEST ) - 1 ) <= 0 )
270 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100271 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100272 goto exit;
273 }
274
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200275 mbedtls_ssl_close_notify( &ssl );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100276
277exit:
Manuel Pégourié-Gonnard3d7d00a2015-06-30 15:55:03 +0200278 mbedtls_net_free( &server_fd );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200281 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282 mbedtls_ctr_drbg_free( &ctr_drbg );
283 mbedtls_entropy_free( &entropy );
284#if defined(MBEDTLS_X509_CRT_PARSE_C)
285 mbedtls_x509_crt_free( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100286#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100287
Krzysztof Stachowiak5e1b1952019-04-24 14:24:46 +0200288 mbedtls_exit( ret );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100289}
290#endif