check.h revision 213700
1/////////////////////////////////////////////////////////////////////////////// 2// 3/// \file check.h 4/// \brief Internal API to different integrity check functions 5// 6// Author: Lasse Collin 7// 8// This file has been put into the public domain. 9// You can do whatever you want with this file. 10// 11/////////////////////////////////////////////////////////////////////////////// 12 13#ifndef LZMA_CHECK_H 14#define LZMA_CHECK_H 15 16#include "common.h" 17 18 19// Index hashing needs the best possible hash function (preferably 20// a cryptographic hash) for maximum reliability. 21#if defined(HAVE_CHECK_SHA256) 22# define LZMA_CHECK_BEST LZMA_CHECK_SHA256 23#elif defined(HAVE_CHECK_CRC64) 24# define LZMA_CHECK_BEST LZMA_CHECK_CRC64 25#else 26# define LZMA_CHECK_BEST LZMA_CHECK_CRC32 27#endif 28 29 30/// \brief Structure to hold internal state of the check being calculated 31/// 32/// \note This is not in the public API because this structure may 33/// change in future if new integrity check algorithms are added. 34typedef struct { 35 /// Buffer to hold the final result and a temporary buffer for SHA256. 36 union { 37 uint8_t u8[64]; 38 uint32_t u32[16]; 39 uint64_t u64[8]; 40 } buffer; 41 42 /// Check-specific data 43 union { 44 uint32_t crc32; 45 uint64_t crc64; 46 47 struct { 48 /// Internal state 49 uint32_t state[8]; 50 51 /// Size of the message excluding padding 52 uint64_t size; 53 } sha256; 54 } state; 55 56} lzma_check_state; 57 58 59/// lzma_crc32_table[0] is needed by LZ encoder so we need to keep 60/// the array two-dimensional. 61#ifdef HAVE_SMALL 62extern uint32_t lzma_crc32_table[1][256]; 63extern void lzma_crc32_init(void); 64#else 65extern const uint32_t lzma_crc32_table[8][256]; 66extern const uint64_t lzma_crc64_table[4][256]; 67#endif 68 69 70/// \brief Initialize *check depending on type 71/// 72/// \return LZMA_OK on success. LZMA_UNSUPPORTED_CHECK if the type is not 73/// supported by the current version or build of liblzma. 74/// LZMA_PROG_ERROR if type > LZMA_CHECK_ID_MAX. 75extern void lzma_check_init(lzma_check_state *check, lzma_check type); 76 77/// Update the check state 78extern void lzma_check_update(lzma_check_state *check, lzma_check type, 79 const uint8_t *buf, size_t size); 80 81/// Finish the check calculation and store the result to check->buffer.u8. 82extern void lzma_check_finish(lzma_check_state *check, lzma_check type); 83 84 85/// Prepare SHA-256 state for new input. 86extern void lzma_sha256_init(lzma_check_state *check); 87 88/// Update the SHA-256 hash state 89extern void lzma_sha256_update( 90 const uint8_t *buf, size_t size, lzma_check_state *check); 91 92/// Finish the SHA-256 calculation and store the result to check->buffer.u8. 93extern void lzma_sha256_finish(lzma_check_state *check); 94 95#endif 96