cml_chain/byron/
crc32.rs

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/// structure to compute the CRC32 of chunks of bytes.
265///
266/// This structure allows implements the `Write` trait making it easier
267/// to compute the crc32 of a stream.
268#[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    /// initialise a new CRC32 state
297    #[inline]
298    pub fn new() -> Self {
299        Crc32(0xFFFF_FFFF)
300    }
301
302    /// update the CRC32 with the given bytes.
303    ///
304    /// beware that the order in which you update the Crc32
305    /// matter.
306    #[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    /// finalize the CRC32, recovering the computed value
319    #[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
363/// function is kept for compatibility. however prefer the
364/// `Crc32` structure.
365///
366pub 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}