blob: 8d553b8d458e10f16a71936cacc1b25f096de4cb [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úti44bfbe32020-08-19 16:54:51 +02005 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-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úti4e9f7122020-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 * **********
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010046 */
47
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000049#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010050#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010052#endif
53
Krzysztof Stachowiaka0865222019-04-24 14:24:46 +020054#if defined(MBEDTLS_PLATFORM_C)
55#include "mbedtls/platform.h"
56#else
57#include <stdio.h>
58#include <stdlib.h>
59#define mbedtls_printf printf
60#define mbedtls_exit exit
61#endif
62
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010063/*
64 * We're creating and connecting the socket "manually" rather than using the
65 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
66 * dominate memory usage in small configurations. For the sake of simplicity,
67 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020068 *
69 * Warning: we are breaking some of the abtractions from the NET layer here.
70 * This is not a good example for general use. This programs has the specific
71 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010072 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010073#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010074#define UNIX
75#endif
76
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
78 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010079 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010080
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010081int main( void )
82{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083 mbedtls_printf( "MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
84 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010085 "not defined.\n");
Krzysztof Stachowiaka0865222019-04-24 14:24:46 +020086 mbedtls_exit( 0 );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010087}
88#else
89
90#include <string.h>
91
Andres AG788aa4a2016-09-14 14:32:09 +010092#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000093#include "mbedtls/ssl.h"
94#include "mbedtls/entropy.h"
95#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010096
97#include <sys/socket.h>
98#include <netinet/in.h>
99#include <arpa/inet.h>
100
101/*
102 * Hardcoded values for server host and port
103 */
104#define PORT_BE 0x1151 /* 4433 */
105#define PORT_LE 0x5111
106#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
107#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100108#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100109
110#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
111
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100112const char *pers = "mini_client";
113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100115const unsigned char psk[] = {
116 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
117 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
118};
119const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100120#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100123/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
124const unsigned char ca_cert[] = {
125 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
126 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
127 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
128 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
129 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
130 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
131 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
132 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
133 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
134 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
135 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
136 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
137 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
138 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
139 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
140 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
141 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
142 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
143 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
144 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
145 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
146 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
147 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
148 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
149 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
150 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
151 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
152 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
153 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
154 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
155 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
156 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
157 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
158 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
159 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
160 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
161 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
162 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
163 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
164 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
165 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
166 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
167 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
168 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
169 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
170 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
171 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
172 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
173 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
174 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
175};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200176#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100177
178enum exit_codes
179{
180 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200181 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200182 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200183 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100184 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100185 socket_failed,
186 connect_failed,
187 x509_crt_parse_failed,
188 ssl_handshake_failed,
189 ssl_write_failed,
190};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100191
192int main( void )
193{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100194 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200195 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100196 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197#if defined(MBEDTLS_X509_CRT_PARSE_C)
198 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100199#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201 mbedtls_entropy_context entropy;
202 mbedtls_ctr_drbg_context ctr_drbg;
203 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200204 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200205 mbedtls_ctr_drbg_init( &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100206
207 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100208 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100209 */
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200210 mbedtls_net_init( &server_fd );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200211 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200212 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213#if defined(MBEDTLS_X509_CRT_PARSE_C)
214 mbedtls_x509_crt_init( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100215#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217 mbedtls_entropy_init( &entropy );
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200218 if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100219 (const unsigned char *) pers, strlen( pers ) ) != 0 )
220 {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200221 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100222 goto exit;
223 }
224
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +0200225 if( mbedtls_ssl_config_defaults( &conf,
226 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +0200227 MBEDTLS_SSL_TRANSPORT_STREAM,
228 MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200229 {
230 ret = ssl_config_defaults_failed;
231 goto exit;
232 }
233
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200234 mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200237 mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100238 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100239#endif
240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241#if defined(MBEDTLS_X509_CRT_PARSE_C)
242 if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100243 {
244 ret = x509_crt_parse_failed;
245 goto exit;
246 }
247
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200248 mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200249 mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
250#endif
251
252 if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
253 {
254 ret = ssl_setup_failed;
255 goto exit;
256 }
257
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200258#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100259 if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )
260 {
261 ret = hostname_failed;
262 goto exit;
263 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200264#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100265
266 /*
267 * 1. Start the connection
268 */
269 memset( &addr, 0, sizeof( addr ) );
270 addr.sin_family = AF_INET;
271
272 ret = 1; /* for endianness detection */
273 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
274 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
275 ret = 0;
276
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200277 if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100278 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100279 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100280 goto exit;
281 }
282
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200283 if( connect( server_fd.fd,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100284 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
285 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100286 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100287 goto exit;
288 }
289
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +0100290 mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100291
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 if( mbedtls_ssl_handshake( &ssl ) != 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100293 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100294 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100295 goto exit;
296 }
297
298 /*
299 * 2. Write the GET request and close the connection
300 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301 if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100302 sizeof( GET_REQUEST ) - 1 ) <= 0 )
303 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100304 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100305 goto exit;
306 }
307
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308 mbedtls_ssl_close_notify( &ssl );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100309
310exit:
Manuel Pégourié-Gonnard3d7d00a2015-06-30 15:55:03 +0200311 mbedtls_net_free( &server_fd );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100312
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200313 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200314 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 mbedtls_ctr_drbg_free( &ctr_drbg );
316 mbedtls_entropy_free( &entropy );
317#if defined(MBEDTLS_X509_CRT_PARSE_C)
318 mbedtls_x509_crt_free( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100319#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100320
Krzysztof Stachowiaka0865222019-04-24 14:24:46 +0200321 mbedtls_exit( ret );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100322}
323#endif