1 /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 // vim: expandtab:ts=8:sw=4:softtabstop=4:
3 /**
4  * \file        lzma/check.h
5  * \brief       Integrity checks
6  */
7 
8 /*
9  * Author: Lasse Collin
10  *
11  * This file has been put into the public domain.
12  * You can do whatever you want with this file.
13  *
14  * See ../lzma.h for information about liblzma as a whole.
15  */
16 
17 #ifndef LZMA_H_INTERNAL
18 #	error Never include this file directly. Use <lzma.h> instead.
19 #endif
20 
21 
22 /**
23  * \brief       Type of the integrity check (Check ID)
24  *
25  * The .xz format supports multiple types of checks that are calculated
26  * from the uncompressed data. They vary in both speed and ability to
27  * detect errors.
28  */
29 typedef enum {
30 	LZMA_CHECK_NONE     = 0,
31 		/**<
32 		 * No Check is calculated.
33 		 *
34 		 * Size of the Check field: 0 bytes
35 		 */
36 
37 	LZMA_CHECK_CRC32    = 1,
38 		/**<
39 		 * CRC32 using the polynomial from the IEEE 802.3 standard
40 		 *
41 		 * Size of the Check field: 4 bytes
42 		 */
43 
44 	LZMA_CHECK_CRC64    = 4,
45 		/**<
46 		 * CRC64 using the polynomial from the ECMA-182 standard
47 		 *
48 		 * Size of the Check field: 8 bytes
49 		 */
50 
51 	LZMA_CHECK_SHA256   = 10
52 		/**<
53 		 * SHA-256
54 		 *
55 		 * Size of the Check field: 32 bytes
56 		 */
57 } lzma_check;
58 
59 
60 /**
61  * \brief       Maximum valid Check ID
62  *
63  * The .xz file format specification specifies 16 Check IDs (0-15). Some
64  * of them are only reserved, that is, no actual Check algorithm has been
65  * assigned. When decoding, liblzma still accepts unknown Check IDs for
66  * future compatibility. If a valid but unsupported Check ID is detected,
67  * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK,
68  * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h.
69  */
70 #define LZMA_CHECK_ID_MAX 15
71 
72 
73 /**
74  * \brief       Test if the given Check ID is supported
75  *
76  * Return true if the given Check ID is supported by this liblzma build.
77  * Otherwise false is returned. It is safe to call this with a value that
78  * is not in the range [0, 15]; in that case the return value is always false.
79  *
80  * You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always
81  * supported (even if liblzma is built with limited features).
82  */
83 extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check)
84 		lzma_nothrow lzma_attr_const;
85 
86 
87 /**
88  * \brief       Get the size of the Check field with the given Check ID
89  *
90  * Although not all Check IDs have a check algorithm associated, the size of
91  * every Check is already frozen. This function returns the size (in bytes) of
92  * the Check field with the specified Check ID. The values are:
93  * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 }
94  *
95  * If the argument is not in the range [0, 15], UINT32_MAX is returned.
96  */
97 extern LZMA_API(uint32_t) lzma_check_size(lzma_check check)
98 		lzma_nothrow lzma_attr_const;
99 
100 
101 /**
102  * \brief       Maximum size of a Check field
103  */
104 #define LZMA_CHECK_SIZE_MAX 64
105 
106 
107 /**
108  * \brief       Calculate CRC32
109  *
110  * Calculate CRC32 using the polynomial from the IEEE 802.3 standard.
111  *
112  * \param       buf     Pointer to the input buffer
113  * \param       size    Size of the input buffer
114  * \param       crc     Previously returned CRC value. This is used to
115  *                      calculate the CRC of a big buffer in smaller chunks.
116  *                      Set to zero when starting a new calculation.
117  *
118  * \return      Updated CRC value, which can be passed to this function
119  *              again to continue CRC calculation.
120  */
121 extern LZMA_API(uint32_t) lzma_crc32(
122 		const uint8_t *buf, size_t size, uint32_t crc)
123 		lzma_nothrow lzma_attr_pure;
124 
125 
126 /**
127  * \brief       Calculate CRC64
128  *
129  * Calculate CRC64 using the polynomial from the ECMA-182 standard.
130  *
131  * This function is used similarly to lzma_crc32(). See its documentation.
132  */
133 extern LZMA_API(uint64_t) lzma_crc64(
134 		const uint8_t *buf, size_t size, uint64_t crc)
135 		lzma_nothrow lzma_attr_pure;
136 
137 
138 /*
139  * SHA-256 functions are currently not exported to public API.
140  * Contact Lasse Collin if you think it should be.
141  */
142 
143 
144 /**
145  * \brief       Get the type of the integrity check
146  *
147  * This function can be called only immediatelly after lzma_code() has
148  * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK.
149  * Calling this function in any other situation has undefined behavior.
150  */
151 extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm)
152 		lzma_nothrow;
153