Path: blob/master/libs/tomcrypt/src/headers/tomcrypt_hash.h
5971 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/89/* ---- HASH FUNCTIONS ---- */10#ifdef LTC_SHA311struct sha3_state {12ulong64 saved; /* the portion of the input message that we didn't consume yet */13ulong64 s[25];14unsigned char sb[25 * 8]; /* used for storing `ulong64 s[25]` as little-endian bytes */15unsigned short byte_index; /* 0..7--the next byte after the set one (starts from 0; 0--none are buffered) */16unsigned short word_index; /* 0..24--the next word to integrate input (starts from 0) */17unsigned short capacity_words; /* the double size of the hash output in words (e.g. 16 for Keccak 512) */18unsigned short xof_flag;19};20#endif2122#ifdef LTC_SHA51223struct sha512_state {24ulong64 length, state[8];25unsigned long curlen;26unsigned char buf[128];27};28#endif2930#ifdef LTC_SHA25631struct sha256_state {32ulong64 length;33ulong32 state[8], curlen;34unsigned char buf[64];35};36#endif3738#ifdef LTC_SHA139struct sha1_state {40ulong64 length;41ulong32 state[5], curlen;42unsigned char buf[64];43};44#endif4546#ifdef LTC_MD547struct md5_state {48ulong64 length;49ulong32 state[4], curlen;50unsigned char buf[64];51};52#endif5354#ifdef LTC_MD455struct md4_state {56ulong64 length;57ulong32 state[4], curlen;58unsigned char buf[64];59};60#endif6162#ifdef LTC_TIGER63struct tiger_state {64ulong64 state[3], length;65unsigned long curlen;66unsigned char buf[64];67};68#endif6970#ifdef LTC_MD271struct md2_state {72unsigned char chksum[16], X[48], buf[16];73unsigned long curlen;74};75#endif7677#ifdef LTC_RIPEMD12878struct rmd128_state {79ulong64 length;80unsigned char buf[64];81ulong32 curlen, state[4];82};83#endif8485#ifdef LTC_RIPEMD16086struct rmd160_state {87ulong64 length;88unsigned char buf[64];89ulong32 curlen, state[5];90};91#endif9293#ifdef LTC_RIPEMD25694struct rmd256_state {95ulong64 length;96unsigned char buf[64];97ulong32 curlen, state[8];98};99#endif100101#ifdef LTC_RIPEMD320102struct rmd320_state {103ulong64 length;104unsigned char buf[64];105ulong32 curlen, state[10];106};107#endif108109#ifdef LTC_WHIRLPOOL110struct whirlpool_state {111ulong64 length, state[8];112unsigned char buf[64];113ulong32 curlen;114};115#endif116117#ifdef LTC_CHC_HASH118struct chc_state {119ulong64 length;120unsigned char state[MAXBLOCKSIZE], buf[MAXBLOCKSIZE];121ulong32 curlen;122};123#endif124125#ifdef LTC_BLAKE2S126struct blake2s_state {127ulong32 h[8];128ulong32 t[2];129ulong32 f[2];130unsigned char buf[64];131unsigned long curlen;132unsigned long outlen;133unsigned char last_node;134};135#endif136137#ifdef LTC_BLAKE2B138struct blake2b_state {139ulong64 h[8];140ulong64 t[2];141ulong64 f[2];142unsigned char buf[128];143unsigned long curlen;144unsigned long outlen;145unsigned char last_node;146};147#endif148149typedef union Hash_state {150char dummy[1];151#ifdef LTC_CHC_HASH152struct chc_state chc;153#endif154#ifdef LTC_WHIRLPOOL155struct whirlpool_state whirlpool;156#endif157#ifdef LTC_SHA3158struct sha3_state sha3;159#endif160#ifdef LTC_SHA512161struct sha512_state sha512;162#endif163#ifdef LTC_SHA256164struct sha256_state sha256;165#endif166#ifdef LTC_SHA1167struct sha1_state sha1;168#endif169#ifdef LTC_MD5170struct md5_state md5;171#endif172#ifdef LTC_MD4173struct md4_state md4;174#endif175#ifdef LTC_MD2176struct md2_state md2;177#endif178#ifdef LTC_TIGER179struct tiger_state tiger;180#endif181#ifdef LTC_RIPEMD128182struct rmd128_state rmd128;183#endif184#ifdef LTC_RIPEMD160185struct rmd160_state rmd160;186#endif187#ifdef LTC_RIPEMD256188struct rmd256_state rmd256;189#endif190#ifdef LTC_RIPEMD320191struct rmd320_state rmd320;192#endif193#ifdef LTC_BLAKE2S194struct blake2s_state blake2s;195#endif196#ifdef LTC_BLAKE2B197struct blake2b_state blake2b;198#endif199200void *data;201} hash_state;202203/** hash descriptor */204extern struct ltc_hash_descriptor {205/** name of hash */206const char *name;207/** internal ID */208unsigned char ID;209/** Size of digest in octets */210unsigned long hashsize;211/** Input block size in octets */212unsigned long blocksize;213/** ASN.1 OID */214unsigned long OID[16];215/** Length of DER encoding */216unsigned long OIDlen;217218/** Init a hash state219@param hash The hash to initialize220@return CRYPT_OK if successful221*/222int (*init)(hash_state *hash);223/** Process a block of data224@param hash The hash state225@param in The data to hash226@param inlen The length of the data (octets)227@return CRYPT_OK if successful228*/229int (*process)(hash_state *hash, const unsigned char *in, unsigned long inlen);230/** Produce the digest and store it231@param hash The hash state232@param out [out] The destination of the digest233@return CRYPT_OK if successful234*/235int (*done)(hash_state *hash, unsigned char *out);236/** Self-test237@return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled238*/239int (*test)(void);240241/* accelerated hmac callback: if you need to-do multiple packets just use the generic hmac_memory and provide a hash callback */242int (*hmac_block)(const unsigned char *key, unsigned long keylen,243const unsigned char *in, unsigned long inlen,244unsigned char *out, unsigned long *outlen);245246} hash_descriptor[];247248#ifdef LTC_CHC_HASH249int chc_register(int cipher);250int chc_init(hash_state * md);251int chc_process(hash_state * md, const unsigned char *in, unsigned long inlen);252int chc_done(hash_state * md, unsigned char *hash);253int chc_test(void);254extern const struct ltc_hash_descriptor chc_desc;255#endif256257#ifdef LTC_WHIRLPOOL258int whirlpool_init(hash_state * md);259int whirlpool_process(hash_state * md, const unsigned char *in, unsigned long inlen);260int whirlpool_done(hash_state * md, unsigned char *hash);261int whirlpool_test(void);262extern const struct ltc_hash_descriptor whirlpool_desc;263#endif264265#ifdef LTC_SHA3266int sha3_512_init(hash_state * md);267int sha3_512_test(void);268extern const struct ltc_hash_descriptor sha3_512_desc;269int sha3_384_init(hash_state * md);270int sha3_384_test(void);271extern const struct ltc_hash_descriptor sha3_384_desc;272int sha3_256_init(hash_state * md);273int sha3_256_test(void);274extern const struct ltc_hash_descriptor sha3_256_desc;275int sha3_224_init(hash_state * md);276int sha3_224_test(void);277extern const struct ltc_hash_descriptor sha3_224_desc;278/* process + done are the same for all variants */279int sha3_process(hash_state * md, const unsigned char *in, unsigned long inlen);280int sha3_done(hash_state *md, unsigned char *hash);281/* SHAKE128 + SHAKE256 */282int sha3_shake_init(hash_state *md, int num);283#define sha3_shake_process(a,b,c) sha3_process(a,b,c)284int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen);285int sha3_shake_test(void);286int sha3_shake_memory(int num, const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen);287#endif288289#ifdef LTC_SHA512290int sha512_init(hash_state * md);291int sha512_process(hash_state * md, const unsigned char *in, unsigned long inlen);292int sha512_done(hash_state * md, unsigned char *hash);293int sha512_test(void);294extern const struct ltc_hash_descriptor sha512_desc;295#endif296297#ifdef LTC_SHA384298#ifndef LTC_SHA512299#error LTC_SHA512 is required for LTC_SHA384300#endif301int sha384_init(hash_state * md);302#define sha384_process sha512_process303int sha384_done(hash_state * md, unsigned char *hash);304int sha384_test(void);305extern const struct ltc_hash_descriptor sha384_desc;306#endif307308#ifdef LTC_SHA512_256309#ifndef LTC_SHA512310#error LTC_SHA512 is required for LTC_SHA512_256311#endif312int sha512_256_init(hash_state * md);313#define sha512_256_process sha512_process314int sha512_256_done(hash_state * md, unsigned char *hash);315int sha512_256_test(void);316extern const struct ltc_hash_descriptor sha512_256_desc;317#endif318319#ifdef LTC_SHA512_224320#ifndef LTC_SHA512321#error LTC_SHA512 is required for LTC_SHA512_224322#endif323int sha512_224_init(hash_state * md);324#define sha512_224_process sha512_process325int sha512_224_done(hash_state * md, unsigned char *hash);326int sha512_224_test(void);327extern const struct ltc_hash_descriptor sha512_224_desc;328#endif329330#ifdef LTC_SHA256331int sha256_init(hash_state * md);332int sha256_process(hash_state * md, const unsigned char *in, unsigned long inlen);333int sha256_done(hash_state * md, unsigned char *hash);334int sha256_test(void);335extern const struct ltc_hash_descriptor sha256_desc;336337#ifdef LTC_SHA224338#ifndef LTC_SHA256339#error LTC_SHA256 is required for LTC_SHA224340#endif341int sha224_init(hash_state * md);342#define sha224_process sha256_process343int sha224_done(hash_state * md, unsigned char *hash);344int sha224_test(void);345extern const struct ltc_hash_descriptor sha224_desc;346#endif347#endif348349#ifdef LTC_SHA1350int sha1_init(hash_state * md);351int sha1_process(hash_state * md, const unsigned char *in, unsigned long inlen);352int sha1_done(hash_state * md, unsigned char *hash);353int sha1_test(void);354extern const struct ltc_hash_descriptor sha1_desc;355#endif356357#ifdef LTC_BLAKE2S358extern const struct ltc_hash_descriptor blake2s_256_desc;359int blake2s_256_init(hash_state * md);360int blake2s_256_test(void);361362extern const struct ltc_hash_descriptor blake2s_224_desc;363int blake2s_224_init(hash_state * md);364int blake2s_224_test(void);365366extern const struct ltc_hash_descriptor blake2s_160_desc;367int blake2s_160_init(hash_state * md);368int blake2s_160_test(void);369370extern const struct ltc_hash_descriptor blake2s_128_desc;371int blake2s_128_init(hash_state * md);372int blake2s_128_test(void);373374int blake2s_init(hash_state * md, unsigned long outlen, const unsigned char *key, unsigned long keylen);375int blake2s_process(hash_state * md, const unsigned char *in, unsigned long inlen);376int blake2s_done(hash_state * md, unsigned char *hash);377#endif378379#ifdef LTC_BLAKE2B380extern const struct ltc_hash_descriptor blake2b_512_desc;381int blake2b_512_init(hash_state * md);382int blake2b_512_test(void);383384extern const struct ltc_hash_descriptor blake2b_384_desc;385int blake2b_384_init(hash_state * md);386int blake2b_384_test(void);387388extern const struct ltc_hash_descriptor blake2b_256_desc;389int blake2b_256_init(hash_state * md);390int blake2b_256_test(void);391392extern const struct ltc_hash_descriptor blake2b_160_desc;393int blake2b_160_init(hash_state * md);394int blake2b_160_test(void);395396int blake2b_init(hash_state * md, unsigned long outlen, const unsigned char *key, unsigned long keylen);397int blake2b_process(hash_state * md, const unsigned char *in, unsigned long inlen);398int blake2b_done(hash_state * md, unsigned char *hash);399#endif400401#ifdef LTC_MD5402int md5_init(hash_state * md);403int md5_process(hash_state * md, const unsigned char *in, unsigned long inlen);404int md5_done(hash_state * md, unsigned char *hash);405int md5_test(void);406extern const struct ltc_hash_descriptor md5_desc;407#endif408409#ifdef LTC_MD4410int md4_init(hash_state * md);411int md4_process(hash_state * md, const unsigned char *in, unsigned long inlen);412int md4_done(hash_state * md, unsigned char *hash);413int md4_test(void);414extern const struct ltc_hash_descriptor md4_desc;415#endif416417#ifdef LTC_MD2418int md2_init(hash_state * md);419int md2_process(hash_state * md, const unsigned char *in, unsigned long inlen);420int md2_done(hash_state * md, unsigned char *hash);421int md2_test(void);422extern const struct ltc_hash_descriptor md2_desc;423#endif424425#ifdef LTC_TIGER426int tiger_init(hash_state * md);427int tiger_process(hash_state * md, const unsigned char *in, unsigned long inlen);428int tiger_done(hash_state * md, unsigned char *hash);429int tiger_test(void);430extern const struct ltc_hash_descriptor tiger_desc;431#endif432433#ifdef LTC_RIPEMD128434int rmd128_init(hash_state * md);435int rmd128_process(hash_state * md, const unsigned char *in, unsigned long inlen);436int rmd128_done(hash_state * md, unsigned char *hash);437int rmd128_test(void);438extern const struct ltc_hash_descriptor rmd128_desc;439#endif440441#ifdef LTC_RIPEMD160442int rmd160_init(hash_state * md);443int rmd160_process(hash_state * md, const unsigned char *in, unsigned long inlen);444int rmd160_done(hash_state * md, unsigned char *hash);445int rmd160_test(void);446extern const struct ltc_hash_descriptor rmd160_desc;447#endif448449#ifdef LTC_RIPEMD256450int rmd256_init(hash_state * md);451int rmd256_process(hash_state * md, const unsigned char *in, unsigned long inlen);452int rmd256_done(hash_state * md, unsigned char *hash);453int rmd256_test(void);454extern const struct ltc_hash_descriptor rmd256_desc;455#endif456457#ifdef LTC_RIPEMD320458int rmd320_init(hash_state * md);459int rmd320_process(hash_state * md, const unsigned char *in, unsigned long inlen);460int rmd320_done(hash_state * md, unsigned char *hash);461int rmd320_test(void);462extern const struct ltc_hash_descriptor rmd320_desc;463#endif464465466int find_hash(const char *name);467int find_hash_id(unsigned char ID);468int find_hash_oid(const unsigned long *ID, unsigned long IDlen);469int find_hash_any(const char *name, int digestlen);470int register_hash(const struct ltc_hash_descriptor *hash);471int unregister_hash(const struct ltc_hash_descriptor *hash);472int register_all_hashes(void);473int hash_is_valid(int idx);474475LTC_MUTEX_PROTO(ltc_hash_mutex)476477int hash_memory(int hash,478const unsigned char *in, unsigned long inlen,479unsigned char *out, unsigned long *outlen);480int hash_memory_multi(int hash, unsigned char *out, unsigned long *outlen,481const unsigned char *in, unsigned long inlen, ...);482483#ifndef LTC_NO_FILE484int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outlen);485int hash_file(int hash, const char *fname, unsigned char *out, unsigned long *outlen);486#endif487488/* a simple macro for making hash "process" functions */489#define HASH_PROCESS(func_name, compress_name, state_var, block_size) \490int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) \491{ \492unsigned long n; \493int err; \494LTC_ARGCHK(md != NULL); \495LTC_ARGCHK(in != NULL); \496if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \497return CRYPT_INVALID_ARG; \498} \499if ((md-> state_var .length + inlen) < md-> state_var .length) { \500return CRYPT_HASH_OVERFLOW; \501} \502while (inlen > 0) { \503if (md-> state_var .curlen == 0 && inlen >= block_size) { \504if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \505return err; \506} \507md-> state_var .length += block_size * 8; \508in += block_size; \509inlen -= block_size; \510} else { \511n = MIN(inlen, (block_size - md-> state_var .curlen)); \512XMEMCPY(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \513md-> state_var .curlen += n; \514in += n; \515inlen -= n; \516if (md-> state_var .curlen == block_size) { \517if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \518return err; \519} \520md-> state_var .length += 8*block_size; \521md-> state_var .curlen = 0; \522} \523} \524} \525return CRYPT_OK; \526}527528529