#ifndef _SECURITY_COMMON_DIGEST_H_
#define _SECURITY_COMMON_DIGEST_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef uint32_t CC_LONG;
typedef uint64_t CC_LONG64;
#define CC_MD2_DIGEST_LENGTH 16
#define CC_MD2_BLOCK_BYTES 64
#define CC_MD2_BLOCK_LONG (CC_MD2_BLOCK_BYTES / sizeof(CC_LONG))
typedef struct CC_MD2state_st
{
int num;
unsigned char data[CC_MD2_DIGEST_LENGTH];
CC_LONG cksm[CC_MD2_BLOCK_LONG];
CC_LONG state[CC_MD2_BLOCK_LONG];
} CC_MD2_CTX;
extern int CC_MD2_Init(CC_MD2_CTX *c);
extern int CC_MD2_Update(CC_MD2_CTX *c, const void *data, CC_LONG len);
extern int CC_MD2_Final(unsigned char *md, CC_MD2_CTX *c);
#define CC_MD4_DIGEST_LENGTH 16
#define CC_MD4_BLOCK_BYTES 64
#define CC_MD4_BLOCK_LONG (CC_MD4_BLOCK_BYTES / sizeof(CC_LONG))
typedef struct CC_MD4state_st
{
CC_LONG A,B,C,D;
CC_LONG Nl,Nh;
CC_LONG data[CC_MD4_BLOCK_LONG];
int num;
} CC_MD4_CTX;
extern int CC_MD4_Init(CC_MD4_CTX *c);
extern int CC_MD4_Update(CC_MD4_CTX *c, const void *data, CC_LONG len);
extern int CC_MD4_Final(unsigned char *md, CC_MD4_CTX *c);
#define CC_MD5_DIGEST_LENGTH 16
#define CC_MD5_BLOCK_BYTES 64
#define CC_MD5_BLOCK_LONG (CC_MD5_BLOCK_BYTES / sizeof(CC_LONG))
typedef struct CC_MD5state_st
{
CC_LONG A,B,C,D;
CC_LONG Nl,Nh;
CC_LONG data[CC_MD5_BLOCK_LONG];
int num;
} CC_MD5_CTX;
extern int CC_MD5_Init(CC_MD5_CTX *c);
extern int CC_MD5_Update(CC_MD5_CTX *c, const void *data, CC_LONG len);
extern int CC_MD5_Final(unsigned char *md, CC_MD5_CTX *c);
#define CC_SHA1_DIGEST_LENGTH 20
#define CC_SHA1_BLOCK_BYTES 64
#define CC_SHA1_BLOCK_LONG (CC_SHA1_BLOCK_BYTES / sizeof(CC_LONG))
typedef struct CC_SHA1state_st
{
CC_LONG h0,h1,h2,h3,h4;
CC_LONG Nl,Nh;
CC_LONG data[CC_SHA1_BLOCK_LONG];
int num;
} CC_SHA1_CTX;
extern int CC_SHA1_Init(CC_SHA1_CTX *c);
extern int CC_SHA1_Update(CC_SHA1_CTX *c, const void *data, CC_LONG len);
extern int CC_SHA1_Final(unsigned char *md, CC_SHA1_CTX *c);
#define CC_SHA256_DIGEST_LENGTH 32
#define CC_SHA256_BLOCK_BYTES 64
typedef struct CC_SHA256state_st
{ CC_LONG count[2];
CC_LONG hash[8];
CC_LONG wbuf[16];
} CC_SHA256_CTX;
extern int CC_SHA256_Init(CC_SHA256_CTX *c);
extern int CC_SHA256_Update(CC_SHA256_CTX *c, const void *data, CC_LONG len);
extern int CC_SHA256_Final(unsigned char *md, CC_SHA256_CTX *c);
#define CC_SHA384_DIGEST_LENGTH 48
#define CC_SHA384_BLOCK_BYTES 128
typedef struct CC_SHA512state_st
{ CC_LONG64 count[2];
CC_LONG64 hash[8];
CC_LONG64 wbuf[16];
} CC_SHA512_CTX;
extern int CC_SHA384_Init(CC_SHA512_CTX *c);
extern int CC_SHA384_Update(CC_SHA512_CTX *c, const void *data, CC_LONG len);
extern int CC_SHA384_Final(unsigned char *md, CC_SHA512_CTX *c);
#define CC_SHA512_DIGEST_LENGTH 64
#define CC_SHA512_BLOCK_BYTES 128
extern int CC_SHA512_Init(CC_SHA512_CTX *c);
extern int CC_SHA512_Update(CC_SHA512_CTX *c, const void *data, CC_LONG len);
extern int CC_SHA512_Final(unsigned char *md, CC_SHA512_CTX *c);
#ifdef COMMON_DIGEST_FOR_OPENSSL
#define MD2_DIGEST_LENGTH CC_MD2_DIGEST_LENGTH
#define MD2_CTX CC_MD2_CTX
#define MD2_Init(c) CC_MD2_Init(c)
#define MD2_Update(c,d,l) CC_MD2_Update(c,d,l)
#define MD2_Final(m, c) CC_MD2_Final(m,c)
#define MD4_DIGEST_LENGTH CC_MD4_DIGEST_LENGTH
#define MD4_CTX CC_MD4_CTX
#define MD4_Init(c) CC_MD4_Init(c)
#define MD4_Update(c,d,l) CC_MD4_Update(c,d,l)
#define MD4_Final(m, c) CC_MD4_Final(m,c)
#define MD5_DIGEST_LENGTH CC_MD5_DIGEST_LENGTH
#define MD5_CTX CC_MD5_CTX
#define MD5_Init(c) CC_MD5_Init(c)
#define MD5_Update(c,d,l) CC_MD5_Update(c,d,l)
#define MD5_Final(m, c) CC_MD5_Final(m,c)
#define SHA_DIGEST_LENGTH CC_SHA1_DIGEST_LENGTH
#define SHA_CTX CC_SHA1_CTX
#define SHA1_Init(c) CC_SHA1_Init(c)
#define SHA1_Update(c,d,l) CC_SHA1_Update(c,d,l)
#define SHA1_Final(m, c) CC_SHA1_Final(m,c)
#endif
#ifdef COMMON_DIGEST_FOR_RFC_1321
#define MD5_CTX CC_MD5_CTX
#define MD5Init(c) CC_MD5_Init(c)
#define MD5Update(c,d,l) CC_MD5_Update(c,d,l)
#define MD5Final(m, c) CC_MD5_Final((unsigned char *)m,c)
#endif
#ifdef __cplusplus
}
#endif
#endif