1 /* Sha512.h -- SHA-512 Hash 2 : Igor Pavlov : Public domain */ 3 4 #ifndef ZIP7_INC_SHA512_H 5 #define ZIP7_INC_SHA512_H 6 7 #include "7zTypes.h" 8 9 EXTERN_C_BEGIN 10 11 #define SHA512_NUM_BLOCK_WORDS 16 12 #define SHA512_NUM_DIGEST_WORDS 8 13 14 #define SHA512_BLOCK_SIZE (SHA512_NUM_BLOCK_WORDS * 8) 15 #define SHA512_DIGEST_SIZE (SHA512_NUM_DIGEST_WORDS * 8) 16 #define SHA512_224_DIGEST_SIZE (224 / 8) 17 #define SHA512_256_DIGEST_SIZE (256 / 8) 18 #define SHA512_384_DIGEST_SIZE (384 / 8) 19 20 typedef void (Z7_FASTCALL *SHA512_FUNC_UPDATE_BLOCKS)(UInt64 state[8], const Byte *data, size_t numBlocks); 21 22 /* 23 if (the system supports different SHA512 code implementations) 24 { 25 (CSha512::func_UpdateBlocks) will be used 26 (CSha512::func_UpdateBlocks) can be set by 27 Sha512_Init() - to default (fastest) 28 Sha512_SetFunction() - to any algo 29 } 30 else 31 { 32 (CSha512::func_UpdateBlocks) is ignored. 33 } 34 */ 35 36 typedef struct 37 { 38 union 39 { 40 struct 41 { 42 SHA512_FUNC_UPDATE_BLOCKS func_UpdateBlocks; 43 UInt64 count; 44 } vars; 45 UInt64 _pad_64bit[8]; 46 void *_pad_align_ptr[2]; 47 } v; 48 UInt64 state[SHA512_NUM_DIGEST_WORDS]; 49 50 Byte buffer[SHA512_BLOCK_SIZE]; 51 } CSha512; 52 53 54 #define SHA512_ALGO_DEFAULT 0 55 #define SHA512_ALGO_SW 1 56 #define SHA512_ALGO_HW 2 57 58 /* 59 Sha512_SetFunction() 60 return: 61 0 - (algo) value is not supported, and func_UpdateBlocks was not changed 62 1 - func_UpdateBlocks was set according (algo) value. 63 */ 64 65 BoolInt Sha512_SetFunction(CSha512 *p, unsigned algo); 66 // we support only these (digestSize) values: 224/8, 256/8, 384/8, 512/8 67 void Sha512_InitState(CSha512 *p, unsigned digestSize); 68 void Sha512_Init(CSha512 *p, unsigned digestSize); 69 void Sha512_Update(CSha512 *p, const Byte *data, size_t size); 70 void Sha512_Final(CSha512 *p, Byte *digest, unsigned digestSize); 71 72 73 74 75 // void Z7_FASTCALL Sha512_UpdateBlocks(UInt64 state[8], const Byte *data, size_t numBlocks); 76 77 /* 78 call Sha512Prepare() once at program start. 79 It prepares all supported implementations, and detects the fastest implementation. 80 */ 81 82 void Sha512Prepare(void); 83 84 EXTERN_C_END 85 86 #endif 87