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