4 typedef uint64_t ulong64;
5 typedef uint32_t ulong32;
8 #define CRYPT_INVALID_ARG 1
10 #define CRYPT_FAIL_TESTVECTOR 3
11 #define XMEMCMP memcmp
16 ulong32 state[5], curlen;
17 unsigned char buf[64];
22 ulong32 state[4], curlen;
23 unsigned char buf[64];
26 typedef union Hash_state {
27 struct sha1_state sha1;
32 int sha1_init(hash_state * md);
33 int sha1_process(hash_state * md, const unsigned char *in, unsigned long inlen);
34 int sha1_done(hash_state * md, unsigned char *hash);
37 int md5_init(hash_state * md);
38 int md5_process(hash_state * md, const unsigned char *in, unsigned long inlen);
39 int md5_done(hash_state * md, unsigned char *hash);
42 /* a simple macro for making hash "process" functions */
43 #define HASH_PROCESS(func_name, compress_name, state_var, block_size) \
44 int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) \
48 LTC_ARGCHK(md != NULL); \
49 LTC_ARGCHK(in != NULL); \
50 if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \
51 return CRYPT_INVALID_ARG; \
54 if (md-> state_var .curlen == 0 && inlen >= block_size) { \
55 if ((err = compress_name (md, (unsigned char *)in)) != CRYPT_OK) { \
58 md-> state_var .length += block_size * 8; \
60 inlen -= block_size; \
62 n = MIN(inlen, (block_size - md-> state_var .curlen)); \
63 memcpy(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \
64 md-> state_var .curlen += n; \
67 if (md-> state_var .curlen == block_size) { \
68 if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \
71 md-> state_var .length += 8*block_size; \
72 md-> state_var .curlen = 0; \