123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- /* LibTomCrypt, modular cryptographic library -- Tom St Denis
- *
- * LibTomCrypt is a library that provides various cryptographic
- * algorithms in a highly modular and flexible manner.
- *
- * The library is free for all purposes without any express
- * guarantee it works.
- */
- #include "common.h"
- /**
- @file common.c
- Steffen Jaeckel
- */
- void run_cmd(int res, int line, char *file, char *cmd, const char *algorithm)
- {
- if (res != CRYPT_OK) {
- fprintf(stderr, "%s (%d)%s%s\n%s:%d:%s\n",
- error_to_string(res), res,
- (algorithm ? " - " : ""), (algorithm ? algorithm : ""),
- file, line, cmd);
- if (res != CRYPT_NOP) {
- exit(EXIT_FAILURE);
- }
- }
- }
- void print_hex(const char* what, const void* v, const unsigned long l)
- {
- const unsigned char* p = v;
- unsigned long x, y = 0, z;
- fprintf(stderr, "%s contents: \n", what);
- for (x = 0; x < l; ) {
- fprintf(stderr, "%02X ", p[x]);
- if (!(++x % 16) || x == l) {
- if((x % 16) != 0) {
- z = 16 - (x % 16);
- if(z >= 8)
- fprintf(stderr, " ");
- for (; z != 0; --z) {
- fprintf(stderr, " ");
- }
- }
- fprintf(stderr, " | ");
- for(; y < x; y++) {
- if((y % 8) == 0)
- fprintf(stderr, " ");
- if(isgraph(p[y]))
- fprintf(stderr, "%c", p[y]);
- else
- fprintf(stderr, ".");
- }
- fprintf(stderr, "\n");
- }
- else if((x % 8) == 0) {
- fprintf(stderr, " ");
- }
- }
- }
- prng_state yarrow_prng;
- /*
- * unregister ciphers, hashes & prngs
- */
- static void _unregister_all(void)
- {
- #ifdef LTC_RIJNDAEL
- unregister_cipher(&aes_desc);
- #endif
- #ifdef LTC_BLOWFISH
- unregister_cipher(&blowfish_desc);
- #endif
- #ifdef LTC_XTEA
- unregister_cipher(&xtea_desc);
- #endif
- #ifdef LTC_RC5
- unregister_cipher(&rc5_desc);
- #endif
- #ifdef LTC_RC6
- unregister_cipher(&rc6_desc);
- #endif
- #ifdef LTC_SAFERP
- unregister_cipher(&saferp_desc);
- #endif
- #ifdef LTC_TWOFISH
- unregister_cipher(&twofish_desc);
- #endif
- #ifdef LTC_SAFER
- unregister_cipher(&safer_k64_desc);
- unregister_cipher(&safer_sk64_desc);
- unregister_cipher(&safer_k128_desc);
- unregister_cipher(&safer_sk128_desc);
- #endif
- #ifdef LTC_RC2
- unregister_cipher(&rc2_desc);
- #endif
- #ifdef LTC_DES
- unregister_cipher(&des_desc);
- unregister_cipher(&des3_desc);
- #endif
- #ifdef LTC_CAST5
- unregister_cipher(&cast5_desc);
- #endif
- #ifdef LTC_NOEKEON
- unregister_cipher(&noekeon_desc);
- #endif
- #ifdef LTC_SKIPJACK
- unregister_cipher(&skipjack_desc);
- #endif
- #ifdef LTC_KHAZAD
- unregister_cipher(&khazad_desc);
- #endif
- #ifdef LTC_ANUBIS
- unregister_cipher(&anubis_desc);
- #endif
- #ifdef LTC_KSEED
- unregister_cipher(&kseed_desc);
- #endif
- #ifdef LTC_KASUMI
- unregister_cipher(&kasumi_desc);
- #endif
- #ifdef LTC_MULTI2
- unregister_cipher(&multi2_desc);
- #endif
- #ifdef LTC_CAMELLIA
- unregister_cipher(&camellia_desc);
- #endif
- #ifdef LTC_TIGER
- unregister_hash(&tiger_desc);
- #endif
- #ifdef LTC_MD2
- unregister_hash(&md2_desc);
- #endif
- #ifdef LTC_MD4
- unregister_hash(&md4_desc);
- #endif
- #ifdef LTC_MD5
- unregister_hash(&md5_desc);
- #endif
- #ifdef LTC_SHA1
- unregister_hash(&sha1_desc);
- #endif
- #ifdef LTC_SHA224
- unregister_hash(&sha224_desc);
- #endif
- #ifdef LTC_SHA256
- unregister_hash(&sha256_desc);
- #endif
- #ifdef LTC_SHA384
- unregister_hash(&sha384_desc);
- #endif
- #ifdef LTC_SHA512
- unregister_hash(&sha512_desc);
- #endif
- #ifdef LTC_SHA512_224
- unregister_hash(&sha512_224_desc);
- #endif
- #ifdef LTC_SHA512_256
- unregister_hash(&sha512_256_desc);
- #endif
- #ifdef LTC_SHA3
- unregister_hash(&sha3_224_desc);
- unregister_hash(&sha3_256_desc);
- unregister_hash(&sha3_384_desc);
- unregister_hash(&sha3_512_desc);
- #endif
- #ifdef LTC_RIPEMD128
- unregister_hash(&rmd128_desc);
- #endif
- #ifdef LTC_RIPEMD160
- unregister_hash(&rmd160_desc);
- #endif
- #ifdef LTC_RIPEMD256
- unregister_hash(&rmd256_desc);
- #endif
- #ifdef LTC_RIPEMD320
- unregister_hash(&rmd320_desc);
- #endif
- #ifdef LTC_WHIRLPOOL
- unregister_hash(&whirlpool_desc);
- #endif
- #ifdef LTC_BLAKE2S
- unregister_hash(&blake2s_128_desc);
- unregister_hash(&blake2s_160_desc);
- unregister_hash(&blake2s_224_desc);
- unregister_hash(&blake2s_256_desc);
- #endif
- #ifdef LTC_BLAKE2B
- unregister_hash(&blake2b_160_desc);
- unregister_hash(&blake2b_256_desc);
- unregister_hash(&blake2b_384_desc);
- unregister_hash(&blake2b_512_desc);
- #endif
- #ifdef LTC_CHC_HASH
- unregister_hash(&chc_desc);
- #endif
- unregister_prng(&yarrow_desc);
- #ifdef LTC_FORTUNA
- unregister_prng(&fortuna_desc);
- #endif
- #ifdef LTC_RC4
- unregister_prng(&rc4_desc);
- #endif
- #ifdef LTC_CHACHA20_PRNG
- unregister_prng(&chacha20_prng_desc);
- #endif
- #ifdef LTC_SOBER128
- unregister_prng(&sober128_desc);
- #endif
- } /* _cleanup() */
- #ifdef LTC_PRNG_ENABLE_LTC_RNG
- static unsigned long my_test_rng_read;
- static unsigned long my_test_rng(unsigned char *buf, unsigned long len,
- void (*callback)(void))
- {
- unsigned long n;
- LTC_UNUSED_PARAM(callback);
- for (n = 0; n < len; ++n) {
- buf[n] = 4;
- }
- my_test_rng_read += n;
- return n;
- }
- #endif
- void register_algs(void)
- {
- #ifdef LTC_PRNG_ENABLE_LTC_RNG
- unsigned long before;
- #endif
- int err;
- atexit(_unregister_all);
- #ifdef LTC_RIJNDAEL
- #ifdef ENCRYPT_ONLY
- /* alternative would be
- * register_cipher (&rijndael_enc_desc);
- */
- register_cipher (&aes_enc_desc);
- #else
- /* alternative would be
- * register_cipher (&rijndael_desc);
- */
- register_cipher (&aes_desc);
- #endif
- #endif
- #ifdef LTC_BLOWFISH
- register_cipher (&blowfish_desc);
- #endif
- #ifdef LTC_XTEA
- register_cipher (&xtea_desc);
- #endif
- #ifdef LTC_RC5
- register_cipher (&rc5_desc);
- #endif
- #ifdef LTC_RC6
- register_cipher (&rc6_desc);
- #endif
- #ifdef LTC_SAFERP
- register_cipher (&saferp_desc);
- #endif
- #ifdef LTC_TWOFISH
- register_cipher (&twofish_desc);
- #endif
- #ifdef LTC_SAFER
- register_cipher (&safer_k64_desc);
- register_cipher (&safer_sk64_desc);
- register_cipher (&safer_k128_desc);
- register_cipher (&safer_sk128_desc);
- #endif
- #ifdef LTC_RC2
- register_cipher (&rc2_desc);
- #endif
- #ifdef LTC_DES
- register_cipher (&des_desc);
- register_cipher (&des3_desc);
- #endif
- #ifdef LTC_CAST5
- register_cipher (&cast5_desc);
- #endif
- #ifdef LTC_NOEKEON
- register_cipher (&noekeon_desc);
- #endif
- #ifdef LTC_SKIPJACK
- register_cipher (&skipjack_desc);
- #endif
- #ifdef LTC_ANUBIS
- register_cipher (&anubis_desc);
- #endif
- #ifdef LTC_KHAZAD
- register_cipher (&khazad_desc);
- #endif
- #ifdef LTC_KSEED
- register_cipher (&kseed_desc);
- #endif
- #ifdef LTC_KASUMI
- register_cipher (&kasumi_desc);
- #endif
- #ifdef LTC_MULTI2
- register_cipher (&multi2_desc);
- #endif
- #ifdef LTC_CAMELLIA
- register_cipher (&camellia_desc);
- #endif
- #ifdef LTC_TIGER
- register_hash (&tiger_desc);
- #endif
- #ifdef LTC_MD2
- register_hash (&md2_desc);
- #endif
- #ifdef LTC_MD4
- register_hash (&md4_desc);
- #endif
- #ifdef LTC_MD5
- register_hash (&md5_desc);
- #endif
- #ifdef LTC_SHA1
- register_hash (&sha1_desc);
- #endif
- #ifdef LTC_SHA224
- register_hash (&sha224_desc);
- #endif
- #ifdef LTC_SHA256
- register_hash (&sha256_desc);
- #endif
- #ifdef LTC_SHA384
- register_hash (&sha384_desc);
- #endif
- #ifdef LTC_SHA512
- register_hash (&sha512_desc);
- #endif
- #ifdef LTC_SHA512_224
- register_hash (&sha512_224_desc);
- #endif
- #ifdef LTC_SHA512_256
- register_hash (&sha512_256_desc);
- #endif
- #ifdef LTC_SHA3
- register_hash (&sha3_224_desc);
- register_hash (&sha3_256_desc);
- register_hash (&sha3_384_desc);
- register_hash (&sha3_512_desc);
- #endif
- #ifdef LTC_RIPEMD128
- register_hash (&rmd128_desc);
- #endif
- #ifdef LTC_RIPEMD160
- register_hash (&rmd160_desc);
- #endif
- #ifdef LTC_RIPEMD256
- register_hash (&rmd256_desc);
- #endif
- #ifdef LTC_RIPEMD320
- register_hash (&rmd320_desc);
- #endif
- #ifdef LTC_WHIRLPOOL
- register_hash (&whirlpool_desc);
- #endif
- #ifdef LTC_BLAKE2S
- register_hash(&blake2s_128_desc);
- register_hash(&blake2s_160_desc);
- register_hash(&blake2s_224_desc);
- register_hash(&blake2s_256_desc);
- #endif
- #ifdef LTC_BLAKE2S
- register_hash(&blake2b_160_desc);
- register_hash(&blake2b_256_desc);
- register_hash(&blake2b_384_desc);
- register_hash(&blake2b_512_desc);
- #endif
- #ifdef LTC_CHC_HASH
- register_hash(&chc_desc);
- if ((err = chc_register(register_cipher(&aes_desc))) != CRYPT_OK) {
- fprintf(stderr, "chc_register error: %s\n", error_to_string(err));
- exit(EXIT_FAILURE);
- }
- #endif
- #ifndef LTC_YARROW
- #error This demo requires Yarrow.
- #endif
- register_prng(&yarrow_desc);
- #ifdef LTC_FORTUNA
- register_prng(&fortuna_desc);
- #endif
- #ifdef LTC_RC4
- register_prng(&rc4_desc);
- #endif
- #ifdef LTC_CHACHA20_PRNG
- register_prng(&chacha20_prng_desc);
- #endif
- #ifdef LTC_SOBER128
- register_prng(&sober128_desc);
- #endif
- #ifdef LTC_SPRNG
- register_prng(&sprng_desc);
- #endif
- #ifdef LTC_PRNG_ENABLE_LTC_RNG
- ltc_rng = my_test_rng;
- before = my_test_rng_read;
- if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) {
- fprintf(stderr, "rng_make_prng with 'my_test_rng' failed: %s\n", error_to_string(err));
- exit(EXIT_FAILURE);
- }
- if (before == my_test_rng_read) {
- fprintf(stderr, "somehow there was no read from the ltc_rng! %lu == %lu\n", before, my_test_rng_read);
- exit(EXIT_FAILURE);
- }
- ltc_rng = NULL;
- #endif
- if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) {
- fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err));
- exit(EXIT_FAILURE);
- }
- if (strcmp("CRYPT_OK", error_to_string(err))) {
- exit(EXIT_FAILURE);
- }
- }
- void setup_math(void)
- {
- #ifdef USE_LTM
- ltc_mp = ltm_desc;
- #elif defined(USE_TFM)
- ltc_mp = tfm_desc;
- #elif defined(USE_GMP)
- ltc_mp = gmp_desc;
- #elif defined(EXT_MATH_LIB)
- extern ltc_math_descriptor EXT_MATH_LIB;
- ltc_mp = EXT_MATH_LIB;
- #else
- fprintf(stderr, "No MPI provider available\n");
- exit(EXIT_FAILURE);
- #endif
- }
|