test.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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 KHAZAD
  73. register_cipher (&khazad_desc);
  74. #endif
  75. #ifdef ANUBIS
  76. register_cipher (&anubis_desc);
  77. #endif
  78. #ifdef TIGER
  79. register_hash (&tiger_desc);
  80. #endif
  81. #ifdef MD2
  82. register_hash (&md2_desc);
  83. #endif
  84. #ifdef MD4
  85. register_hash (&md4_desc);
  86. #endif
  87. #ifdef MD5
  88. register_hash (&md5_desc);
  89. #endif
  90. #ifdef SHA1
  91. register_hash (&sha1_desc);
  92. #endif
  93. #ifdef SHA256
  94. register_hash (&sha256_desc);
  95. #endif
  96. #ifdef SHA224
  97. register_hash (&sha224_desc);
  98. #endif
  99. #ifdef SHA384
  100. register_hash (&sha384_desc);
  101. #endif
  102. #ifdef SHA512
  103. register_hash (&sha512_desc);
  104. #endif
  105. #ifdef RIPEMD128
  106. register_hash (&rmd128_desc);
  107. #endif
  108. #ifdef RIPEMD160
  109. register_hash (&rmd160_desc);
  110. #endif
  111. #ifdef WHIRLPOOL
  112. register_hash (&whirlpool_desc);
  113. #endif
  114. #ifdef CHC_HASH
  115. register_hash(&chc_desc);
  116. if ((err = chc_register(register_cipher(&aes_enc_desc))) != CRYPT_OK) {
  117. printf("chc_register error: %s\n", error_to_string(err));
  118. exit(EXIT_FAILURE);
  119. }
  120. #endif
  121. #ifdef YARROW
  122. register_prng(&yarrow_desc);
  123. #endif
  124. #ifdef FORTUNA
  125. register_prng(&fortuna_desc);
  126. #endif
  127. #ifdef RC4
  128. register_prng(&rc4_desc);
  129. #endif
  130. #ifdef SPRNG
  131. register_prng(&sprng_desc);
  132. #endif
  133. #ifdef SOBER128
  134. register_prng(&sober128_desc);
  135. #endif
  136. }
  137. /* sort tests based on their requirement/services. Helps make sure dependencies are tested first */
  138. void sort(void)
  139. {
  140. unsigned x, y, z, a, pidx[26];
  141. /* find out where things are provided */
  142. zeromem(pidx, sizeof(pidx));
  143. z = 0;
  144. do {
  145. y = 0;
  146. for (x = 0; test_list[x].name != NULL; x++) {
  147. if (test_list[x].entry == NULL) continue;
  148. if (strlen(test_list[x].prov) == 0) {
  149. y = 1;
  150. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  151. pidx[test_list[x].prov[0]-'a'] = 1;
  152. break;
  153. } else {
  154. for (a = 0; a < strlen(test_list[x].req); a++) {
  155. if (pidx[test_list[x].req[a]-'a'] == 0) break;
  156. }
  157. if (a == strlen(test_list[x].req)) {
  158. y = 1;
  159. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  160. pidx[test_list[x].prov[0]-'a'] = 1;
  161. break;
  162. }
  163. }
  164. }
  165. } while (y == 1);
  166. }
  167. #define STACKBLOCK 8
  168. #define STACK_EST_USAGE 32768
  169. unsigned char stack_mask[STACKBLOCK];
  170. unsigned long stack_cur=0;
  171. void stack_masker(void)
  172. {
  173. #ifdef STACK_TEST
  174. volatile unsigned char M[STACK_EST_USAGE];
  175. stack_cur = 0;
  176. for (stack_cur = 0; stack_cur < STACK_EST_USAGE/STACKBLOCK; stack_cur++) {
  177. memcpy(M+(stack_cur*STACKBLOCK), stack_mask, STACKBLOCK);
  178. }
  179. #endif
  180. }
  181. void stack_check(void)
  182. {
  183. #ifdef STACK_TEST
  184. unsigned char M[STACK_EST_USAGE];
  185. stack_cur = 0;
  186. #ifdef STACK_DOWN
  187. while (memcmp(M+(STACK_EST_USAGE-STACKBLOCK-stack_cur), stack_mask, STACKBLOCK) &&
  188. #else
  189. while (memcmp(M+stack_cur, stack_mask, STACKBLOCK) &&
  190. #endif
  191. stack_cur < (STACK_EST_USAGE - STACKBLOCK)) {
  192. ++stack_cur;
  193. }
  194. #endif
  195. }
  196. int main(void)
  197. {
  198. int x;
  199. unsigned char buf[16];
  200. /* setup stack checker */
  201. srand(time(NULL));
  202. for (x = 0; x < STACKBLOCK; x++) {
  203. stack_mask[x] = rand() & 255;
  204. }
  205. stack_masker();
  206. printf("Built with\n%s\n", crypt_build_settings);
  207. sort();
  208. register_algs();
  209. // start dummy yarrow for internal use
  210. DO(yarrow_start(&test_yarrow));
  211. sprng_read(buf, 16, NULL);
  212. DO(yarrow_add_entropy(buf, 16, &test_yarrow));
  213. DO(yarrow_ready(&test_yarrow));
  214. // output sizes (this will crash MSVC... go figure.)
  215. #ifndef _MSC_VER
  216. printf("Sizes of objects (in bytes)\n");
  217. printf("\tsymmetric_key\t=\t%5Zu\n", sizeof(symmetric_key));
  218. printf("\thash_state\t=\t%5Zu\n", sizeof(hash_state));
  219. printf("\thmac_state\t=\t%5Zu\n", sizeof(hmac_state));
  220. printf("\tomac_state\t=\t%5Zu\n", sizeof(omac_state));
  221. printf("\tpmac_state\t=\t%5Zu\n", sizeof(pmac_state));
  222. printf("\tocb_state\t=\t%5Zu\n", sizeof(ocb_state));
  223. printf("\teax_state\t=\t%5Zu\n", sizeof(eax_state));
  224. printf("\tmp_int\t\t=\t%5Zu\n", sizeof(mp_int));
  225. #ifdef MRSA
  226. printf("\trsa_key\t\t=\t%5Zu\n", sizeof(rsa_key));
  227. #endif
  228. #ifdef MDSA
  229. printf("\tdsa_key\t\t=\t%5Zu\n", sizeof(dsa_key));
  230. #endif
  231. #ifdef MDH
  232. printf("\tdh_key\t\t=\t%5Zu\n", sizeof(dh_key));
  233. #endif
  234. #ifdef MECC
  235. printf("\tecc_key\t\t=\t%5Zu\n", sizeof(ecc_key));
  236. #endif
  237. printf("\n\n");
  238. #endif
  239. // do tests
  240. for (current_test = 0; tests[current_test].name != NULL; current_test++) {
  241. printf("[%-20s]: ", tests[current_test].name); fflush(stdout);
  242. printf("\t%s\n", tests[current_test].entry()==0?"passed":"failed");
  243. }
  244. return 0;
  245. }