1 /* ---- HASH FUNCTIONS ---- */
4 ulong64 length, state[8];
6 unsigned char buf[128];
13 ulong32 state[8], curlen;
14 unsigned char buf[64];
21 ulong32 state[5], curlen;
22 unsigned char buf[64];
29 ulong32 state[4], curlen;
30 unsigned char buf[64];
37 ulong32 state[4], curlen;
38 unsigned char buf[64];
44 ulong64 state[3], length;
46 unsigned char buf[64];
52 unsigned char chksum[16], X[48], buf[16];
60 unsigned char buf[64];
61 ulong32 curlen, state[4];
68 unsigned char buf[64];
69 ulong32 curlen, state[5];
76 unsigned char buf[64];
77 ulong32 curlen, state[8];
84 unsigned char buf[64];
85 ulong32 curlen, state[10];
90 struct whirlpool_state {
91 ulong64 length, state[8];
92 unsigned char buf[64];
100 unsigned char state[MAXBLOCKSIZE], buf[MAXBLOCKSIZE];
105 typedef union Hash_state {
108 struct chc_state chc;
111 struct whirlpool_state whirlpool;
114 struct sha512_state sha512;
117 struct sha256_state sha256;
120 struct sha1_state sha1;
123 struct md5_state md5;
126 struct md4_state md4;
129 struct md2_state md2;
132 struct tiger_state tiger;
135 struct rmd128_state rmd128;
138 struct rmd160_state rmd160;
141 struct rmd256_state rmd256;
144 struct rmd320_state rmd320;
149 /** hash descriptor */
150 extern struct ltc_hash_descriptor {
155 /** Size of digest in octets */
156 unsigned long hashsize;
157 /** Input block size in octets */
158 unsigned long blocksize;
160 unsigned long OID[16];
161 /** Length of DER encoding */
162 unsigned long OIDlen;
164 /** Init a hash state
165 @param hash The hash to initialize
166 @return CRYPT_OK if successful
168 int (*init)(hash_state *hash);
169 /** Process a block of data
170 @param hash The hash state
171 @param in The data to hash
172 @param inlen The length of the data (octets)
173 @return CRYPT_OK if successful
175 int (*process)(hash_state *hash, const unsigned char *in, unsigned long inlen);
176 /** Produce the digest and store it
177 @param hash The hash state
178 @param out [out] The destination of the digest
179 @return CRYPT_OK if successful
181 int (*done)(hash_state *hash, unsigned char *out);
183 @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
187 /* accelerated hmac callback: if you need to-do multiple packets just use the generic hmac_memory and provide a hash callback */
188 int (*hmac_block)(const unsigned char *key, unsigned long keylen,
189 const unsigned char *in, unsigned long inlen,
190 unsigned char *out, unsigned long *outlen);
195 int chc_register(int cipher);
196 int chc_init(hash_state * md);
197 int chc_process(hash_state * md, const unsigned char *in, unsigned long inlen);
198 int chc_done(hash_state * md, unsigned char *hash);
200 extern const struct ltc_hash_descriptor chc_desc;
204 int whirlpool_init(hash_state * md);
205 int whirlpool_process(hash_state * md, const unsigned char *in, unsigned long inlen);
206 int whirlpool_done(hash_state * md, unsigned char *hash);
207 int whirlpool_test(void);
208 extern const struct ltc_hash_descriptor whirlpool_desc;
212 int sha512_init(hash_state * md);
213 int sha512_process(hash_state * md, const unsigned char *in, unsigned long inlen);
214 int sha512_done(hash_state * md, unsigned char *hash);
215 int sha512_test(void);
216 extern const struct ltc_hash_descriptor sha512_desc;
221 #error SHA512 is required for SHA384
223 int sha384_init(hash_state * md);
224 #define sha384_process sha512_process
225 int sha384_done(hash_state * md, unsigned char *hash);
226 int sha384_test(void);
227 extern const struct ltc_hash_descriptor sha384_desc;
231 int sha256_init(hash_state * md);
232 int sha256_process(hash_state * md, const unsigned char *in, unsigned long inlen);
233 int sha256_done(hash_state * md, unsigned char *hash);
234 int sha256_test(void);
235 extern const struct ltc_hash_descriptor sha256_desc;
239 #error SHA256 is required for SHA224
241 int sha224_init(hash_state * md);
242 #define sha224_process sha256_process
243 int sha224_done(hash_state * md, unsigned char *hash);
244 int sha224_test(void);
245 extern const struct ltc_hash_descriptor sha224_desc;
250 int sha1_init(hash_state * md);
251 int sha1_process(hash_state * md, const unsigned char *in, unsigned long inlen);
252 int sha1_done(hash_state * md, unsigned char *hash);
254 extern const struct ltc_hash_descriptor sha1_desc;
258 int md5_init(hash_state * md);
259 int md5_process(hash_state * md, const unsigned char *in, unsigned long inlen);
260 int md5_done(hash_state * md, unsigned char *hash);
262 extern const struct ltc_hash_descriptor md5_desc;
266 int md4_init(hash_state * md);
267 int md4_process(hash_state * md, const unsigned char *in, unsigned long inlen);
268 int md4_done(hash_state * md, unsigned char *hash);
270 extern const struct ltc_hash_descriptor md4_desc;
274 int md2_init(hash_state * md);
275 int md2_process(hash_state * md, const unsigned char *in, unsigned long inlen);
276 int md2_done(hash_state * md, unsigned char *hash);
278 extern const struct ltc_hash_descriptor md2_desc;
282 int tiger_init(hash_state * md);
283 int tiger_process(hash_state * md, const unsigned char *in, unsigned long inlen);
284 int tiger_done(hash_state * md, unsigned char *hash);
285 int tiger_test(void);
286 extern const struct ltc_hash_descriptor tiger_desc;
290 int rmd128_init(hash_state * md);
291 int rmd128_process(hash_state * md, const unsigned char *in, unsigned long inlen);
292 int rmd128_done(hash_state * md, unsigned char *hash);
293 int rmd128_test(void);
294 extern const struct ltc_hash_descriptor rmd128_desc;
298 int rmd160_init(hash_state * md);
299 int rmd160_process(hash_state * md, const unsigned char *in, unsigned long inlen);
300 int rmd160_done(hash_state * md, unsigned char *hash);
301 int rmd160_test(void);
302 extern const struct ltc_hash_descriptor rmd160_desc;
306 int rmd256_init(hash_state * md);
307 int rmd256_process(hash_state * md, const unsigned char *in, unsigned long inlen);
308 int rmd256_done(hash_state * md, unsigned char *hash);
309 int rmd256_test(void);
310 extern const struct ltc_hash_descriptor rmd256_desc;
314 int rmd320_init(hash_state * md);
315 int rmd320_process(hash_state * md, const unsigned char *in, unsigned long inlen);
316 int rmd320_done(hash_state * md, unsigned char *hash);
317 int rmd320_test(void);
318 extern const struct ltc_hash_descriptor rmd320_desc;
322 int find_hash(const char *name);
323 int find_hash_id(unsigned char ID);
324 int find_hash_oid(const unsigned long *ID, unsigned long IDlen);
325 int find_hash_any(const char *name, int digestlen);
326 int register_hash(const struct ltc_hash_descriptor *hash);
327 int unregister_hash(const struct ltc_hash_descriptor *hash);
328 int hash_is_valid(int idx);
330 LTC_MUTEX_PROTO(ltc_hash_mutex)
332 int hash_memory(int hash,
333 const unsigned char *in, unsigned long inlen,
334 unsigned char *out, unsigned long *outlen);
335 int hash_memory_multi(int hash, unsigned char *out, unsigned long *outlen,
336 const unsigned char *in, unsigned long inlen, ...);
337 int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outlen);
338 int hash_file(int hash, const char *fname, unsigned char *out, unsigned long *outlen);
340 /* a simple macro for making hash "process" functions */
341 #define HASH_PROCESS(func_name, compress_name, state_var, block_size) \
342 int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) \
346 LTC_ARGCHK(md != NULL); \
347 LTC_ARGCHK(in != NULL); \
348 if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \
349 return CRYPT_INVALID_ARG; \
351 while (inlen > 0) { \
352 if (md-> state_var .curlen == 0 && inlen >= block_size) { \
353 if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \
356 md-> state_var .length += block_size * 8; \
358 inlen -= block_size; \
360 n = MIN(inlen, (block_size - md-> state_var .curlen)); \
361 memcpy(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \
362 md-> state_var .curlen += n; \
365 if (md-> state_var .curlen == block_size) { \
366 if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \
369 md-> state_var .length += 8*block_size; \
370 md-> state_var .curlen = 0; \
377 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_hash.h,v $ */
378 /* $Revision: 1.19 $ */
379 /* $Date: 2006/11/05 01:36:43 $ */