1use super::*;
2
3use cml_core::{error::DeserializeError, serialization::Deserialize};
4
5const CRC_TABLE: [u32; 256] = [
6 0x00000000u32,
7 0x77073096u32,
8 0xee0e612cu32,
9 0x990951bau32,
10 0x076dc419u32,
11 0x706af48fu32,
12 0xe963a535u32,
13 0x9e6495a3u32,
14 0x0edb8832u32,
15 0x79dcb8a4u32,
16 0xe0d5e91eu32,
17 0x97d2d988u32,
18 0x09b64c2bu32,
19 0x7eb17cbdu32,
20 0xe7b82d07u32,
21 0x90bf1d91u32,
22 0x1db71064u32,
23 0x6ab020f2u32,
24 0xf3b97148u32,
25 0x84be41deu32,
26 0x1adad47du32,
27 0x6ddde4ebu32,
28 0xf4d4b551u32,
29 0x83d385c7u32,
30 0x136c9856u32,
31 0x646ba8c0u32,
32 0xfd62f97au32,
33 0x8a65c9ecu32,
34 0x14015c4fu32,
35 0x63066cd9u32,
36 0xfa0f3d63u32,
37 0x8d080df5u32,
38 0x3b6e20c8u32,
39 0x4c69105eu32,
40 0xd56041e4u32,
41 0xa2677172u32,
42 0x3c03e4d1u32,
43 0x4b04d447u32,
44 0xd20d85fdu32,
45 0xa50ab56bu32,
46 0x35b5a8fau32,
47 0x42b2986cu32,
48 0xdbbbc9d6u32,
49 0xacbcf940u32,
50 0x32d86ce3u32,
51 0x45df5c75u32,
52 0xdcd60dcfu32,
53 0xabd13d59u32,
54 0x26d930acu32,
55 0x51de003au32,
56 0xc8d75180u32,
57 0xbfd06116u32,
58 0x21b4f4b5u32,
59 0x56b3c423u32,
60 0xcfba9599u32,
61 0xb8bda50fu32,
62 0x2802b89eu32,
63 0x5f058808u32,
64 0xc60cd9b2u32,
65 0xb10be924u32,
66 0x2f6f7c87u32,
67 0x58684c11u32,
68 0xc1611dabu32,
69 0xb6662d3du32,
70 0x76dc4190u32,
71 0x01db7106u32,
72 0x98d220bcu32,
73 0xefd5102au32,
74 0x71b18589u32,
75 0x06b6b51fu32,
76 0x9fbfe4a5u32,
77 0xe8b8d433u32,
78 0x7807c9a2u32,
79 0x0f00f934u32,
80 0x9609a88eu32,
81 0xe10e9818u32,
82 0x7f6a0dbbu32,
83 0x086d3d2du32,
84 0x91646c97u32,
85 0xe6635c01u32,
86 0x6b6b51f4u32,
87 0x1c6c6162u32,
88 0x856530d8u32,
89 0xf262004eu32,
90 0x6c0695edu32,
91 0x1b01a57bu32,
92 0x8208f4c1u32,
93 0xf50fc457u32,
94 0x65b0d9c6u32,
95 0x12b7e950u32,
96 0x8bbeb8eau32,
97 0xfcb9887cu32,
98 0x62dd1ddfu32,
99 0x15da2d49u32,
100 0x8cd37cf3u32,
101 0xfbd44c65u32,
102 0x4db26158u32,
103 0x3ab551ceu32,
104 0xa3bc0074u32,
105 0xd4bb30e2u32,
106 0x4adfa541u32,
107 0x3dd895d7u32,
108 0xa4d1c46du32,
109 0xd3d6f4fbu32,
110 0x4369e96au32,
111 0x346ed9fcu32,
112 0xad678846u32,
113 0xda60b8d0u32,
114 0x44042d73u32,
115 0x33031de5u32,
116 0xaa0a4c5fu32,
117 0xdd0d7cc9u32,
118 0x5005713cu32,
119 0x270241aau32,
120 0xbe0b1010u32,
121 0xc90c2086u32,
122 0x5768b525u32,
123 0x206f85b3u32,
124 0xb966d409u32,
125 0xce61e49fu32,
126 0x5edef90eu32,
127 0x29d9c998u32,
128 0xb0d09822u32,
129 0xc7d7a8b4u32,
130 0x59b33d17u32,
131 0x2eb40d81u32,
132 0xb7bd5c3bu32,
133 0xc0ba6cadu32,
134 0xedb88320u32,
135 0x9abfb3b6u32,
136 0x03b6e20cu32,
137 0x74b1d29au32,
138 0xead54739u32,
139 0x9dd277afu32,
140 0x04db2615u32,
141 0x73dc1683u32,
142 0xe3630b12u32,
143 0x94643b84u32,
144 0x0d6d6a3eu32,
145 0x7a6a5aa8u32,
146 0xe40ecf0bu32,
147 0x9309ff9du32,
148 0x0a00ae27u32,
149 0x7d079eb1u32,
150 0xf00f9344u32,
151 0x8708a3d2u32,
152 0x1e01f268u32,
153 0x6906c2feu32,
154 0xf762575du32,
155 0x806567cbu32,
156 0x196c3671u32,
157 0x6e6b06e7u32,
158 0xfed41b76u32,
159 0x89d32be0u32,
160 0x10da7a5au32,
161 0x67dd4accu32,
162 0xf9b9df6fu32,
163 0x8ebeeff9u32,
164 0x17b7be43u32,
165 0x60b08ed5u32,
166 0xd6d6a3e8u32,
167 0xa1d1937eu32,
168 0x38d8c2c4u32,
169 0x4fdff252u32,
170 0xd1bb67f1u32,
171 0xa6bc5767u32,
172 0x3fb506ddu32,
173 0x48b2364bu32,
174 0xd80d2bdau32,
175 0xaf0a1b4cu32,
176 0x36034af6u32,
177 0x41047a60u32,
178 0xdf60efc3u32,
179 0xa867df55u32,
180 0x316e8eefu32,
181 0x4669be79u32,
182 0xcb61b38cu32,
183 0xbc66831au32,
184 0x256fd2a0u32,
185 0x5268e236u32,
186 0xcc0c7795u32,
187 0xbb0b4703u32,
188 0x220216b9u32,
189 0x5505262fu32,
190 0xc5ba3bbeu32,
191 0xb2bd0b28u32,
192 0x2bb45a92u32,
193 0x5cb36a04u32,
194 0xc2d7ffa7u32,
195 0xb5d0cf31u32,
196 0x2cd99e8bu32,
197 0x5bdeae1du32,
198 0x9b64c2b0u32,
199 0xec63f226u32,
200 0x756aa39cu32,
201 0x026d930au32,
202 0x9c0906a9u32,
203 0xeb0e363fu32,
204 0x72076785u32,
205 0x05005713u32,
206 0x95bf4a82u32,
207 0xe2b87a14u32,
208 0x7bb12baeu32,
209 0x0cb61b38u32,
210 0x92d28e9bu32,
211 0xe5d5be0du32,
212 0x7cdcefb7u32,
213 0x0bdbdf21u32,
214 0x86d3d2d4u32,
215 0xf1d4e242u32,
216 0x68ddb3f8u32,
217 0x1fda836eu32,
218 0x81be16cdu32,
219 0xf6b9265bu32,
220 0x6fb077e1u32,
221 0x18b74777u32,
222 0x88085ae6u32,
223 0xff0f6a70u32,
224 0x66063bcau32,
225 0x11010b5cu32,
226 0x8f659effu32,
227 0xf862ae69u32,
228 0x616bffd3u32,
229 0x166ccf45u32,
230 0xa00ae278u32,
231 0xd70dd2eeu32,
232 0x4e048354u32,
233 0x3903b3c2u32,
234 0xa7672661u32,
235 0xd06016f7u32,
236 0x4969474du32,
237 0x3e6e77dbu32,
238 0xaed16a4au32,
239 0xd9d65adcu32,
240 0x40df0b66u32,
241 0x37d83bf0u32,
242 0xa9bcae53u32,
243 0xdebb9ec5u32,
244 0x47b2cf7fu32,
245 0x30b5ffe9u32,
246 0xbdbdf21cu32,
247 0xcabac28au32,
248 0x53b39330u32,
249 0x24b4a3a6u32,
250 0xbad03605u32,
251 0xcdd70693u32,
252 0x54de5729u32,
253 0x23d967bfu32,
254 0xb3667a2eu32,
255 0xc4614ab8u32,
256 0x5d681b02u32,
257 0x2a6f2b94u32,
258 0xb40bbe37u32,
259 0xc30c8ea1u32,
260 0x5a05df1bu32,
261 0x2d02ef8du32,
262];
263
264#[derive(
269 Clone,
270 Debug,
271 Eq,
272 PartialEq,
273 Ord,
274 PartialOrd,
275 Hash,
276 serde::Deserialize,
277 serde::Serialize,
278 schemars::JsonSchema,
279 Copy,
280)]
281pub struct Crc32(u32);
282
283impl From<Crc32> for u32 {
284 fn from(val: Crc32) -> Self {
285 val.0
286 }
287}
288
289impl From<u32> for Crc32 {
290 fn from(inner: u32) -> Self {
291 Crc32(inner)
292 }
293}
294
295impl Crc32 {
296 #[inline]
298 pub fn new() -> Self {
299 Crc32(0xFFFF_FFFF)
300 }
301
302 #[inline]
307 pub fn update<'a, I>(&'a mut self, bytes: I) -> &mut Self
308 where
309 I: IntoIterator<Item = &'a u8>,
310 {
311 for byte in bytes {
312 let index = (self.0 ^ (*byte as u32)) & 0xFF;
313 self.0 = (self.0 >> 8) ^ CRC_TABLE[index as usize];
314 }
315 self
316 }
317
318 #[inline]
320 pub fn finalize(self) -> u32 {
321 self.0 ^ 0xFFFF_FFFF
322 }
323}
324impl ::std::io::Write for Crc32 {
325 #[inline]
326 fn write(&mut self, bytes: &[u8]) -> Result<usize, std::io::Error> {
327 self.update(bytes.iter());
328 Ok(bytes.len())
329 }
330 #[inline]
331 fn flush(&mut self) -> Result<(), std::io::Error> {
332 Ok(())
333 }
334}
335
336impl cbor_event::se::Serialize for Crc32 {
337 fn serialize<'se, W: Write>(
338 &self,
339 serializer: &'se mut Serializer<W>,
340 ) -> cbor_event::Result<&'se mut Serializer<W>> {
341 serializer.write_unsigned_integer(self.0 as u64)
342 }
343}
344
345impl Deserialize for Crc32 {
346 fn deserialize<R: BufRead>(raw: &mut Deserializer<R>) -> Result<Self, DeserializeError> {
347 Ok(Self(raw.unsigned_integer()? as u32))
348 }
349}
350
351impl std::fmt::Display for Crc32 {
352 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
353 write!(f, "{:#04x}", self.0)
354 }
355}
356
357impl Default for Crc32 {
358 fn default() -> Self {
359 Self::new()
360 }
361}
362
363pub fn crc32(input: &[u8]) -> u32 {
367 let mut crc32 = Crc32::new();
368 crc32.update(input.iter());
369 crc32.finalize()
370}
371
372#[cfg(test)]
373mod tests {
374 #[test]
375 fn crc32() {
376 let s = b"The quick brown fox jumps over the lazy dog";
377 assert_eq!(0x414fa339, super::crc32(s));
378 }
379}