common.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis
  2. *
  3. * LibTomCrypt is a library that provides various cryptographic
  4. * algorithms in a highly modular and flexible manner.
  5. *
  6. * The library is free for all purposes without any express
  7. * guarantee it works.
  8. */
  9. #include "common.h"
  10. /**
  11. @file common.c
  12. Steffen Jaeckel
  13. */
  14. void run_cmd(int res, int line, char *file, char *cmd, const char *algorithm)
  15. {
  16. if (res != CRYPT_OK) {
  17. fprintf(stderr, "%s (%d)%s%s\n%s:%d:%s\n",
  18. error_to_string(res), res,
  19. (algorithm ? " - " : ""), (algorithm ? algorithm : ""),
  20. file, line, cmd);
  21. if (res != CRYPT_NOP) {
  22. exit(EXIT_FAILURE);
  23. }
  24. }
  25. }
  26. void print_hex(const char* what, const void* v, const unsigned long l)
  27. {
  28. const unsigned char* p = v;
  29. unsigned long x, y = 0, z;
  30. fprintf(stderr, "%s contents: \n", what);
  31. for (x = 0; x < l; ) {
  32. fprintf(stderr, "%02X ", p[x]);
  33. if (!(++x % 16) || x == l) {
  34. if((x % 16) != 0) {
  35. z = 16 - (x % 16);
  36. if(z >= 8)
  37. fprintf(stderr, " ");
  38. for (; z != 0; --z) {
  39. fprintf(stderr, " ");
  40. }
  41. }
  42. fprintf(stderr, " | ");
  43. for(; y < x; y++) {
  44. if((y % 8) == 0)
  45. fprintf(stderr, " ");
  46. if(isgraph(p[y]))
  47. fprintf(stderr, "%c", p[y]);
  48. else
  49. fprintf(stderr, ".");
  50. }
  51. fprintf(stderr, "\n");
  52. }
  53. else if((x % 8) == 0) {
  54. fprintf(stderr, " ");
  55. }
  56. }
  57. }
  58. prng_state yarrow_prng;
  59. /*
  60. * unregister ciphers, hashes & prngs
  61. */
  62. static void _unregister_all(void)
  63. {
  64. #ifdef LTC_RIJNDAEL
  65. unregister_cipher(&aes_desc);
  66. #endif
  67. #ifdef LTC_BLOWFISH
  68. unregister_cipher(&blowfish_desc);
  69. #endif
  70. #ifdef LTC_XTEA
  71. unregister_cipher(&xtea_desc);
  72. #endif
  73. #ifdef LTC_RC5
  74. unregister_cipher(&rc5_desc);
  75. #endif
  76. #ifdef LTC_RC6
  77. unregister_cipher(&rc6_desc);
  78. #endif
  79. #ifdef LTC_SAFERP
  80. unregister_cipher(&saferp_desc);
  81. #endif
  82. #ifdef LTC_TWOFISH
  83. unregister_cipher(&twofish_desc);
  84. #endif
  85. #ifdef LTC_SAFER
  86. unregister_cipher(&safer_k64_desc);
  87. unregister_cipher(&safer_sk64_desc);
  88. unregister_cipher(&safer_k128_desc);
  89. unregister_cipher(&safer_sk128_desc);
  90. #endif
  91. #ifdef LTC_RC2
  92. unregister_cipher(&rc2_desc);
  93. #endif
  94. #ifdef LTC_DES
  95. unregister_cipher(&des_desc);
  96. unregister_cipher(&des3_desc);
  97. #endif
  98. #ifdef LTC_CAST5
  99. unregister_cipher(&cast5_desc);
  100. #endif
  101. #ifdef LTC_NOEKEON
  102. unregister_cipher(&noekeon_desc);
  103. #endif
  104. #ifdef LTC_SKIPJACK
  105. unregister_cipher(&skipjack_desc);
  106. #endif
  107. #ifdef LTC_KHAZAD
  108. unregister_cipher(&khazad_desc);
  109. #endif
  110. #ifdef LTC_ANUBIS
  111. unregister_cipher(&anubis_desc);
  112. #endif
  113. #ifdef LTC_KSEED
  114. unregister_cipher(&kseed_desc);
  115. #endif
  116. #ifdef LTC_KASUMI
  117. unregister_cipher(&kasumi_desc);
  118. #endif
  119. #ifdef LTC_MULTI2
  120. unregister_cipher(&multi2_desc);
  121. #endif
  122. #ifdef LTC_CAMELLIA
  123. unregister_cipher(&camellia_desc);
  124. #endif
  125. #ifdef LTC_TIGER
  126. unregister_hash(&tiger_desc);
  127. #endif
  128. #ifdef LTC_MD2
  129. unregister_hash(&md2_desc);
  130. #endif
  131. #ifdef LTC_MD4
  132. unregister_hash(&md4_desc);
  133. #endif
  134. #ifdef LTC_MD5
  135. unregister_hash(&md5_desc);
  136. #endif
  137. #ifdef LTC_SHA1
  138. unregister_hash(&sha1_desc);
  139. #endif
  140. #ifdef LTC_SHA224
  141. unregister_hash(&sha224_desc);
  142. #endif
  143. #ifdef LTC_SHA256
  144. unregister_hash(&sha256_desc);
  145. #endif
  146. #ifdef LTC_SHA384
  147. unregister_hash(&sha384_desc);
  148. #endif
  149. #ifdef LTC_SHA512
  150. unregister_hash(&sha512_desc);
  151. #endif
  152. #ifdef LTC_SHA512_224
  153. unregister_hash(&sha512_224_desc);
  154. #endif
  155. #ifdef LTC_SHA512_256
  156. unregister_hash(&sha512_256_desc);
  157. #endif
  158. #ifdef LTC_SHA3
  159. unregister_hash(&sha3_224_desc);
  160. unregister_hash(&sha3_256_desc);
  161. unregister_hash(&sha3_384_desc);
  162. unregister_hash(&sha3_512_desc);
  163. #endif
  164. #ifdef LTC_RIPEMD128
  165. unregister_hash(&rmd128_desc);
  166. #endif
  167. #ifdef LTC_RIPEMD160
  168. unregister_hash(&rmd160_desc);
  169. #endif
  170. #ifdef LTC_RIPEMD256
  171. unregister_hash(&rmd256_desc);
  172. #endif
  173. #ifdef LTC_RIPEMD320
  174. unregister_hash(&rmd320_desc);
  175. #endif
  176. #ifdef LTC_WHIRLPOOL
  177. unregister_hash(&whirlpool_desc);
  178. #endif
  179. #ifdef LTC_BLAKE2S
  180. unregister_hash(&blake2s_128_desc);
  181. unregister_hash(&blake2s_160_desc);
  182. unregister_hash(&blake2s_224_desc);
  183. unregister_hash(&blake2s_256_desc);
  184. #endif
  185. #ifdef LTC_BLAKE2B
  186. unregister_hash(&blake2b_160_desc);
  187. unregister_hash(&blake2b_256_desc);
  188. unregister_hash(&blake2b_384_desc);
  189. unregister_hash(&blake2b_512_desc);
  190. #endif
  191. #ifdef LTC_CHC_HASH
  192. unregister_hash(&chc_desc);
  193. #endif
  194. unregister_prng(&yarrow_desc);
  195. #ifdef LTC_FORTUNA
  196. unregister_prng(&fortuna_desc);
  197. #endif
  198. #ifdef LTC_RC4
  199. unregister_prng(&rc4_desc);
  200. #endif
  201. #ifdef LTC_CHACHA20_PRNG
  202. unregister_prng(&chacha20_prng_desc);
  203. #endif
  204. #ifdef LTC_SOBER128
  205. unregister_prng(&sober128_desc);
  206. #endif
  207. } /* _cleanup() */
  208. #ifdef LTC_PRNG_ENABLE_LTC_RNG
  209. static unsigned long my_test_rng_read;
  210. static unsigned long my_test_rng(unsigned char *buf, unsigned long len,
  211. void (*callback)(void))
  212. {
  213. unsigned long n;
  214. LTC_UNUSED_PARAM(callback);
  215. for (n = 0; n < len; ++n) {
  216. buf[n] = 4;
  217. }
  218. my_test_rng_read += n;
  219. return n;
  220. }
  221. #endif
  222. void register_algs(void)
  223. {
  224. #ifdef LTC_PRNG_ENABLE_LTC_RNG
  225. unsigned long before;
  226. #endif
  227. int err;
  228. atexit(_unregister_all);
  229. #ifdef LTC_RIJNDAEL
  230. #ifdef ENCRYPT_ONLY
  231. /* alternative would be
  232. * register_cipher (&rijndael_enc_desc);
  233. */
  234. register_cipher (&aes_enc_desc);
  235. #else
  236. /* alternative would be
  237. * register_cipher (&rijndael_desc);
  238. */
  239. register_cipher (&aes_desc);
  240. #endif
  241. #endif
  242. #ifdef LTC_BLOWFISH
  243. register_cipher (&blowfish_desc);
  244. #endif
  245. #ifdef LTC_XTEA
  246. register_cipher (&xtea_desc);
  247. #endif
  248. #ifdef LTC_RC5
  249. register_cipher (&rc5_desc);
  250. #endif
  251. #ifdef LTC_RC6
  252. register_cipher (&rc6_desc);
  253. #endif
  254. #ifdef LTC_SAFERP
  255. register_cipher (&saferp_desc);
  256. #endif
  257. #ifdef LTC_TWOFISH
  258. register_cipher (&twofish_desc);
  259. #endif
  260. #ifdef LTC_SAFER
  261. register_cipher (&safer_k64_desc);
  262. register_cipher (&safer_sk64_desc);
  263. register_cipher (&safer_k128_desc);
  264. register_cipher (&safer_sk128_desc);
  265. #endif
  266. #ifdef LTC_RC2
  267. register_cipher (&rc2_desc);
  268. #endif
  269. #ifdef LTC_DES
  270. register_cipher (&des_desc);
  271. register_cipher (&des3_desc);
  272. #endif
  273. #ifdef LTC_CAST5
  274. register_cipher (&cast5_desc);
  275. #endif
  276. #ifdef LTC_NOEKEON
  277. register_cipher (&noekeon_desc);
  278. #endif
  279. #ifdef LTC_SKIPJACK
  280. register_cipher (&skipjack_desc);
  281. #endif
  282. #ifdef LTC_ANUBIS
  283. register_cipher (&anubis_desc);
  284. #endif
  285. #ifdef LTC_KHAZAD
  286. register_cipher (&khazad_desc);
  287. #endif
  288. #ifdef LTC_KSEED
  289. register_cipher (&kseed_desc);
  290. #endif
  291. #ifdef LTC_KASUMI
  292. register_cipher (&kasumi_desc);
  293. #endif
  294. #ifdef LTC_MULTI2
  295. register_cipher (&multi2_desc);
  296. #endif
  297. #ifdef LTC_CAMELLIA
  298. register_cipher (&camellia_desc);
  299. #endif
  300. #ifdef LTC_TIGER
  301. register_hash (&tiger_desc);
  302. #endif
  303. #ifdef LTC_MD2
  304. register_hash (&md2_desc);
  305. #endif
  306. #ifdef LTC_MD4
  307. register_hash (&md4_desc);
  308. #endif
  309. #ifdef LTC_MD5
  310. register_hash (&md5_desc);
  311. #endif
  312. #ifdef LTC_SHA1
  313. register_hash (&sha1_desc);
  314. #endif
  315. #ifdef LTC_SHA224
  316. register_hash (&sha224_desc);
  317. #endif
  318. #ifdef LTC_SHA256
  319. register_hash (&sha256_desc);
  320. #endif
  321. #ifdef LTC_SHA384
  322. register_hash (&sha384_desc);
  323. #endif
  324. #ifdef LTC_SHA512
  325. register_hash (&sha512_desc);
  326. #endif
  327. #ifdef LTC_SHA512_224
  328. register_hash (&sha512_224_desc);
  329. #endif
  330. #ifdef LTC_SHA512_256
  331. register_hash (&sha512_256_desc);
  332. #endif
  333. #ifdef LTC_SHA3
  334. register_hash (&sha3_224_desc);
  335. register_hash (&sha3_256_desc);
  336. register_hash (&sha3_384_desc);
  337. register_hash (&sha3_512_desc);
  338. #endif
  339. #ifdef LTC_RIPEMD128
  340. register_hash (&rmd128_desc);
  341. #endif
  342. #ifdef LTC_RIPEMD160
  343. register_hash (&rmd160_desc);
  344. #endif
  345. #ifdef LTC_RIPEMD256
  346. register_hash (&rmd256_desc);
  347. #endif
  348. #ifdef LTC_RIPEMD320
  349. register_hash (&rmd320_desc);
  350. #endif
  351. #ifdef LTC_WHIRLPOOL
  352. register_hash (&whirlpool_desc);
  353. #endif
  354. #ifdef LTC_BLAKE2S
  355. register_hash(&blake2s_128_desc);
  356. register_hash(&blake2s_160_desc);
  357. register_hash(&blake2s_224_desc);
  358. register_hash(&blake2s_256_desc);
  359. #endif
  360. #ifdef LTC_BLAKE2S
  361. register_hash(&blake2b_160_desc);
  362. register_hash(&blake2b_256_desc);
  363. register_hash(&blake2b_384_desc);
  364. register_hash(&blake2b_512_desc);
  365. #endif
  366. #ifdef LTC_CHC_HASH
  367. register_hash(&chc_desc);
  368. if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) {
  369. fprintf(stderr, "chc_register error: %s\n", error_to_string(err));
  370. exit(EXIT_FAILURE);
  371. }
  372. #endif
  373. #ifndef LTC_YARROW
  374. #error This demo requires Yarrow.
  375. #endif
  376. register_prng(&yarrow_desc);
  377. #ifdef LTC_FORTUNA
  378. register_prng(&fortuna_desc);
  379. #endif
  380. #ifdef LTC_RC4
  381. register_prng(&rc4_desc);
  382. #endif
  383. #ifdef LTC_CHACHA20_PRNG
  384. register_prng(&chacha20_prng_desc);
  385. #endif
  386. #ifdef LTC_SOBER128
  387. register_prng(&sober128_desc);
  388. #endif
  389. #ifdef LTC_SPRNG
  390. register_prng(&sprng_desc);
  391. #endif
  392. #ifdef LTC_PRNG_ENABLE_LTC_RNG
  393. ltc_rng = my_test_rng;
  394. before = my_test_rng_read;
  395. if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) {
  396. fprintf(stderr, "rng_make_prng with 'my_test_rng' failed: %s\n", error_to_string(err));
  397. exit(EXIT_FAILURE);
  398. }
  399. if (before == my_test_rng_read) {
  400. fprintf(stderr, "somehow there was no read from the ltc_rng! %lu == %lu\n", before, my_test_rng_read);
  401. exit(EXIT_FAILURE);
  402. }
  403. ltc_rng = NULL;
  404. #endif
  405. if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) {
  406. fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err));
  407. exit(EXIT_FAILURE);
  408. }
  409. if (strcmp("CRYPT_OK", error_to_string(err))) {
  410. exit(EXIT_FAILURE);
  411. }
  412. }
  413. void setup_math(void)
  414. {
  415. #ifdef USE_LTM
  416. ltc_mp = ltm_desc;
  417. #elif defined(USE_TFM)
  418. ltc_mp = tfm_desc;
  419. #elif defined(USE_GMP)
  420. ltc_mp = gmp_desc;
  421. #elif defined(EXT_MATH_LIB)
  422. extern ltc_math_descriptor EXT_MATH_LIB;
  423. ltc_mp = EXT_MATH_LIB;
  424. #else
  425. fprintf(stderr, "No MPI provider available\n");
  426. exit(EXIT_FAILURE);
  427. #endif
  428. }