#ifndef SHA1_H
#define SHA1_H
#endif

#define SHA1_ALGORITHM_BYTE 2   /* SHA1 message digest algorithm */


#ifndef MD5_H
#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif
#endif

typedef union longbyte
{
   uint32 W[80];        /* Process 16 32-bit words at a time */
   char B[320];                /* But read them as bytes for counting */
} lbyte;


struct SHA1Context {
       uint32 h0, h1, h2, h3, h4; /* accumulators for message digest */
   uint32 hi_length, lo_length;
   int inbytes, padded;
       lbyte in; /* serves double duty: if inbytes = 0 serves as scratchpad fo
r
                    SHA1 calculation (all 320 bytes used); otherwise holds
                    inbytes (< 64) left over bytes waiting for more bytes to
                    be added to the digest calculation */
};

typedef struct SHA1Context SHA1_CTX;

extern int mdalg_flag;

void SHA1Init(struct SHA1Context *context);
int SHA1Update0(struct SHA1Context *context, unsigned char const **buf,
              unsigned *len, int finalize);
void SHA1Update(struct SHA1Context *context, unsigned char const *buf,
              unsigned len);
void SHA1Final(unsigned char digest[16], struct SHA1Context *context);

int SHA1file0_len(struct SHA1Context *shContext, FILE * f, word32 longcount);
int SHA1file(struct SHA1Context *shContext, char *filename);
void SHA1_addbuffer(struct SHA1Context *shContext, byte * buf, int buflen,
                 byte digest[20]);