00001
00002
00003
00004
00005 #ifndef _SHA2_H
00006 #define _SHA2_H
00007
00008 #include <limits.h>
00009
00010 #define sfx_lo(x,y) x##y
00011 #define sfx_hi(x,y) sfx_lo(x,y)
00012 #define n_u32(p) sfx_hi(0x##p,s_u32)
00013 #define n_u64(p) sfx_hi(0x##p,s_u64)
00014
00015 #if UINT_MAX == 0xffffffff
00016 typedef unsigned int sha2_32t;
00017 #define s_u32 u
00018 #elif ULONG_MAX == 0xffffffff
00019 typedef unsigned long sha2_32t;
00020 #define s_u32 ul
00021 #else
00022 #error Please define sha2_32t as an unsigned 32 bit type in sha2.h
00023 #endif
00024
00025 #if defined( _MSC_VER )
00026 typedef unsigned __int64 sha2_64t;
00027 #define s_u64 ui64
00028 #elif ULONG_MAX == 0xffffffffffffffff
00029 typedef unsigned long sha2_64t;
00030 #define s_u64 ul
00031 #elif ULONG_MAX == 0xffffffff
00032 typedef unsigned long long sha2_64t;
00033 #define s_u64 ull
00034 #else
00035 #error Please define sha2_64t as an unsigned 64 bit type in sha2.h
00036 #endif
00037
00038 #if defined(__cplusplus)
00039 extern "C"
00040 {
00041 #endif
00042
00043 #define SHA256_DIGEST_SIZE 32
00044 #define SHA384_DIGEST_SIZE 48
00045 #define SHA512_DIGEST_SIZE 64
00046
00047 #define SHA256_BLOCK_SIZE 64
00048 #define SHA384_BLOCK_SIZE 128
00049 #define SHA512_BLOCK_SIZE 128
00050
00051 #define SHA2_DIGEST_SIZE SHA256_DIGEST_SIZE
00052 #define SHA2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE
00053
00054 #define SHA2_GOOD 0
00055 #define SHA2_BAD 1
00056
00057 typedef struct
00058 { sha2_32t count[2];
00059 sha2_32t hash[8];
00060 sha2_32t wbuf[16];
00061 } sha256_ctx;
00062
00063 typedef struct
00064 { sha2_64t count[2];
00065 sha2_64t hash[8];
00066 sha2_64t wbuf[16];
00067 } sha512_ctx;
00068
00069 typedef sha512_ctx sha384_ctx;
00070
00071 typedef struct
00072 { union
00073 { sha256_ctx ctx256[1];
00074 sha512_ctx ctx512[1];
00075 } uu[1];
00076 sha2_32t sha2_len;
00077 } sha2_ctx;
00078
00079 void sha256_compile(sha256_ctx ctx[1]);
00080 void sha512_compile(sha512_ctx ctx[1]);
00081
00082 void sha256_begin(sha256_ctx ctx[1]);
00083 void sha256_hash(const unsigned char data[], unsigned long len, sha256_ctx ctx[1]);
00084 void sha256_end(unsigned char hval[], sha256_ctx ctx[1]);
00085 void sha256(unsigned char hval[], const unsigned char data[], unsigned long len);
00086
00087 void sha384_begin(sha384_ctx ctx[1]);
00088 #define sha384_hash sha512_hash
00089 void sha384_end(unsigned char hval[], sha384_ctx ctx[1]);
00090 void sha384(unsigned char hval[], const unsigned char data[], unsigned long len);
00091
00092 void sha512_begin(sha512_ctx ctx[1]);
00093 void sha512_hash(const unsigned char data[], unsigned long len, sha512_ctx ctx[1]);
00094 void sha512_end(unsigned char hval[], sha512_ctx ctx[1]);
00095 void sha512(unsigned char hval[], const unsigned char data[], unsigned long len);
00096
00097 int sha2_begin(unsigned long size, sha2_ctx ctx[1]);
00098 void sha2_hash(const unsigned char data[], unsigned long len, sha2_ctx ctx[1]);
00099 void sha2_end(unsigned char hval[], sha2_ctx ctx[1]);
00100 int sha2(unsigned char hval[], unsigned long size, const unsigned char data[], unsigned long len);
00101
00102 #if defined(__cplusplus)
00103 }
00104 #endif
00105
00106 #include "sha2.cpp"
00107
00108 #endif