1 /* Sha256.h -- SHA-256 Hash
2 2021-01-01 : Igor Pavlov : Public domain */
3 
4 #ifndef __7Z_SHA256_H
5 #define __7Z_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 (MY_FAST_CALL *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 MY_FAST_CALL 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