selftest.c 10 KB

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