blob: d61312425f096bc0c73ce7607dd34c06b6abe810 [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
29/*
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 *
35 * Warning: we are breaking some of the abtractions from the NET layer here.
36 * 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 */
39#if defined(unix) || defined(__unix__) || defined(__unix)
40#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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000047#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010048#else
49#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#define mbedtls_printf printf
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010051#endif
52int main( void )
53{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054 mbedtls_printf( "MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or "
55 "MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX "
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010056 "not defined.\n");
57 return( 0 );
58}
59#else
60
61#include <string.h>
62
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000063#include "mbedtls/net.h"
64#include "mbedtls/ssl.h"
65#include "mbedtls/entropy.h"
66#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010067
68#include <sys/socket.h>
69#include <netinet/in.h>
70#include <arpa/inet.h>
71
72/*
73 * Hardcoded values for server host and port
74 */
75#define PORT_BE 0x1151 /* 4433 */
76#define PORT_LE 0x5111
77#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
78#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010079#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010080
81#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
82
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010083const char *pers = "mini_client";
84
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010086const unsigned char psk[] = {
87 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
88 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
89};
90const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010091#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020093#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010094/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
95const unsigned char ca_cert[] = {
96 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
97 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
98 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
99 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
100 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
101 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
102 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
103 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
104 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
105 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
106 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
107 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
108 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
109 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
110 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
111 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
112 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
113 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
114 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
115 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
116 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
117 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
118 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
119 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
120 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
121 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
122 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
123 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
124 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
125 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
126 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
127 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
128 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
129 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
130 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
131 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
132 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
133 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
134 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
135 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
136 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
137 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
138 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
139 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
140 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
141 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
142 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
143 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
144 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
145 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
146};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100148
149enum exit_codes
150{
151 exit_ok = 0,
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200152 ctr_drbg_seed_failed,
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200153 ssl_config_defaults_failed,
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200154 ssl_setup_failed,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100155 hostname_failed,
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100156 socket_failed,
157 connect_failed,
158 x509_crt_parse_failed,
159 ssl_handshake_failed,
160 ssl_write_failed,
161};
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100162
163int main( void )
164{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100165 int ret = exit_ok;
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200166 mbedtls_net_context server_fd;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100167 struct sockaddr_in addr;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200168#if defined(MBEDTLS_X509_CRT_PARSE_C)
169 mbedtls_x509_crt ca;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100170#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100171
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200172 mbedtls_entropy_context entropy;
173 mbedtls_ctr_drbg_context ctr_drbg;
174 mbedtls_ssl_context ssl;
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200175 mbedtls_ssl_config conf;
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200176 mbedtls_ctr_drbg_init( &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100177
178 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100179 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100180 */
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200181 mbedtls_net_init( &server_fd );
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200182 mbedtls_ssl_init( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200183 mbedtls_ssl_config_init( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200184#if defined(MBEDTLS_X509_CRT_PARSE_C)
185 mbedtls_x509_crt_init( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100186#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188 mbedtls_entropy_init( &entropy );
Manuel Pégourié-Gonnardec160c02015-04-28 22:52:30 +0200189 if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100190 (const unsigned char *) pers, strlen( pers ) ) != 0 )
191 {
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200192 ret = ctr_drbg_seed_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100193 goto exit;
194 }
195
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +0200196 if( mbedtls_ssl_config_defaults( &conf,
197 MBEDTLS_SSL_IS_CLIENT,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +0200198 MBEDTLS_SSL_TRANSPORT_STREAM,
199 MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200200 {
201 ret = ssl_config_defaults_failed;
202 goto exit;
203 }
204
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200205 mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200207#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnardfd862b12015-05-11 12:40:45 +0200208 mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100209 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100210#endif
211
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200212#if defined(MBEDTLS_X509_CRT_PARSE_C)
213 if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100214 {
215 ret = x509_crt_parse_failed;
216 goto exit;
217 }
218
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +0200219 mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200220 mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );
221#endif
222
223 if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )
224 {
225 ret = ssl_setup_failed;
226 goto exit;
227 }
228
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200229#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +0100230 if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )
231 {
232 ret = hostname_failed;
233 goto exit;
234 }
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +0200235#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100236
237 /*
238 * 1. Start the connection
239 */
240 memset( &addr, 0, sizeof( addr ) );
241 addr.sin_family = AF_INET;
242
243 ret = 1; /* for endianness detection */
244 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
245 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
246 ret = 0;
247
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200248 if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100249 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100250 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100251 goto exit;
252 }
253
Manuel Pégourié-Gonnard5db64322015-06-30 15:40:39 +0200254 if( connect( server_fd.fd,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100255 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
256 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100257 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100258 goto exit;
259 }
260
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +0100261 mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200263 if( mbedtls_ssl_handshake( &ssl ) != 0 )
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100264 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100265 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100266 goto exit;
267 }
268
269 /*
270 * 2. Write the GET request and close the connection
271 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272 if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100273 sizeof( GET_REQUEST ) - 1 ) <= 0 )
274 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100275 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100276 goto exit;
277 }
278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 mbedtls_ssl_close_notify( &ssl );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100280
281exit:
Manuel Pégourié-Gonnard3d7d00a2015-06-30 15:55:03 +0200282 mbedtls_net_free( &server_fd );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100283
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 mbedtls_ssl_free( &ssl );
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +0200285 mbedtls_ssl_config_free( &conf );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286 mbedtls_ctr_drbg_free( &ctr_drbg );
287 mbedtls_entropy_free( &entropy );
288#if defined(MBEDTLS_X509_CRT_PARSE_C)
289 mbedtls_x509_crt_free( &ca );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100290#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100291
292 return( ret );
293}
294#endif