blob: 213bd4dc6aa4ed7030965129af485b1ad79aba65 [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 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02005 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Bence Szépkútif744bd72020-06-05 13:02:18 +02006 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
7 *
8 * This file is provided under the Apache License 2.0, or the
9 * GNU General Public License v2.0 or later.
10 *
11 * **********
12 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020013 *
14 * Licensed under the Apache License, Version 2.0 (the "License"); you may
15 * not use this file except in compliance with the License.
16 * You may obtain a copy of the License at
17 *
18 * http://www.apache.org/licenses/LICENSE-2.0
19 *
20 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
22 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 * See the License for the specific language governing permissions and
24 * limitations under the License.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010025 *
Bence Szépkútif744bd72020-06-05 13:02:18 +020026 * **********
27 *
28 * **********
29 * GNU General Public License v2.0 or later:
30 *
31 * This program is free software; you can redistribute it and/or modify
32 * it under the terms of the GNU General Public License as published by
33 * the Free Software Foundation; either version 2 of the License, or
34 * (at your option) any later version.
35 *
36 * This program is distributed in the hope that it will be useful,
37 * but WITHOUT ANY WARRANTY; without even the implied warranty of
38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
39 * GNU General Public License for more details.
40 *
41 * You should have received a copy of the GNU General Public License along
42 * with this program; if not, write to the Free Software Foundation, Inc.,
43 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
44 *
45 * **********
46 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000047 * This file is part of mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010048 */
49
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000051#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010052#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010054#endif
55
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010056#if defined(MBEDTLS_PLATFORM_C)
57#include "mbedtls/platform.h"
58#else
59#include <stdio.h>
60#include <stdlib.h>
61#define mbedtls_printf printf
62#define mbedtls_exit exit
63#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
64#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
65#endif
66
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010067/*
68 * We're creating and connecting the socket "manually" rather than using the
69 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
70 * dominate memory usage in small configurations. For the sake of simplicity,
71 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020072 *
73 * Warning: we are breaking some of the abtractions from the NET layer here.
74 * This is not a good example for general use. This programs has the specific
75 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010076 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010077#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010078#define UNIX
79#endif
80
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
82 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010083 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010084
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010085int main( void )
86{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020087 mbedtls_printf( "MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
88 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010089 "not defined.\n");
Krzysztof Stachowiak3b0c4302019-04-24 14:24:46 +020090 mbedtls_exit( 0 );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010091}
92#else
93
94#include <string.h>
95
Andres AG788aa4a2016-09-14 14:32:09 +010096#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000097#include "mbedtls/ssl.h"
98#include "mbedtls/entropy.h"
99#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100100
101#include <sys/socket.h>
102#include <netinet/in.h>
103#include <arpa/inet.h>
104
105/*
106 * Hardcoded values for server host and port
107 */
108#define PORT_BE 0x1151 /* 4433 */
109#define PORT_LE 0x5111
110#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
111#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100112#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100113
114#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
115
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100116const char *pers = "mini_client";
117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100119const unsigned char psk[] = {
120 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
121 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
122};
123const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100124#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100127/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
128const unsigned char ca_cert[] = {
129 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
130 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
131 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
132 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
133 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
134 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
135 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
136 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
137 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
138 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
139 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
140 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
141 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
142 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
143 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
144 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
145 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
146 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
147 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
148 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
149 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
150 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
151 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
152 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
153 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
154 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
155 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
156 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
157 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
158 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
159 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
160 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
161 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
162 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
163 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
164 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
165 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
166 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
167 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
168 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
169 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
170 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
171 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
172 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
173 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
174 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
175 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
176 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
177 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
178 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
179};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200180#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100181
182enum exit_codes
183{
184 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200185 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200186 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200187 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100188 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100189 socket_failed,
190 connect_failed,
191 x509_crt_parse_failed,
192 ssl_handshake_failed,
193 ssl_write_failed,
194};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100195
Simon Butcher63cb97e2018-12-06 17:43:31 +0000196
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100197int main( void )
198{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100199 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200200 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100201 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200202#if defined(MBEDTLS_X509_CRT_PARSE_C)
203 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100204#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 mbedtls_entropy_context entropy;
207 mbedtls_ctr_drbg_context ctr_drbg;
208 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200209 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200210 mbedtls_ctr_drbg_init( &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100211
212 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100213 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100214 */
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200215 mbedtls_net_init( &server_fd );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200216 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200217 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218#if defined(MBEDTLS_X509_CRT_PARSE_C)
219 mbedtls_x509_crt_init( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100220#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200222 mbedtls_entropy_init( &entropy );
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200223 if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100224 (const unsigned char *) pers, strlen( pers ) ) != 0 )
225 {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200226 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100227 goto exit;
228 }
229
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +0200230 if( mbedtls_ssl_config_defaults( &conf,
231 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +0200232 MBEDTLS_SSL_TRANSPORT_STREAM,
233 MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200234 {
235 ret = ssl_config_defaults_failed;
236 goto exit;
237 }
238
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200239 mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200242 mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100243 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100244#endif
245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200246#if defined(MBEDTLS_X509_CRT_PARSE_C)
247 if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100248 {
249 ret = x509_crt_parse_failed;
250 goto exit;
251 }
252
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200253 mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200254 mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
255#endif
256
257 if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
258 {
259 ret = ssl_setup_failed;
260 goto exit;
261 }
262
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200263#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100264 if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )
265 {
266 ret = hostname_failed;
267 goto exit;
268 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200269#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100270
271 /*
272 * 1. Start the connection
273 */
274 memset( &addr, 0, sizeof( addr ) );
275 addr.sin_family = AF_INET;
276
277 ret = 1; /* for endianness detection */
278 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
279 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
280 ret = 0;
281
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200282 if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100283 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100284 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100285 goto exit;
286 }
287
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200288 if( connect( server_fd.fd,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100289 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
290 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100291 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100292 goto exit;
293 }
294
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +0100295 mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 if( mbedtls_ssl_handshake( &ssl ) != 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100298 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100299 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100300 goto exit;
301 }
302
303 /*
304 * 2. Write the GET request and close the connection
305 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100307 sizeof( GET_REQUEST ) - 1 ) <= 0 )
308 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100309 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100310 goto exit;
311 }
312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200313 mbedtls_ssl_close_notify( &ssl );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100314
315exit:
Manuel Pégourié-Gonnard3d7d00a2015-06-30 15:55:03 +0200316 mbedtls_net_free( &server_fd );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200319 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320 mbedtls_ctr_drbg_free( &ctr_drbg );
321 mbedtls_entropy_free( &entropy );
322#if defined(MBEDTLS_X509_CRT_PARSE_C)
323 mbedtls_x509_crt_free( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100324#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100325
Krzysztof Stachowiak3b0c4302019-04-24 14:24:46 +0200326 mbedtls_exit( ret );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100327}
328#endif