xref: /freebsd/contrib/xz/src/liblzma/api/lzma/check.h (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
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