blob: 87c48ff4af2aaf585187e0edb8efdc116bc685c5 [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
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 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000020 * This file is part of mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010021 */
22
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020023#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000024#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010025#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020026#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010027#endif
28
Manuel Pégourié-Gonnard3ef6a6d2018-12-10 14:31:45 +010029#if defined(MBEDTLS_PLATFORM_C)
30#include "mbedtls/platform.h"
31#else
32#include <stdio.h>
33#include <stdlib.h>
34#define mbedtls_printf printf
35#define mbedtls_exit exit
36#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
37#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
38#endif
39
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010040/*
41 * We're creating and connecting the socket "manually" rather than using the
42 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
43 * dominate memory usage in small configurations. For the sake of simplicity,
44 * only a Unix version is implemented.
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +020045 *
46 * Warning: we are breaking some of the abtractions from the NET layer here.
47 * This is not a good example for general use. This programs has the specific
48 * goal of minimizing use of the libc functions on full-blown OSes.
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010049 */
Manuel Pégourié-Gonnard90ab4a42016-02-22 10:47:43 +010050#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010051#define UNIX
52#endif
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \
55 !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010056 !defined(UNIX)
SimonBd5800b72016-04-26 07:43:27 +010057
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010058int main( void )
59{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060 mbedtls_printf( "MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
61 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010062 "not defined.\n");
63 return( 0 );
64}
65#else
66
67#include <string.h>
68
Andres AG788aa4a2016-09-14 14:32:09 +010069#include "mbedtls/net_sockets.h"
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000070#include "mbedtls/ssl.h"
71#include "mbedtls/entropy.h"
72#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010073
74#include <sys/socket.h>
75#include <netinet/in.h>
76#include <arpa/inet.h>
77
78/*
79 * Hardcoded values for server host and port
80 */
81#define PORT_BE 0x1151 /* 4433 */
82#define PORT_LE 0x5111
83#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
84#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010085#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010086
87#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
88
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010089const char *pers = "mini_client";
90
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010092const unsigned char psk[] = {
93 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
94 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
95};
96const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010097#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100100/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
101const unsigned char ca_cert[] = {
102 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
103 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
104 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
105 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
106 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
107 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
108 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
109 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
110 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
111 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
112 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
113 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
114 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
115 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
116 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
117 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
118 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
119 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
120 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
121 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
122 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
123 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
124 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
125 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
126 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
127 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
128 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
129 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
130 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
131 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
132 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
133 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
134 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
135 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
136 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
137 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
138 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
139 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
140 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
141 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
142 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
143 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
144 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
145 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
146 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
147 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
148 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
149 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
150 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
151 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
152};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100154
155enum exit_codes
156{
157 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200158 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200159 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200160 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100161 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100162 socket_failed,
163 connect_failed,
164 x509_crt_parse_failed,
165 ssl_handshake_failed,
166 ssl_write_failed,
167};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100168
Hanno Becker572d4482019-07-23 13:47:53 +0100169#if defined(MBEDTLS_SSL_CONF_RNG)
170int rng_wrap( void *ctx, unsigned char *dst, size_t len );
171
172mbedtls_ctr_drbg_context *rng_ctx_global = NULL;
173int rng_wrap( void *ctx, unsigned char *dst, size_t len )
174{
175 /* We expect the NULL parameter here. */
176 if( ctx != NULL )
177 return( -1 );
178
179 return( mbedtls_ctr_drbg_random( rng_ctx_global, dst, len ) );
180}
181#endif /* MBEDTLS_SSL_CONF_RNG */
Simon Butcher63cb97e2018-12-06 17:43:31 +0000182
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100183int main( void )
184{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100185 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200186 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100187 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188#if defined(MBEDTLS_X509_CRT_PARSE_C)
189 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100190#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192 mbedtls_entropy_context entropy;
193 mbedtls_ctr_drbg_context ctr_drbg;
194 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200195 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200196 mbedtls_ctr_drbg_init( &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100197
198 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100199 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100200 */
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200201 mbedtls_net_init( &server_fd );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200202 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200203 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204#if defined(MBEDTLS_X509_CRT_PARSE_C)
205 mbedtls_x509_crt_init( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100206#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 mbedtls_entropy_init( &entropy );
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200209 if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100210 (const unsigned char *) pers, strlen( pers ) ) != 0 )
211 {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200212 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100213 goto exit;
214 }
215
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +0200216 if( mbedtls_ssl_config_defaults( &conf,
217 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +0200218 MBEDTLS_SSL_TRANSPORT_STREAM,
219 MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200220 {
221 ret = ssl_config_defaults_failed;
222 goto exit;
223 }
224
Hanno Beckerece325c2019-06-13 15:39:27 +0100225#if !defined(MBEDTLS_SSL_CONF_RNG)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200226 mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
Hanno Beckerece325c2019-06-13 15:39:27 +0100227#else
Hanno Becker572d4482019-07-23 13:47:53 +0100228 rng_ctx_global = &ctr_drbg;
Hanno Beckerece325c2019-06-13 15:39:27 +0100229#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200231#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200232 mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100233 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100234#endif
235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236#if defined(MBEDTLS_X509_CRT_PARSE_C)
237 if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100238 {
239 ret = x509_crt_parse_failed;
240 goto exit;
241 }
242
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200243 mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200244 mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
245#endif
246
247 if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
248 {
249 ret = ssl_setup_failed;
250 goto exit;
251 }
252
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200253#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100254 if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )
255 {
256 ret = hostname_failed;
257 goto exit;
258 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200259#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100260
261 /*
262 * 1. Start the connection
263 */
264 memset( &addr, 0, sizeof( addr ) );
265 addr.sin_family = AF_INET;
266
267 ret = 1; /* for endianness detection */
268 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
269 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
270 ret = 0;
271
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200272 if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100273 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100274 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100275 goto exit;
276 }
277
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200278 if( connect( server_fd.fd,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100279 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
280 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100281 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100282 goto exit;
283 }
284
Hanno Beckera58a8962019-06-13 16:11:15 +0100285#if !defined(MBEDTLS_SSL_CONF_RECV) && \
286 !defined(MBEDTLS_SSL_CONF_SEND) && \
287 !defined(MBEDTLS_SSL_CONF_RECV_TIMEOUT)
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +0100288 mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
Hanno Beckera58a8962019-06-13 16:11:15 +0100289#else
290 mbedtls_ssl_set_bio_ctx( &ssl, &server_fd );
291#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293 if( mbedtls_ssl_handshake( &ssl ) != 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100294 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100295 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100296 goto exit;
297 }
298
299 /*
300 * 2. Write the GET request and close the connection
301 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200302 if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100303 sizeof( GET_REQUEST ) - 1 ) <= 0 )
304 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100305 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100306 goto exit;
307 }
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309 mbedtls_ssl_close_notify( &ssl );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100310
311exit:
Manuel Pégourié-Gonnard3d7d00a2015-06-30 15:55:03 +0200312 mbedtls_net_free( &server_fd );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100313
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200315 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200316 mbedtls_ctr_drbg_free( &ctr_drbg );
317 mbedtls_entropy_free( &entropy );
318#if defined(MBEDTLS_X509_CRT_PARSE_C)
319 mbedtls_x509_crt_free( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100320#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100321
322 return( ret );
323}
324#endif