1*3b35e7eeSXin LI /* SPDX-License-Identifier: 0BSD */ 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /** 481ad8388SMartin Matuska * \file lzma/check.h 581ad8388SMartin Matuska * \brief Integrity checks 6c917796cSXin LI * \note Never include this file directly. Use <lzma.h> instead. 781ad8388SMartin Matuska */ 881ad8388SMartin Matuska 981ad8388SMartin Matuska /* 1081ad8388SMartin Matuska * Author: Lasse Collin 1181ad8388SMartin Matuska */ 1281ad8388SMartin Matuska 1381ad8388SMartin Matuska #ifndef LZMA_H_INTERNAL 1481ad8388SMartin Matuska # error Never include this file directly. Use <lzma.h> instead. 1581ad8388SMartin Matuska #endif 1681ad8388SMartin Matuska 1781ad8388SMartin Matuska 1881ad8388SMartin Matuska /** 1981ad8388SMartin Matuska * \brief Type of the integrity check (Check ID) 2081ad8388SMartin Matuska * 2181ad8388SMartin Matuska * The .xz format supports multiple types of checks that are calculated 2281ad8388SMartin Matuska * from the uncompressed data. They vary in both speed and ability to 2381ad8388SMartin Matuska * detect errors. 2481ad8388SMartin Matuska */ 2581ad8388SMartin Matuska typedef enum { 2681ad8388SMartin Matuska LZMA_CHECK_NONE = 0, 2781ad8388SMartin Matuska /**< 2881ad8388SMartin Matuska * No Check is calculated. 2981ad8388SMartin Matuska * 3081ad8388SMartin Matuska * Size of the Check field: 0 bytes 3181ad8388SMartin Matuska */ 3281ad8388SMartin Matuska 3381ad8388SMartin Matuska LZMA_CHECK_CRC32 = 1, 3481ad8388SMartin Matuska /**< 3581ad8388SMartin Matuska * CRC32 using the polynomial from the IEEE 802.3 standard 3681ad8388SMartin Matuska * 3781ad8388SMartin Matuska * Size of the Check field: 4 bytes 3881ad8388SMartin Matuska */ 3981ad8388SMartin Matuska 4081ad8388SMartin Matuska LZMA_CHECK_CRC64 = 4, 4181ad8388SMartin Matuska /**< 4281ad8388SMartin Matuska * CRC64 using the polynomial from the ECMA-182 standard 4381ad8388SMartin Matuska * 4481ad8388SMartin Matuska * Size of the Check field: 8 bytes 4581ad8388SMartin Matuska */ 4681ad8388SMartin Matuska 4781ad8388SMartin Matuska LZMA_CHECK_SHA256 = 10 4881ad8388SMartin Matuska /**< 4981ad8388SMartin Matuska * SHA-256 5081ad8388SMartin Matuska * 5181ad8388SMartin Matuska * Size of the Check field: 32 bytes 5281ad8388SMartin Matuska */ 5381ad8388SMartin Matuska } lzma_check; 5481ad8388SMartin Matuska 5581ad8388SMartin Matuska 5681ad8388SMartin Matuska /** 5781ad8388SMartin Matuska * \brief Maximum valid Check ID 5881ad8388SMartin Matuska * 5981ad8388SMartin Matuska * The .xz file format specification specifies 16 Check IDs (0-15). Some 6081ad8388SMartin Matuska * of them are only reserved, that is, no actual Check algorithm has been 6181ad8388SMartin Matuska * assigned. When decoding, liblzma still accepts unknown Check IDs for 6281ad8388SMartin Matuska * future compatibility. If a valid but unsupported Check ID is detected, 6381ad8388SMartin Matuska * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, 6481ad8388SMartin Matuska * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. 6581ad8388SMartin Matuska */ 6681ad8388SMartin Matuska #define LZMA_CHECK_ID_MAX 15 6781ad8388SMartin Matuska 6881ad8388SMartin Matuska 6981ad8388SMartin Matuska /** 7081ad8388SMartin Matuska * \brief Test if the given Check ID is supported 7181ad8388SMartin Matuska * 72c917796cSXin LI * LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always supported (even if 73c917796cSXin LI * liblzma is built with limited features). 7481ad8388SMartin Matuska * 75c917796cSXin LI * \note It is safe to call this with a value that is not in the 76c917796cSXin LI * range [0, 15]; in that case the return value is always false. 77c917796cSXin LI * 78c917796cSXin LI * \param check Check ID 79c917796cSXin LI * 80c917796cSXin LI * \return lzma_bool: 81c917796cSXin LI * - true if Check ID is supported by this liblzma build. 82c917796cSXin LI * - false otherwise. 8381ad8388SMartin Matuska */ 8481ad8388SMartin Matuska extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) 8581ad8388SMartin Matuska lzma_nothrow lzma_attr_const; 8681ad8388SMartin Matuska 8781ad8388SMartin Matuska 8881ad8388SMartin Matuska /** 8981ad8388SMartin Matuska * \brief Get the size of the Check field with the given Check ID 9081ad8388SMartin Matuska * 9181ad8388SMartin Matuska * Although not all Check IDs have a check algorithm associated, the size of 9281ad8388SMartin Matuska * every Check is already frozen. This function returns the size (in bytes) of 9381ad8388SMartin Matuska * the Check field with the specified Check ID. The values are: 9481ad8388SMartin Matuska * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } 9581ad8388SMartin Matuska * 96c917796cSXin LI * \param check Check ID 97c917796cSXin LI * 98c917796cSXin LI * \return Size of the Check field in bytes. If the argument is not in 99c917796cSXin LI * the range [0, 15], UINT32_MAX is returned. 10081ad8388SMartin Matuska */ 10181ad8388SMartin Matuska extern LZMA_API(uint32_t) lzma_check_size(lzma_check check) 10281ad8388SMartin Matuska lzma_nothrow lzma_attr_const; 10381ad8388SMartin Matuska 10481ad8388SMartin Matuska 10581ad8388SMartin Matuska /** 10681ad8388SMartin Matuska * \brief Maximum size of a Check field 10781ad8388SMartin Matuska */ 10881ad8388SMartin Matuska #define LZMA_CHECK_SIZE_MAX 64 10981ad8388SMartin Matuska 11081ad8388SMartin Matuska 11181ad8388SMartin Matuska /** 11281ad8388SMartin Matuska * \brief Calculate CRC32 11381ad8388SMartin Matuska * 11481ad8388SMartin Matuska * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. 11581ad8388SMartin Matuska * 11681ad8388SMartin Matuska * \param buf Pointer to the input buffer 11781ad8388SMartin Matuska * \param size Size of the input buffer 11881ad8388SMartin Matuska * \param crc Previously returned CRC value. This is used to 11981ad8388SMartin Matuska * calculate the CRC of a big buffer in smaller chunks. 12081ad8388SMartin Matuska * Set to zero when starting a new calculation. 12181ad8388SMartin Matuska * 12281ad8388SMartin Matuska * \return Updated CRC value, which can be passed to this function 12381ad8388SMartin Matuska * again to continue CRC calculation. 12481ad8388SMartin Matuska */ 12581ad8388SMartin Matuska extern LZMA_API(uint32_t) lzma_crc32( 12681ad8388SMartin Matuska const uint8_t *buf, size_t size, uint32_t crc) 12781ad8388SMartin Matuska lzma_nothrow lzma_attr_pure; 12881ad8388SMartin Matuska 12981ad8388SMartin Matuska 13081ad8388SMartin Matuska /** 13181ad8388SMartin Matuska * \brief Calculate CRC64 13281ad8388SMartin Matuska * 13381ad8388SMartin Matuska * Calculate CRC64 using the polynomial from the ECMA-182 standard. 13481ad8388SMartin Matuska * 135c917796cSXin LI * This function is used similarly to lzma_crc32(). 136c917796cSXin LI * 137c917796cSXin LI * \param buf Pointer to the input buffer 138c917796cSXin LI * \param size Size of the input buffer 139c917796cSXin LI * \param crc Previously returned CRC value. This is used to 140c917796cSXin LI * calculate the CRC of a big buffer in smaller chunks. 141c917796cSXin LI * Set to zero when starting a new calculation. 142c917796cSXin LI * 143c917796cSXin LI * \return Updated CRC value, which can be passed to this function 144c917796cSXin LI * again to continue CRC calculation. 14581ad8388SMartin Matuska */ 14681ad8388SMartin Matuska extern LZMA_API(uint64_t) lzma_crc64( 14781ad8388SMartin Matuska const uint8_t *buf, size_t size, uint64_t crc) 14881ad8388SMartin Matuska lzma_nothrow lzma_attr_pure; 14981ad8388SMartin Matuska 15081ad8388SMartin Matuska 15181ad8388SMartin Matuska /** 15281ad8388SMartin Matuska * \brief Get the type of the integrity check 15381ad8388SMartin Matuska * 15481ad8388SMartin Matuska * This function can be called only immediately after lzma_code() has 15581ad8388SMartin Matuska * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. 15681ad8388SMartin Matuska * Calling this function in any other situation has undefined behavior. 157c917796cSXin LI * 158c917796cSXin LI * \param strm Pointer to lzma_stream meeting the above conditions. 159c917796cSXin LI * 160c917796cSXin LI * \return Check ID in the lzma_stream, or undefined if called improperly. 16181ad8388SMartin Matuska */ 16281ad8388SMartin Matuska extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) 16381ad8388SMartin Matuska lzma_nothrow; 164