crypt.c
来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C语言 代码 · 共 591 行
C
591 行
/* 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 * gurantee it works. * * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org */#include "mycrypt.h"#ifndef WINCE#include <signal.h>#endif#define TAB_SIZE 32struct _cipher_descriptor cipher_descriptor[TAB_SIZE] = {{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL } };struct _hash_descriptor hash_descriptor[TAB_SIZE] = {{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL },{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL } };struct _prng_descriptor prng_descriptor[TAB_SIZE] = {{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL },{ NULL, NULL, NULL, NULL, NULL } };/* ch1-01-1 */#if (ARGTYPE == 0)void crypt_argchk(char *v, char *s, int d){ fprintf(stderr, "_ARGCHK '%s' failure on line %d of file %s\n", v, d, s); (void)raise(SIGABRT);}#endif/* ch1-01-1 */int find_cipher(const char *name){ int x; _ARGCHK(name != NULL); for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name != NULL && !strcmp(cipher_descriptor[x].name, name)) { return x; } } return -1;}int find_hash(const char *name){ int x; _ARGCHK(name != NULL); for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].name != NULL && strcmp(hash_descriptor[x].name, name) == 0) { return x; } } return -1;}int find_prng(const char *name){ int x; _ARGCHK(name != NULL); for (x = 0; x < TAB_SIZE; x++) { if ((prng_descriptor[x].name != NULL) && strcmp(prng_descriptor[x].name, name) == 0) { return x; } } return -1;}int find_cipher_id(unsigned char ID){ int x; for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].ID == ID) { return (cipher_descriptor[x].name == NULL) ? -1 : x; } } return -1;}int find_hash_id(unsigned char ID){ int x; for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].ID == ID) { return (hash_descriptor[x].name == NULL) ? -1 : x; } } return -1;}/* idea from Wayne Scott */int find_cipher_any(const char *name, int blocklen, int keylen){ int x; _ARGCHK(name != NULL); x = find_cipher(name); if (x != -1) return x; for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name == NULL) { continue; } if (blocklen <= (int)cipher_descriptor[x].block_length && keylen <= (int)cipher_descriptor[x].max_key_length) { return x; } } return -1;}/* return first hash with at least [amount over] digestlen bytes of output */int find_hash_any(const char *name, int digestlen){ int x, y, z; _ARGCHK(name != NULL); x = find_hash(name); if (x != -1) return x; y = MAXBLOCKSIZE+1; z = -1; for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].name == NULL) { continue; } if ((int)hash_descriptor[x].hashsize >= digestlen && (int)hash_descriptor[x].hashsize < y) { z = x; y = hash_descriptor[x].hashsize; } } return z;}int register_cipher(const struct _cipher_descriptor *cipher){ int x; _ARGCHK(cipher != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name != NULL && cipher_descriptor[x].ID == cipher->ID) { return x; } } /* find a blank spot */ for (x = 0; x < TAB_SIZE; x++) { if (cipher_descriptor[x].name == NULL) { memcpy(&cipher_descriptor[x], cipher, sizeof(struct _cipher_descriptor)); return x; } } /* no spot */ return -1;}int unregister_cipher(const struct _cipher_descriptor *cipher){ int x; _ARGCHK(cipher != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&cipher_descriptor[x], cipher, sizeof(struct _cipher_descriptor)) == 0) { cipher_descriptor[x].name = NULL; cipher_descriptor[x].ID = 255; return CRYPT_OK; } } return CRYPT_ERROR;}int register_hash(const struct _hash_descriptor *hash){ int x; _ARGCHK(hash != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&hash_descriptor[x], hash, sizeof(struct _hash_descriptor)) == 0) { return x; } } /* find a blank spot */ for (x = 0; x < TAB_SIZE; x++) { if (hash_descriptor[x].name == NULL) { memcpy(&hash_descriptor[x], hash, sizeof(struct _hash_descriptor)); return x; } } /* no spot */ return -1;}int unregister_hash(const struct _hash_descriptor *hash){ int x; _ARGCHK(hash != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&hash_descriptor[x], hash, sizeof(struct _hash_descriptor)) == 0) { hash_descriptor[x].name = NULL; return CRYPT_OK; } } return CRYPT_ERROR;}int register_prng(const struct _prng_descriptor *prng){ int x; _ARGCHK(prng != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&prng_descriptor[x], prng, sizeof(struct _prng_descriptor)) == 0) { return x; } } /* find a blank spot */ for (x = 0; x < TAB_SIZE; x++) { if (prng_descriptor[x].name == NULL) { memcpy(&prng_descriptor[x], prng, sizeof(struct _prng_descriptor)); return x; } } /* no spot */ return -1;}int unregister_prng(const struct _prng_descriptor *prng){ int x; _ARGCHK(prng != NULL); /* is it already registered? */ for (x = 0; x < TAB_SIZE; x++) { if (memcmp(&prng_descriptor[x], prng, sizeof(struct _prng_descriptor)) != 0) { prng_descriptor[x].name = NULL; return CRYPT_OK; } } return CRYPT_ERROR;}int cipher_is_valid(int idx){ if (idx < 0 || idx >= TAB_SIZE || cipher_descriptor[idx].name == NULL) { return CRYPT_INVALID_CIPHER; } return CRYPT_OK;}int hash_is_valid(int idx){ if (idx < 0 || idx >= TAB_SIZE || hash_descriptor[idx].name == NULL) { return CRYPT_INVALID_HASH; } return CRYPT_OK;}int prng_is_valid(int idx){ if (idx < 0 || idx >= TAB_SIZE || prng_descriptor[idx].name == NULL) { return CRYPT_INVALID_PRNG; } return CRYPT_OK;}const char *crypt_build_settings = "LibTomCrypt " SCRYPT "\n\n" "Endianess: "#if defined(ENDIAN_NEUTRAL) "neutral\n"#elif defined(ENDIAN_LITTLE) "little" #if defined(ENDIAN_32BITWORD) " (32-bit words)\n" #else " (64-bit words)\n" #endif#elif defined(ENDIAN_BIG) "big" #if defined(ENDIAN_32BITWORD) " (32-bit words)\n" #else " (64-bit words)\n" #endif#endif "Clean stack: "#if defined(CLEAN_STACK) "enabled\n"#else "disabled\n"#endif "Ciphers built-in:\n"#if defined(BLOWFISH) " Blowfish\n"#endif#if defined(RC2) " RC2\n"#endif#if defined(RC5) " RC5\n"#endif#if defined(RC6) " RC6\n"#endif#if defined(SAFERP) " Safer+\n"#endif#if defined(SAFER) " Safer\n"#endif#if defined(RIJNDAEL) " Rijndael\n"#endif#if defined(XTEA) " XTEA\n"#endif#if defined(TWOFISH) " Twofish " #if defined(TWOFISH_SMALL) && defined(TWOFISH_TABLES) "(small, tables)\n" #elif defined(TWOFISH_SMALL) "(small)\n" #elif defined(TWOFISH_TABLES) "(tables)\n" #else "\n" #endif#endif#if defined(DES) " DES\n"#endif#if defined(CAST5) " CAST5\n"#endif#if defined(NOEKEON) " Noekeon\n"#endif#if defined(SKIPJACK) " Skipjack\n"#endif "\nHashes built-in:\n"#if defined(SHA512) " SHA-512\n"#endif#if defined(SHA384) " SHA-384\n"#endif#if defined(SHA256) " SHA-256\n"#endif#if defined(SHA224) " SHA-224\n"#endif#if defined(TIGER) " TIGER\n"#endif#if defined(SHA1) " SHA1\n"#endif#if defined(MD5) " MD5\n"#endif#if defined(MD4) " MD4\n"#endif#if defined(MD2) " MD2\n"#endif#if defined(RIPEMD128) " RIPEMD128\n"#endif#if defined(RIPEMD160) " RIPEMD160\n"#endif "\nBlock Chaining Modes:\n"#if defined(CFB) " CFB\n"#endif#if defined(OFB) " OFB\n"#endif#if defined(ECB) " ECB\n"#endif#if defined(CBC) " CBC\n"#endif#if defined(CTR) " CTR\n"#endif "\nPRNG:\n"#if defined(YARROW) " Yarrow\n"#endif#if defined(SPRNG) " SPRNG\n"#endif#if defined(RC4) " RC4\n"#endif "\nPK Algs:\n"#if defined(MRSA) " RSA\n"#endif#if defined(MDH) " DH\n"#endif#if defined(MECC) " ECC\n"#endif#if defined(MDSA) " DSA\n"#endif#if defined(KR) " KR\n"#endif "\nCompiler:\n"#if defined(WIN32) " WIN32 platform detected.\n"#endif#if defined(__CYGWIN__) " CYGWIN Detected.\n"#endif#if defined(__DJGPP__) " DJGPP Detected.\n"#endif#if defined(_MSC_VER) " MSVC compiler detected.\n"#endif#if defined(__GNUC__) " GCC compiler detected.\n"#endif "\nVarious others: "#if defined(GF) " GF "#endif#if defined(BASE64) " BASE64 "#endif#if defined(MPI) " MPI "#endif#if defined(HMAC) " HMAC "#endif#if defined(OMAC) " OMAC "#endif#if defined(PMAC) " PMAC "#endif#if defined(EAX_MODE) " EAX_MODE "#endif#if defined(OCB_MODE) " OCB_MODE "#endif#if defined(TRY_UNRANDOM_FIRST) " TRY_UNRANDOM_FIRST "#endif#if defined(LTC_TEST) " LTC_TEST "#endif "\n" "\n\n\n" ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?