1 /* Sha256.h -- SHA-256 Hash 2 2023-04-02 : Igor Pavlov : Public domain */ 3 4 #ifndef ZIP7_INC_SHA256_H 5 #define ZIP7_INC_SHA256_H 6 7 #include "7zTypes.h" 8 9 EXTERN_C_BEGIN 10 11 #define SHA256_NUM_BLOCK_WORDS 16 12 #define SHA256_NUM_DIGEST_WORDS 8 13 14 #define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4) 15 #define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4) 16 17 typedef void (Z7_FASTCALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks); 18 19 /* 20 if (the system supports different SHA256 code implementations) 21 { 22 (CSha256::func_UpdateBlocks) will be used 23 (CSha256::func_UpdateBlocks) can be set by 24 Sha256_Init() - to default (fastest) 25 Sha256_SetFunction() - to any algo 26 } 27 else 28 { 29 (CSha256::func_UpdateBlocks) is ignored. 30 } 31 */ 32 33 typedef struct 34 { 35 SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks; 36 UInt64 count; 37 UInt64 _pad_2[2]; 38 UInt32 state[SHA256_NUM_DIGEST_WORDS]; 39 40 Byte buffer[SHA256_BLOCK_SIZE]; 41 } CSha256; 42 43 44 #define SHA256_ALGO_DEFAULT 0 45 #define SHA256_ALGO_SW 1 46 #define SHA256_ALGO_HW 2 47 48 /* 49 Sha256_SetFunction() 50 return: 51 0 - (algo) value is not supported, and func_UpdateBlocks was not changed 52 1 - func_UpdateBlocks was set according (algo) value. 53 */ 54 55 BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo); 56 57 void Sha256_InitState(CSha256 *p); 58 void Sha256_Init(CSha256 *p); 59 void Sha256_Update(CSha256 *p, const Byte *data, size_t size); 60 void Sha256_Final(CSha256 *p, Byte *digest); 61 62 63 64 65 // void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); 66 67 /* 68 call Sha256Prepare() once at program start. 69 It prepares all supported implementations, and detects the fastest implementation. 70 */ 71 72 void Sha256Prepare(void); 73 74 EXTERN_C_END 75 76 #endif 77