1 /* Sha1.h -- SHA-1 Hash 2 2023-04-02 : Igor Pavlov : Public domain */ 3 4 #ifndef ZIP7_INC_SHA1_H 5 #define ZIP7_INC_SHA1_H 6 7 #include "7zTypes.h" 8 9 EXTERN_C_BEGIN 10 11 #define SHA1_NUM_BLOCK_WORDS 16 12 #define SHA1_NUM_DIGEST_WORDS 5 13 14 #define SHA1_BLOCK_SIZE (SHA1_NUM_BLOCK_WORDS * 4) 15 #define SHA1_DIGEST_SIZE (SHA1_NUM_DIGEST_WORDS * 4) 16 17 typedef void (Z7_FASTCALL *SHA1_FUNC_UPDATE_BLOCKS)(UInt32 state[5], const Byte *data, size_t numBlocks); 18 19 /* 20 if (the system supports different SHA1 code implementations) 21 { 22 (CSha1::func_UpdateBlocks) will be used 23 (CSha1::func_UpdateBlocks) can be set by 24 Sha1_Init() - to default (fastest) 25 Sha1_SetFunction() - to any algo 26 } 27 else 28 { 29 (CSha1::func_UpdateBlocks) is ignored. 30 } 31 */ 32 33 typedef struct 34 { 35 SHA1_FUNC_UPDATE_BLOCKS func_UpdateBlocks; 36 UInt64 count; 37 UInt64 _pad_2[2]; 38 UInt32 state[SHA1_NUM_DIGEST_WORDS]; 39 UInt32 _pad_3[3]; 40 Byte buffer[SHA1_BLOCK_SIZE]; 41 } CSha1; 42 43 44 #define SHA1_ALGO_DEFAULT 0 45 #define SHA1_ALGO_SW 1 46 #define SHA1_ALGO_HW 2 47 48 /* 49 Sha1_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 Sha1_SetFunction(CSha1 *p, unsigned algo); 56 57 void Sha1_InitState(CSha1 *p); 58 void Sha1_Init(CSha1 *p); 59 void Sha1_Update(CSha1 *p, const Byte *data, size_t size); 60 void Sha1_Final(CSha1 *p, Byte *digest); 61 62 void Sha1_PrepareBlock(const CSha1 *p, Byte *block, unsigned size); 63 void Sha1_GetBlockDigest(const CSha1 *p, const Byte *data, Byte *destDigest); 64 65 // void Z7_FASTCALL Sha1_UpdateBlocks(UInt32 state[5], const Byte *data, size_t numBlocks); 66 67 /* 68 call Sha1Prepare() once at program start. 69 It prepares all supported implementations, and detects the fastest implementation. 70 */ 71 72 void Sha1Prepare(void); 73 74 EXTERN_C_END 75 76 #endif 77