test.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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. if (register_prng(&yarrow_desc) == -1) {
  107. printf("Error registering yarrow PRNG\n");
  108. exit(-1);
  109. }
  110. if (register_prng(&sprng_desc) == -1) {
  111. printf("Error registering sprng PRNG\n");
  112. exit(-1);
  113. }
  114. }
  115. /* sort tests based on their requirement/services. Helps make sure dependencies are tested first */
  116. void sort(void)
  117. {
  118. unsigned x, y, z, a, pidx[26];
  119. /* find out where things are provided */
  120. zeromem(pidx, sizeof(pidx));
  121. z = 0;
  122. do {
  123. y = 0;
  124. for (x = 0; test_list[x].name != NULL; x++) {
  125. if (test_list[x].entry == NULL) continue;
  126. if (strlen(test_list[x].prov) == 0) {
  127. y = 1;
  128. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  129. pidx[test_list[x].prov[0]-'a'] = 1;
  130. break;
  131. } else {
  132. for (a = 0; a < strlen(test_list[x].req); a++) {
  133. if (pidx[test_list[x].req[a]-'a'] == 0) break;
  134. }
  135. if (a == strlen(test_list[x].req)) {
  136. y = 1;
  137. tests[z++] = test_list[x]; test_list[x].entry = NULL;
  138. pidx[test_list[x].prov[0]-'a'] = 1;
  139. break;
  140. }
  141. }
  142. }
  143. } while (y == 1);
  144. }
  145. #define STACKBLOCK 8
  146. #define STACK_EST_USAGE 32768
  147. unsigned char stack_mask[STACKBLOCK];
  148. unsigned long stack_cur=0;
  149. void stack_masker(void)
  150. {
  151. #ifdef STACK_TEST
  152. volatile unsigned char M[STACK_EST_USAGE];
  153. stack_cur = 0;
  154. for (stack_cur = 0; stack_cur < STACK_EST_USAGE/STACKBLOCK; stack_cur++) {
  155. memcpy(M+(stack_cur*STACKBLOCK), stack_mask, STACKBLOCK);
  156. }
  157. #endif
  158. }
  159. void stack_check(void)
  160. {
  161. #ifdef STACK_TEST
  162. unsigned char M[STACK_EST_USAGE];
  163. stack_cur = 0;
  164. #ifdef STACK_DOWN
  165. while (memcmp(M+(STACK_EST_USAGE-STACKBLOCK-stack_cur), stack_mask, STACKBLOCK) &&
  166. #else
  167. while (memcmp(M+stack_cur, stack_mask, STACKBLOCK) &&
  168. #endif
  169. stack_cur < (STACK_EST_USAGE - STACKBLOCK)) {
  170. ++stack_cur;
  171. }
  172. #endif
  173. }
  174. int main(void)
  175. {
  176. int x;
  177. /* setup stack checker */
  178. srand(time(NULL));
  179. for (x = 0; x < STACKBLOCK; x++) {
  180. stack_mask[x] = rand() & 255;
  181. }
  182. stack_masker();
  183. printf("Built with\n%s\n", crypt_build_settings);
  184. sort();
  185. register_algs();
  186. // start dummy yarrow for internal use
  187. DO(yarrow_start(&test_yarrow));
  188. DO(yarrow_add_entropy("test", 4, &test_yarrow));
  189. DO(yarrow_ready(&test_yarrow));
  190. // output sizes
  191. printf("Sizes of objects (in bytes)\n");
  192. printf("\tsymmetric_key\t=\t%5d\n", sizeof(symmetric_key));
  193. printf("\thash_state\t=\t%5d\n", sizeof(hash_state));
  194. printf("\thmac_state\t=\t%5d\n", sizeof(hmac_state));
  195. printf("\tomac_state\t=\t%5d\n", sizeof(omac_state));
  196. printf("\tpmac_state\t=\t%5d\n", sizeof(pmac_state));
  197. printf("\tocb_state\t=\t%5d\n", sizeof(ocb_state));
  198. printf("\teax_state\t=\t%5d\n", sizeof(eax_state));
  199. printf("\tmp_int\t\t=\t%5d\n", sizeof(mp_int));
  200. printf("\trsa_key\t\t=\t%5d\n", sizeof(rsa_key));
  201. printf("\tdsa_key\t\t=\t%5d\n", sizeof(dsa_key));
  202. printf("\tdh_key\t\t=\t%5d\n", sizeof(dh_key));
  203. printf("\tecc_key\t\t=\t%5d\n", sizeof(ecc_key));
  204. printf("\n\n");
  205. // do tests
  206. for (current_test = 0; tests[current_test].name != NULL; current_test++) {
  207. printf("[%-20s]: ", tests[current_test].name); fflush(stdout);
  208. printf("\t%s\n", tests[current_test].entry()==0?"passed":"failed");
  209. }
  210. return 0;
  211. }