blob: b83ccd93b293f2d903fc5fa830ac08c32a30bfe4 [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 *
5 * Copyright (C) 2014, ARM Limited, All Rights Reserved
6 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00007 * This file is part of mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +01008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24#if !defined(POLARSSL_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000025#include "mbedtls/config.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010026#else
27#include POLARSSL_CONFIG_FILE
28#endif
29
30/*
31 * We're creating and connecting the socket "manually" rather than using the
32 * NET module, in order to avoid the overhead of getaddrinfo() which tends to
33 * dominate memory usage in small configurations. For the sake of simplicity,
34 * only a Unix version is implemented.
35 */
36#if defined(unix) || defined(__unix__) || defined(__unix)
37#define UNIX
38#endif
39
40#if !defined(POLARSSL_CTR_DRBG_C) || !defined(POLARSSL_ENTROPY_C) || \
41 !defined(POLARSSL_NET_C) || !defined(POLARSSL_SSL_CLI_C) || \
42 !defined(UNIX)
43#if defined(POLARSSL_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000044#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010045#else
46#include <stdio.h>
47#define polarssl_printf printf
48#endif
49int main( void )
50{
51 polarssl_printf( "POLARSSL_CTR_DRBG_C and/or POLARSSL_ENTROPY_C and/or "
52 "POLARSSL_NET_C and/or POLARSSL_SSL_CLI_C and/or UNIX "
53 "not defined.\n");
54 return( 0 );
55}
56#else
57
58#include <string.h>
59
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000060#include "mbedtls/net.h"
61#include "mbedtls/ssl.h"
62#include "mbedtls/entropy.h"
63#include "mbedtls/ctr_drbg.h"
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010064
65#include <sys/socket.h>
66#include <netinet/in.h>
67#include <arpa/inet.h>
68
69/*
70 * Hardcoded values for server host and port
71 */
72#define PORT_BE 0x1151 /* 4433 */
73#define PORT_LE 0x5111
74#define ADDR_BE 0x7f000001 /* 127.0.0.1 */
75#define ADDR_LE 0x0100007f
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010076#define HOSTNAME "localhost" /* for cert verification if enabled */
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010077
78#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
79
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010080const char *pers = "mini_client";
81
82#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010083const unsigned char psk[] = {
84 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
85 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
86};
87const char psk_id[] = "Client_identity";
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010088#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +010089
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +010090#if defined(POLARSSL_X509_CRT_PARSE_C)
91/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */
92const unsigned char ca_cert[] = {
93 0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,
94 0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,
95 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,
96 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
97 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
98 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
99 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
100 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
101 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,
102 0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,
103 0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,
104 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
105 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,
106 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,
107 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,
108 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,
109 0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,
110 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
111 0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,
112 0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,
113 0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,
114 0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,
115 0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,
116 0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,
117 0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,
118 0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,
119 0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,
120 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,
121 0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,
122 0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,
123 0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,
124 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,
125 0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,
126 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,
127 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,
128 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,
129 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,
130 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,
131 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,
132 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
133 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,
134 0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,
135 0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,
136 0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,
137 0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,
138 0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,
139 0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,
140 0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,
141 0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,
142 0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,
143};
144#endif /* POLARSSL_X509_CRT_PARSE_C */
145
146enum exit_codes
147{
148 exit_ok = 0,
149 ctr_drbg_init_failed,
150 ssl_init_failed,
151 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
158int main( void )
159{
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100160 int ret = exit_ok;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100161 int server_fd = -1;
162 struct sockaddr_in addr;
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100163#if defined(POLARSSL_X509_CRT_PARSE_C)
164 x509_crt ca;
165#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100166
167 entropy_context entropy;
168 ctr_drbg_context ctr_drbg;
169 ssl_context ssl;
170
171 /*
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100172 * 0. Initialize and setup stuff
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100173 */
174 memset( &ssl, 0, sizeof( ssl_context ) );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100175#if defined(POLARSSL_X509_CRT_PARSE_C)
176 x509_crt_init( &ca );
177#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100178
179 entropy_init( &entropy );
180 if( ctr_drbg_init( &ctr_drbg, entropy_func, &entropy,
181 (const unsigned char *) pers, strlen( pers ) ) != 0 )
182 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100183 ret = ssl_init_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100184 goto exit;
185 }
186
187 if( ssl_init( &ssl ) != 0 )
188 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100189 ret = ssl_init_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100190 goto exit;
191 }
192
193 ssl_set_endpoint( &ssl, SSL_IS_CLIENT );
194
195 ssl_set_rng( &ssl, ctr_drbg_random, &ctr_drbg );
196
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100197#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100198 ssl_set_psk( &ssl, psk, sizeof( psk ),
199 (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100200#endif
201
202#if defined(POLARSSL_X509_CRT_PARSE_C)
203 if( x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )
204 {
205 ret = x509_crt_parse_failed;
206 goto exit;
207 }
208
209 ssl_set_ca_chain( &ssl, &ca, NULL, HOSTNAME );
210 ssl_set_authmode( &ssl, SSL_VERIFY_REQUIRED );
211#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100212
213 /*
214 * 1. Start the connection
215 */
216 memset( &addr, 0, sizeof( addr ) );
217 addr.sin_family = AF_INET;
218
219 ret = 1; /* for endianness detection */
220 addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;
221 addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;
222 ret = 0;
223
224 if( ( server_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
225 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100226 ret = socket_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100227 goto exit;
228 }
229
230 if( connect( server_fd,
231 (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )
232 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100233 ret = connect_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100234 goto exit;
235 }
236
Manuel Pégourié-Gonnardaeab2522015-03-25 19:38:23 +0100237 ssl_set_bio_timeout( &ssl, &server_fd, net_send, net_recv, NULL, 0 );
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100238
239 if( ssl_handshake( &ssl ) != 0 )
240 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100241 ret = ssl_handshake_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100242 goto exit;
243 }
244
245 /*
246 * 2. Write the GET request and close the connection
247 */
248 if( ssl_write( &ssl, (const unsigned char *) GET_REQUEST,
249 sizeof( GET_REQUEST ) - 1 ) <= 0 )
250 {
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100251 ret = ssl_write_failed;
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100252 goto exit;
253 }
254
255 ssl_close_notify( &ssl );
256
257exit:
258 if( server_fd != -1 )
259 net_close( server_fd );
260
261 ssl_free( &ssl );
262 ctr_drbg_free( &ctr_drbg );
263 entropy_free( &entropy );
Manuel Pégourié-Gonnard3b8926c2014-12-01 11:18:00 +0100264#if defined(POLARSSL_X509_CRT_PARSE_C)
265 x509_crt_free( &ca );
266#endif
Manuel Pégourié-Gonnarda6fc5b22014-11-24 14:05:25 +0100267
268 return( ret );
269}
270#endif