test.c 6.0 KB

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