1 // SPDX-License-Identifier: 0BSD
2
3 ///////////////////////////////////////////////////////////////////////////////
4 //
5 /// \file check.c
6 /// \brief Single API to access different integrity checks
7 //
8 // Author: Lasse Collin
9 //
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #include "check.h"
13
14
15 extern LZMA_API(lzma_bool)
lzma_check_is_supported(lzma_check type)16 lzma_check_is_supported(lzma_check type)
17 {
18 if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
19 return false;
20
21 static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = {
22 true, // LZMA_CHECK_NONE
23
24 #ifdef HAVE_CHECK_CRC32
25 true,
26 #else
27 false,
28 #endif
29
30 false, // Reserved
31 false, // Reserved
32
33 #ifdef HAVE_CHECK_CRC64
34 true,
35 #else
36 false,
37 #endif
38
39 false, // Reserved
40 false, // Reserved
41 false, // Reserved
42 false, // Reserved
43 false, // Reserved
44
45 #ifdef HAVE_CHECK_SHA256
46 true,
47 #else
48 false,
49 #endif
50
51 false, // Reserved
52 false, // Reserved
53 false, // Reserved
54 false, // Reserved
55 false, // Reserved
56 };
57
58 return available_checks[(unsigned int)(type)];
59 }
60
61
62 extern LZMA_API(uint32_t)
lzma_check_size(lzma_check type)63 lzma_check_size(lzma_check type)
64 {
65 if ((unsigned int)(type) > LZMA_CHECK_ID_MAX)
66 return UINT32_MAX;
67
68 // See file-format.txt section 2.1.1.2.
69 static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = {
70 0,
71 4, 4, 4,
72 8, 8, 8,
73 16, 16, 16,
74 32, 32, 32,
75 64, 64, 64
76 };
77
78 return check_sizes[(unsigned int)(type)];
79 }
80
81
82 extern void
lzma_check_init(lzma_check_state * check,lzma_check type)83 lzma_check_init(lzma_check_state *check, lzma_check type)
84 {
85 switch (type) {
86 case LZMA_CHECK_NONE:
87 break;
88
89 #ifdef HAVE_CHECK_CRC32
90 case LZMA_CHECK_CRC32:
91 check->state.crc32 = 0;
92 break;
93 #endif
94
95 #ifdef HAVE_CHECK_CRC64
96 case LZMA_CHECK_CRC64:
97 check->state.crc64 = 0;
98 break;
99 #endif
100
101 #ifdef HAVE_CHECK_SHA256
102 case LZMA_CHECK_SHA256:
103 lzma_sha256_init(check);
104 break;
105 #endif
106
107 default:
108 break;
109 }
110
111 return;
112 }
113
114
115 extern void
lzma_check_update(lzma_check_state * check,lzma_check type,const uint8_t * buf,size_t size)116 lzma_check_update(lzma_check_state *check, lzma_check type,
117 const uint8_t *buf, size_t size)
118 {
119 switch (type) {
120 #ifdef HAVE_CHECK_CRC32
121 case LZMA_CHECK_CRC32:
122 check->state.crc32 = lzma_crc32(buf, size, check->state.crc32);
123 break;
124 #endif
125
126 #ifdef HAVE_CHECK_CRC64
127 case LZMA_CHECK_CRC64:
128 check->state.crc64 = lzma_crc64(buf, size, check->state.crc64);
129 break;
130 #endif
131
132 #ifdef HAVE_CHECK_SHA256
133 case LZMA_CHECK_SHA256:
134 lzma_sha256_update(buf, size, check);
135 break;
136 #endif
137
138 default:
139 break;
140 }
141
142 return;
143 }
144
145
146 extern void
lzma_check_finish(lzma_check_state * check,lzma_check type)147 lzma_check_finish(lzma_check_state *check, lzma_check type)
148 {
149 switch (type) {
150 #ifdef HAVE_CHECK_CRC32
151 case LZMA_CHECK_CRC32:
152 check->buffer.u32[0] = conv32le(check->state.crc32);
153 break;
154 #endif
155
156 #ifdef HAVE_CHECK_CRC64
157 case LZMA_CHECK_CRC64:
158 check->buffer.u64[0] = conv64le(check->state.crc64);
159 break;
160 #endif
161
162 #ifdef HAVE_CHECK_SHA256
163 case LZMA_CHECK_SHA256:
164 lzma_sha256_finish(check);
165 break;
166 #endif
167
168 default:
169 break;
170 }
171
172 return;
173 }
174