1207753Smm/** 2207753Smm * \file lzma/check.h 3207753Smm * \brief Integrity checks 4207753Smm */ 5207753Smm 6207753Smm/* 7207753Smm * Author: Lasse Collin 8207753Smm * 9207753Smm * This file has been put into the public domain. 10207753Smm * You can do whatever you want with this file. 11207753Smm * 12207753Smm * See ../lzma.h for information about liblzma as a whole. 13207753Smm */ 14207753Smm 15207753Smm#ifndef LZMA_H_INTERNAL 16207753Smm# error Never include this file directly. Use <lzma.h> instead. 17207753Smm#endif 18207753Smm 19207753Smm 20207753Smm/** 21207753Smm * \brief Type of the integrity check (Check ID) 22207753Smm * 23207753Smm * The .xz format supports multiple types of checks that are calculated 24207753Smm * from the uncompressed data. They vary in both speed and ability to 25207753Smm * detect errors. 26207753Smm */ 27207753Smmtypedef enum { 28207753Smm LZMA_CHECK_NONE = 0, 29207753Smm /**< 30207753Smm * No Check is calculated. 31207753Smm * 32207753Smm * Size of the Check field: 0 bytes 33207753Smm */ 34207753Smm 35207753Smm LZMA_CHECK_CRC32 = 1, 36207753Smm /**< 37207753Smm * CRC32 using the polynomial from the IEEE 802.3 standard 38207753Smm * 39207753Smm * Size of the Check field: 4 bytes 40207753Smm */ 41207753Smm 42207753Smm LZMA_CHECK_CRC64 = 4, 43207753Smm /**< 44207753Smm * CRC64 using the polynomial from the ECMA-182 standard 45207753Smm * 46207753Smm * Size of the Check field: 8 bytes 47207753Smm */ 48207753Smm 49207753Smm LZMA_CHECK_SHA256 = 10 50207753Smm /**< 51207753Smm * SHA-256 52207753Smm * 53207753Smm * Size of the Check field: 32 bytes 54207753Smm */ 55207753Smm} lzma_check; 56207753Smm 57207753Smm 58207753Smm/** 59207753Smm * \brief Maximum valid Check ID 60207753Smm * 61207753Smm * The .xz file format specification specifies 16 Check IDs (0-15). Some 62207753Smm * of them are only reserved, that is, no actual Check algorithm has been 63207753Smm * assigned. When decoding, liblzma still accepts unknown Check IDs for 64207753Smm * future compatibility. If a valid but unsupported Check ID is detected, 65207753Smm * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, 66207753Smm * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. 67207753Smm */ 68207753Smm#define LZMA_CHECK_ID_MAX 15 69207753Smm 70207753Smm 71207753Smm/** 72207753Smm * \brief Test if the given Check ID is supported 73207753Smm * 74207753Smm * Return true if the given Check ID is supported by this liblzma build. 75207753Smm * Otherwise false is returned. It is safe to call this with a value that 76207753Smm * is not in the range [0, 15]; in that case the return value is always false. 77207753Smm * 78207753Smm * You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always 79207753Smm * supported (even if liblzma is built with limited features). 80207753Smm */ 81207753Smmextern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) 82207753Smm lzma_nothrow lzma_attr_const; 83207753Smm 84207753Smm 85207753Smm/** 86207753Smm * \brief Get the size of the Check field with the given Check ID 87207753Smm * 88207753Smm * Although not all Check IDs have a check algorithm associated, the size of 89207753Smm * every Check is already frozen. This function returns the size (in bytes) of 90207753Smm * the Check field with the specified Check ID. The values are: 91207753Smm * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } 92207753Smm * 93207753Smm * If the argument is not in the range [0, 15], UINT32_MAX is returned. 94207753Smm */ 95207753Smmextern LZMA_API(uint32_t) lzma_check_size(lzma_check check) 96207753Smm lzma_nothrow lzma_attr_const; 97207753Smm 98207753Smm 99207753Smm/** 100207753Smm * \brief Maximum size of a Check field 101207753Smm */ 102207753Smm#define LZMA_CHECK_SIZE_MAX 64 103207753Smm 104207753Smm 105207753Smm/** 106207753Smm * \brief Calculate CRC32 107207753Smm * 108207753Smm * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. 109207753Smm * 110207753Smm * \param buf Pointer to the input buffer 111207753Smm * \param size Size of the input buffer 112207753Smm * \param crc Previously returned CRC value. This is used to 113207753Smm * calculate the CRC of a big buffer in smaller chunks. 114207753Smm * Set to zero when starting a new calculation. 115207753Smm * 116207753Smm * \return Updated CRC value, which can be passed to this function 117207753Smm * again to continue CRC calculation. 118207753Smm */ 119207753Smmextern LZMA_API(uint32_t) lzma_crc32( 120207753Smm const uint8_t *buf, size_t size, uint32_t crc) 121207753Smm lzma_nothrow lzma_attr_pure; 122207753Smm 123207753Smm 124207753Smm/** 125207753Smm * \brief Calculate CRC64 126207753Smm * 127207753Smm * Calculate CRC64 using the polynomial from the ECMA-182 standard. 128207753Smm * 129207753Smm * This function is used similarly to lzma_crc32(). See its documentation. 130207753Smm */ 131207753Smmextern LZMA_API(uint64_t) lzma_crc64( 132207753Smm const uint8_t *buf, size_t size, uint64_t crc) 133207753Smm lzma_nothrow lzma_attr_pure; 134207753Smm 135207753Smm 136207753Smm/* 137207753Smm * SHA-256 functions are currently not exported to public API. 138207753Smm * Contact Lasse Collin if you think it should be. 139207753Smm */ 140207753Smm 141207753Smm 142207753Smm/** 143207753Smm * \brief Get the type of the integrity check 144207753Smm * 145207753Smm * This function can be called only immediately after lzma_code() has 146207753Smm * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. 147207753Smm * Calling this function in any other situation has undefined behavior. 148207753Smm */ 149207753Smmextern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) 150207753Smm lzma_nothrow; 151