2023-05-17 17:03:13 +00:00
|
|
|
/* Sha256.h -- SHA-256 Hash
|
|
|
|
2021-01-01 : Igor Pavlov : Public domain */
|
|
|
|
|
|
|
|
#ifndef __7Z_SHA256_H
|
|
|
|
#define __7Z_SHA256_H
|
|
|
|
|
|
|
|
#include "7zTypes.h"
|
|
|
|
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
|
|
|
|
#define SHA256_NUM_BLOCK_WORDS 16
|
|
|
|
#define SHA256_NUM_DIGEST_WORDS 8
|
|
|
|
|
|
|
|
#define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4)
|
|
|
|
#define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4)
|
|
|
|
|
|
|
|
typedef void (MY_FAST_CALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks);
|
|
|
|
|
|
|
|
/*
|
|
|
|
if (the system supports different SHA256 code implementations)
|
|
|
|
{
|
|
|
|
(CSha256::func_UpdateBlocks) will be used
|
|
|
|
(CSha256::func_UpdateBlocks) can be set by
|
|
|
|
Sha256_Init() - to default (fastest)
|
|
|
|
Sha256_SetFunction() - to any algo
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
(CSha256::func_UpdateBlocks) is ignored.
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks;
|
|
|
|
UInt64 count;
|
|
|
|
UInt64 __pad_2[2];
|
|
|
|
UInt32 state[SHA256_NUM_DIGEST_WORDS];
|
|
|
|
|
|
|
|
Byte buffer[SHA256_BLOCK_SIZE];
|
|
|
|
} CSha256;
|
|
|
|
|
|
|
|
|
|
|
|
#define SHA256_ALGO_DEFAULT 0
|
|
|
|
#define SHA256_ALGO_SW 1
|
|
|
|
#define SHA256_ALGO_HW 2
|
|
|
|
|
|
|
|
/*
|
|
|
|
Sha256_SetFunction()
|
|
|
|
return:
|
|
|
|
0 - (algo) value is not supported, and func_UpdateBlocks was not changed
|
|
|
|
1 - func_UpdateBlocks was set according (algo) value.
|
|
|
|
*/
|
|
|
|
|
|
|
|
BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo);
|
|
|
|
|
|
|
|
void Sha256_InitState(CSha256 *p);
|
|
|
|
void Sha256_Init(CSha256 *p);
|
|
|
|
void Sha256_Update(CSha256 *p, const Byte *data, size_t size);
|
|
|
|
void Sha256_Final(CSha256 *p, Byte *digest);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks);
|
|
|
|
|
|
|
|
/*
|
|
|
|
call Sha256Prepare() once at program start.
|
|
|
|
It prepares all supported implementations, and detects the fastest implementation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void Sha256Prepare(void);
|
|
|
|
|
|
|
|
EXTERN_C_END
|
|
|
|
|
|
|
|
#endif
|