xref: /third_party/lzma/C/Sha256.h (revision 370b324c)
1/* Sha256.h -- SHA-256 Hash
22023-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
9EXTERN_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
17typedef 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
33typedef 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/*
49Sha256_SetFunction()
50return:
51  0 - (algo) value is not supported, and func_UpdateBlocks was not changed
52  1 - func_UpdateBlocks was set according (algo) value.
53*/
54
55BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo);
56
57void Sha256_InitState(CSha256 *p);
58void Sha256_Init(CSha256 *p);
59void Sha256_Update(CSha256 *p, const Byte *data, size_t size);
60void 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/*
68call Sha256Prepare() once at program start.
69It prepares all supported implementations, and detects the fastest implementation.
70*/
71
72void Sha256Prepare(void);
73
74EXTERN_C_END
75
76#endif
77