test.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "test.h"
  2. test_entry tests[26];
  3. test_entry test_list[26] = {
  4. /* test name provides requires entry */
  5. {"store_test", "a", "", store_test },
  6. {"cipher_hash_test", "b", "a", cipher_hash_test },
  7. {"modes_test", "c", "b", modes_test },
  8. {"mac_test", "d", "c", mac_test },
  9. {"der_test", "e", "", der_tests },
  10. {"pkcs_1_test", "f", "e", pkcs_1_test },
  11. {"rsa_test", "g", "e", rsa_test },
  12. {"ecc_test", "h", "a", ecc_tests },
  13. {"dsa_test", "i", "a", dsa_test },
  14. {"dh_test", "j", "a", dh_tests },
  15. {NULL, NULL, NULL, NULL}
  16. };
  17. prng_state test_yarrow;
  18. static int current_test;
  19. void run_cmd(int res, int line, char *file, char *cmd)
  20. {
  21. if (res != CRYPT_OK) {
  22. fprintf(stderr, "[%s]: %s (%d)\n%s:%d:%s\n", tests[current_test].name, error_to_string(res), res, file, line, cmd);
  23. exit(EXIT_FAILURE);
  24. }
  25. }
  26. void register_algs(void)
  27. {
  28. int err;
  29. #ifdef RIJNDAEL
  30. register_cipher (&aes_desc);
  31. #endif
  32. #ifdef BLOWFISH
  33. register_cipher (&blowfish_desc);
  34. #endif
  35. #ifdef XTEA
  36. register_cipher (&xtea_desc);
  37. #endif
  38. #ifdef RC5
  39. register_cipher (&rc5_desc);
  40. #endif
  41. #ifdef RC6
  42. register_cipher (&rc6_desc);
  43. #endif
  44. #ifdef SAFERP
  45. register_cipher (&saferp_desc);
  46. #endif
  47. #ifdef TWOFISH
  48. register_cipher (&twofish_desc);
  49. #endif
  50. #ifdef SAFER
  51. register_cipher (&safer_k64_desc);
  52. register_cipher (&safer_sk64_desc);
  53. register_cipher (&safer_k128_desc);
  54. register_cipher (&safer_sk128_desc);
  55. #endif
  56. #ifdef RC2
  57. register_cipher (&rc2_desc);
  58. #endif
  59. #ifdef DES
  60. register_cipher (&des_desc);
  61. register_cipher (&des3_desc);
  62. #endif
  63. #ifdef CAST5
  64. register_cipher (&cast5_desc);
  65. #endif
  66. #ifdef NOEKEON
  67. register_cipher (&noekeon_desc);
  68. #endif
  69. #ifdef SKIPJACK
  70. register_cipher (&skipjack_desc);
  71. #endif
  72. #ifdef TIGER
  73. register_hash (&tiger_desc);
  74. #endif
  75. #ifdef MD2
  76. register_hash (&md2_desc);
  77. #endif
  78. #ifdef MD4
  79. register_hash (&md4_desc);
  80. #endif
  81. #ifdef MD5
  82. register_hash (&md5_desc);
  83. #endif
  84. #ifdef SHA1
  85. register_hash (&sha1_desc);
  86. #endif
  87. #ifdef SHA256
  88. register_hash (&sha256_desc);
  89. #endif
  90. #ifdef SHA224
  91. register_hash (&sha224_desc);
  92. #endif
  93. #ifdef SHA384
  94. register_hash (&sha384_desc);
  95. #endif
  96. #ifdef SHA512
  97. register_hash (&sha512_desc);
  98. #endif
  99. #ifdef RIPEMD128
  100. register_hash (&rmd128_desc);
  101. #endif
  102. #ifdef RIPEMD160
  103. register_hash (&rmd160_desc);
  104. #endif
  105. #ifdef WHIRLPOOL
  106. register_hash (&whirlpool_desc);
  107. #endif
  108. #ifdef CHC_HASH
  109. register_hash(&chc_desc);
  110. if ((err = chc_register(register_cipher(&aes_enc_desc))) != CRYPT_OK) {
  111. printf("chc_register error: %s\n", error_to_string(err));
  112. exit(EXIT_FAILURE);
  113. }
  114. #endif
  115. #ifdef YARROW
  116. register_prng(&yarrow_desc);
  117. #endif
  118. #ifdef FORTUNA
  119. register_prng(&fortuna_desc);
  120. #endif
  121. #ifdef RC4
  122. register_prng(&rc4_desc);
  123. #endif
  124. #ifdef SPRNG
  125. register_prng(&sprng_desc);
  126. #endif
  127. #ifdef SOBER128
  128. register_prng(&sober128_desc);
  129. #endif
  130. }
  131. /* sort tests based on their requirement/services. Helps make sure dependencies are tested first */
  132. void sort(void)
  133. {
  134. unsigned x, y, z, a, pidx[26];
  135. /* find out where things are provided */
  136. zeromem(pidx, sizeof(pidx));
  137. z = 0;
  138. do {
  139. y = 0;
  140. for (x = 0; test_list[x].name != NULL; x++) {
  141. if (test_list[x].entry == NULL) continue;
  142. if (strlen(test_list[x].prov) == 0) {
  143. y = 1;
  144. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  145. pidx[test_list[x].prov[0]-'a'] = 1;
  146. break;
  147. } else {
  148. for (a = 0; a < strlen(test_list[x].req); a++) {
  149. if (pidx[test_list[x].req[a]-'a'] == 0) break;
  150. }
  151. if (a == strlen(test_list[x].req)) {
  152. y = 1;
  153. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  154. pidx[test_list[x].prov[0]-'a'] = 1;
  155. break;
  156. }
  157. }
  158. }
  159. } while (y == 1);
  160. }
  161. #define STACKBLOCK 8
  162. #define STACK_EST_USAGE 32768
  163. unsigned char stack_mask[STACKBLOCK];
  164. unsigned long stack_cur=0;
  165. void stack_masker(void)
  166. {
  167. #ifdef STACK_TEST
  168. volatile unsigned char M[STACK_EST_USAGE];
  169. stack_cur = 0;
  170. for (stack_cur = 0; stack_cur < STACK_EST_USAGE/STACKBLOCK; stack_cur++) {
  171. memcpy(M+(stack_cur*STACKBLOCK), stack_mask, STACKBLOCK);
  172. }
  173. #endif
  174. }
  175. void stack_check(void)
  176. {
  177. #ifdef STACK_TEST
  178. unsigned char M[STACK_EST_USAGE];
  179. stack_cur = 0;
  180. #ifdef STACK_DOWN
  181. while (memcmp(M+(STACK_EST_USAGE-STACKBLOCK-stack_cur), stack_mask, STACKBLOCK) &&
  182. #else
  183. while (memcmp(M+stack_cur, stack_mask, STACKBLOCK) &&
  184. #endif
  185. stack_cur < (STACK_EST_USAGE - STACKBLOCK)) {
  186. ++stack_cur;
  187. }
  188. #endif
  189. }
  190. int main(void)
  191. {
  192. int x;
  193. unsigned char buf[16];
  194. /* setup stack checker */
  195. srand(time(NULL));
  196. for (x = 0; x < STACKBLOCK; x++) {
  197. stack_mask[x] = rand() & 255;
  198. }
  199. stack_masker();
  200. printf("Built with\n%s\n", crypt_build_settings);
  201. sort();
  202. register_algs();
  203. // start dummy yarrow for internal use
  204. DO(yarrow_start(&test_yarrow));
  205. sprng_read(buf, 16, NULL);
  206. DO(yarrow_add_entropy(buf, 16, &test_yarrow));
  207. DO(yarrow_ready(&test_yarrow));
  208. // output sizes
  209. printf("Sizes of objects (in bytes)\n");
  210. printf("\tsymmetric_key\t=\t%5lu\n", sizeof(symmetric_key));
  211. printf("\thash_state\t=\t%5lu\n", sizeof(hash_state));
  212. printf("\thmac_state\t=\t%5lu\n", sizeof(hmac_state));
  213. printf("\tomac_state\t=\t%5lu\n", sizeof(omac_state));
  214. printf("\tpmac_state\t=\t%5lu\n", sizeof(pmac_state));
  215. printf("\tocb_state\t=\t%5lu\n", sizeof(ocb_state));
  216. printf("\teax_state\t=\t%5lu\n", sizeof(eax_state));
  217. printf("\tmp_int\t\t=\t%5lu\n", sizeof(mp_int));
  218. #ifdef MRSA
  219. printf("\trsa_key\t\t=\t%5lu\n", sizeof(rsa_key));
  220. #endif
  221. #ifdef MDSA
  222. printf("\tdsa_key\t\t=\t%5lu\n", sizeof(dsa_key));
  223. #endif
  224. #ifdef MDH
  225. printf("\tdh_key\t\t=\t%5lu\n", sizeof(dh_key));
  226. #endif
  227. #ifdef MECC
  228. printf("\tecc_key\t\t=\t%5lu\n", sizeof(ecc_key));
  229. #endif
  230. printf("\n\n");
  231. // do tests
  232. for (current_test = 0; tests[current_test].name != NULL; current_test++) {
  233. printf("[%-20s]: ", tests[current_test].name); fflush(stdout);
  234. printf("\t%s\n", tests[current_test].entry()==0?"passed":"failed");
  235. }
  236. return 0;
  237. }