1 /*
2  *  Self-test demonstration program
3  *
4  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5  *  SPDX-License-Identifier: Apache-2.0
6  *
7  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
8  *  not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  *
11  *  http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *
19  *  This file is part of mbed TLS (https://tls.mbed.org)
20  */
21 
22 #if !defined(MBEDTLS_CONFIG_FILE)
23 #include "mbedtls/config.h"
24 #else
25 #include MBEDTLS_CONFIG_FILE
26 #endif
27 
28 #include "mbedtls/entropy.h"
29 #include "mbedtls/entropy_poll.h"
30 #include "mbedtls/hmac_drbg.h"
31 #include "mbedtls/ctr_drbg.h"
32 #include "mbedtls/dhm.h"
33 #include "mbedtls/gcm.h"
34 #include "mbedtls/ccm.h"
35 #include "mbedtls/cmac.h"
36 #include "mbedtls/md2.h"
37 #include "mbedtls/md4.h"
38 #include "mbedtls/md5.h"
39 #include "mbedtls/ripemd160.h"
40 #include "mbedtls/sha1.h"
41 #include "mbedtls/sha256.h"
42 #include "mbedtls/sha512.h"
43 #include "mbedtls/arc4.h"
44 #include "mbedtls/des.h"
45 #include "mbedtls/aes.h"
46 #include "mbedtls/camellia.h"
47 #include "mbedtls/base64.h"
48 #include "mbedtls/bignum.h"
49 #include "mbedtls/rsa.h"
50 #include "mbedtls/x509.h"
51 #include "mbedtls/xtea.h"
52 #include "mbedtls/pkcs5.h"
53 #include "mbedtls/ecp.h"
54 #include "mbedtls/ecjpake.h"
55 #include "mbedtls/timing.h"
56 
57 #include <string.h>
58 
59 #if defined(MBEDTLS_PLATFORM_C)
60 #include "mbedtls/platform.h"
61 #else
62 #include <stdio.h>
63 #include <stdlib.h>
64 #define mbedtls_printf     printf
65 #define mbedtls_snprintf   snprintf
66 #define mbedtls_exit       exit
67 #define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
68 #define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
69 #endif
70 
71 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
72 #include "mbedtls/memory_buffer_alloc.h"
73 #endif
74 
test_snprintf(size_t n,const char ref_buf[10],int ref_ret)75 static int test_snprintf( size_t n, const char ref_buf[10], int ref_ret )
76 {
77     int ret;
78     char buf[10] = "xxxxxxxxx";
79     const char ref[10] = "xxxxxxxxx";
80 
81     ret = mbedtls_snprintf( buf, n, "%s", "123" );
82     if( ret < 0 || (size_t) ret >= n )
83         ret = -1;
84 
85     if( strncmp( ref_buf, buf, sizeof( buf ) ) != 0 ||
86         ref_ret != ret ||
87         memcmp( buf + n, ref + n, sizeof( buf ) - n ) != 0 )
88     {
89         return( 1 );
90     }
91 
92     return( 0 );
93 }
94 
run_test_snprintf(void)95 static int run_test_snprintf( void )
96 {
97     return( test_snprintf( 0, "xxxxxxxxx",  -1 ) != 0 ||
98             test_snprintf( 1, "",           -1 ) != 0 ||
99             test_snprintf( 2, "1",          -1 ) != 0 ||
100             test_snprintf( 3, "12",         -1 ) != 0 ||
101             test_snprintf( 4, "123",         3 ) != 0 ||
102             test_snprintf( 5, "123",         3 ) != 0 );
103 }
104 
105 /*
106  * Check if a seed file is present, and if not create one for the entropy
107  * self-test. If this fails, we attempt the test anyway, so no error is passed
108  * back.
109  */
110 #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_ENTROPY_C) && \
111     defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
create_entropy_seed_file(void)112 static void create_entropy_seed_file( void )
113 {
114     int result;
115     size_t output_len = 0;
116     unsigned char seed_value[MBEDTLS_ENTROPY_BLOCK_SIZE];
117 
118     /* Attempt to read the entropy seed file. If this fails - attempt to write
119      * to the file to ensure one is present. */
120     result = mbedtls_platform_std_nv_seed_read( seed_value,
121                                                     MBEDTLS_ENTROPY_BLOCK_SIZE );
122     if( 0 == result )
123         return;
124 
125     result = mbedtls_platform_entropy_poll( NULL,
126                                             seed_value,
127                                             MBEDTLS_ENTROPY_BLOCK_SIZE,
128                                             &output_len );
129     if( 0 != result )
130         return;
131 
132     if( MBEDTLS_ENTROPY_BLOCK_SIZE != output_len )
133         return;
134 
135     mbedtls_platform_std_nv_seed_write( seed_value, MBEDTLS_ENTROPY_BLOCK_SIZE );
136 }
137 #endif
138 
main(int argc,char * argv[])139 int main( int argc, char *argv[] )
140 {
141     int v, suites_tested = 0, suites_failed = 0;
142 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST)
143     unsigned char buf[1000000];
144 #endif
145     void *pointer;
146 
147     /*
148      * The C standard doesn't guarantee that all-bits-0 is the representation
149      * of a NULL pointer. We do however use that in our code for initializing
150      * structures, which should work on every modern platform. Let's be sure.
151      */
152     memset( &pointer, 0, sizeof( void * ) );
153     if( pointer != NULL )
154     {
155         mbedtls_printf( "all-bits-zero is not a NULL pointer\n" );
156         mbedtls_exit( MBEDTLS_EXIT_FAILURE );
157     }
158 
159     /*
160      * Make sure we have a snprintf that correctly zero-terminates
161      */
162     if( run_test_snprintf() != 0 )
163     {
164         mbedtls_printf( "the snprintf implementation is broken\n" );
165         mbedtls_exit( MBEDTLS_EXIT_FAILURE );
166     }
167 
168     if( argc == 2 && ( strcmp( argv[1], "--quiet" ) == 0  ||
169         strcmp( argv[1], "-q" ) == 0 ) )
170     {
171         v = 0;
172     }
173     else
174     {
175         v = 1;
176         mbedtls_printf( "\n" );
177     }
178 
179 #if defined(MBEDTLS_SELF_TEST)
180 
181 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
182     mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) );
183 #endif
184 
185 #if defined(MBEDTLS_MD2_C)
186     if( mbedtls_md2_self_test( v )  != 0 )
187     {
188         suites_failed++;
189     }
190     suites_tested++;
191 #endif
192 
193 #if defined(MBEDTLS_MD4_C)
194     if( mbedtls_md4_self_test( v ) != 0 )
195     {
196         suites_failed++;
197     }
198     suites_tested++;
199 #endif
200 
201 #if defined(MBEDTLS_MD5_C)
202     if( mbedtls_md5_self_test( v ) != 0 )
203     {
204         suites_failed++;
205     }
206     suites_tested++;
207 #endif
208 
209 #if defined(MBEDTLS_RIPEMD160_C)
210     if( mbedtls_ripemd160_self_test( v ) != 0 )
211     {
212         suites_failed++;
213     }
214     suites_tested++;
215 #endif
216 
217 #if defined(MBEDTLS_SHA1_C)
218     if( mbedtls_sha1_self_test( v ) != 0 )
219     {
220         suites_failed++;
221     }
222     suites_tested++;
223 #endif
224 
225 #if defined(MBEDTLS_SHA256_C)
226     if( mbedtls_sha256_self_test( v ) != 0 )
227     {
228         suites_failed++;
229     }
230     suites_tested++;
231 #endif
232 
233 #if defined(MBEDTLS_SHA512_C)
234     if( mbedtls_sha512_self_test( v ) != 0 )
235     {
236         suites_failed++;
237     }
238     suites_tested++;
239 #endif
240 
241 #if defined(MBEDTLS_ARC4_C)
242     if( mbedtls_arc4_self_test( v ) != 0 )
243     {
244         suites_failed++;
245     }
246     suites_tested++;
247 #endif
248 
249 #if defined(MBEDTLS_DES_C)
250     if( mbedtls_des_self_test( v ) != 0 )
251     {
252         suites_failed++;
253     }
254     suites_tested++;
255 #endif
256 
257 #if defined(MBEDTLS_AES_C)
258     if( mbedtls_aes_self_test( v ) != 0 )
259     {
260         suites_failed++;
261     }
262     suites_tested++;
263 #endif
264 
265 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_AES_C)
266     if( mbedtls_gcm_self_test( v ) != 0 )
267     {
268         suites_failed++;
269     }
270     suites_tested++;
271 #endif
272 
273 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_AES_C)
274     if( mbedtls_ccm_self_test( v ) != 0 )
275     {
276         suites_failed++;
277     }
278     suites_tested++;
279 #endif
280 
281 #if defined(MBEDTLS_CMAC_C)
282     if( ( mbedtls_cmac_self_test( v ) ) != 0 )
283     {
284         suites_failed++;
285     }
286     suites_tested++;
287 #endif
288 
289 #if defined(MBEDTLS_BASE64_C)
290     if( mbedtls_base64_self_test( v ) != 0 )
291     {
292         suites_failed++;
293     }
294     suites_tested++;
295 #endif
296 
297 #if defined(MBEDTLS_BIGNUM_C)
298     if( mbedtls_mpi_self_test( v ) != 0 )
299     {
300         suites_failed++;
301     }
302     suites_tested++;
303 #endif
304 
305 #if defined(MBEDTLS_RSA_C)
306     if( mbedtls_rsa_self_test( v ) != 0 )
307     {
308         suites_failed++;
309     }
310     suites_tested++;
311 #endif
312 
313 #if defined(MBEDTLS_X509_USE_C)
314     if( mbedtls_x509_self_test( v ) != 0 )
315     {
316         suites_failed++;
317     }
318     suites_tested++;
319 #endif
320 
321 #if defined(MBEDTLS_XTEA_C)
322     if( mbedtls_xtea_self_test( v ) != 0 )
323     {
324         suites_failed++;
325     }
326     suites_tested++;
327 #endif
328 
329 #if defined(MBEDTLS_CAMELLIA_C)
330     if( mbedtls_camellia_self_test( v ) != 0 )
331     {
332         suites_failed++;
333     }
334     suites_tested++;
335 #endif
336 
337 #if defined(MBEDTLS_CTR_DRBG_C)
338     if( mbedtls_ctr_drbg_self_test( v ) != 0 )
339     {
340         suites_failed++;
341     }
342     suites_tested++;
343 #endif
344 
345 #if defined(MBEDTLS_HMAC_DRBG_C)
346     if( mbedtls_hmac_drbg_self_test( v ) != 0 )
347     {
348         suites_failed++;
349     }
350     suites_tested++;
351 #endif
352 
353 #if defined(MBEDTLS_ECP_C)
354     if( mbedtls_ecp_self_test( v ) != 0 )
355     {
356         suites_failed++;
357     }
358     suites_tested++;
359 #endif
360 
361 #if defined(MBEDTLS_ECJPAKE_C)
362     if( mbedtls_ecjpake_self_test( v ) != 0 )
363     {
364         suites_failed++;
365     }
366     suites_tested++;
367 #endif
368 
369 #if defined(MBEDTLS_DHM_C)
370     if( mbedtls_dhm_self_test( v ) != 0 )
371     {
372         suites_failed++;
373     }
374     suites_tested++;
375 #endif
376 
377 #if defined(MBEDTLS_ENTROPY_C)
378 
379 #if defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)
380     create_entropy_seed_file();
381 #endif
382 
383     if( mbedtls_entropy_self_test( v ) != 0 )
384     {
385         suites_failed++;
386     }
387     suites_tested++;
388 #endif
389 
390 #if defined(MBEDTLS_PKCS5_C)
391     if( mbedtls_pkcs5_self_test( v ) != 0 )
392     {
393         suites_failed++;
394     }
395     suites_tested++;
396 #endif
397 
398 /* Slow tests last */
399 
400 #if defined(MBEDTLS_TIMING_C)
401     if( mbedtls_timing_self_test( v ) != 0 )
402     {
403         suites_failed++;
404     }
405     suites_tested++;
406 #endif
407 
408     if( v != 0 )
409     {
410 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)
411         mbedtls_memory_buffer_alloc_status();
412 #endif
413     }
414 
415 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)
416     mbedtls_memory_buffer_alloc_free();
417     if( mbedtls_memory_buffer_alloc_self_test( v ) != 0 )
418     {
419         suites_failed++;
420     }
421     suites_tested++;
422 #endif
423 
424 #else
425     mbedtls_printf( " MBEDTLS_SELF_TEST not defined.\n" );
426 #endif
427 
428     if( v != 0 )
429     {
430         mbedtls_printf( "  Executed %d test suites\n\n", suites_tested );
431 
432         if( suites_failed > 0)
433         {
434             mbedtls_printf( "  [ %d tests FAIL ]\n\n", suites_failed );
435         }
436         else
437         {
438             mbedtls_printf( "  [ All tests PASS ]\n\n" );
439         }
440 #if defined(_WIN32)
441         mbedtls_printf( "  Press Enter to exit this program.\n" );
442         fflush( stdout ); getchar();
443 #endif
444     }
445 
446     if( suites_failed > 0)
447         mbedtls_exit( MBEDTLS_EXIT_FAILURE );
448 
449     /* return() is here to prevent compiler warnings */
450     return( MBEDTLS_EXIT_SUCCESS );
451 }
452 
453