xref: /freebsd-src/sys/contrib/xz-embedded/linux/lib/xz/xz_crc64.c (revision cd3a777bca91669fc4711d1eff66c40f3f62a223)
1f0bd5302SXin LI /*
2f0bd5302SXin LI  * CRC64 using the polynomial from ECMA-182
3f0bd5302SXin LI  *
4f0bd5302SXin LI  * This file is similar to xz_crc32.c. See the comments there.
5f0bd5302SXin LI  *
6f0bd5302SXin LI  * Authors: Lasse Collin <lasse.collin@tukaani.org>
7*cd3a777bSXin LI  *          Igor Pavlov <https://7-zip.org/>
8f0bd5302SXin LI  *
9f0bd5302SXin LI  * This file has been put into the public domain.
10f0bd5302SXin LI  * You can do whatever you want with this file.
11f0bd5302SXin LI  */
12f0bd5302SXin LI 
13f0bd5302SXin LI #include "xz_private.h"
14f0bd5302SXin LI 
15f0bd5302SXin LI #ifndef STATIC_RW_DATA
16f0bd5302SXin LI #	define STATIC_RW_DATA static
17f0bd5302SXin LI #endif
18f0bd5302SXin LI 
19f0bd5302SXin LI STATIC_RW_DATA uint64_t xz_crc64_table[256];
20f0bd5302SXin LI 
xz_crc64_init(void)21f0bd5302SXin LI XZ_EXTERN void xz_crc64_init(void)
22f0bd5302SXin LI {
23*cd3a777bSXin LI 	/*
24*cd3a777bSXin LI 	 * The ULL suffix is needed for -std=gnu89 compatibility
25*cd3a777bSXin LI 	 * on 32-bit platforms.
26*cd3a777bSXin LI 	 */
27*cd3a777bSXin LI 	const uint64_t poly = 0xC96C5795D7870F42ULL;
28f0bd5302SXin LI 
29f0bd5302SXin LI 	uint32_t i;
30f0bd5302SXin LI 	uint32_t j;
31f0bd5302SXin LI 	uint64_t r;
32f0bd5302SXin LI 
33f0bd5302SXin LI 	for (i = 0; i < 256; ++i) {
34f0bd5302SXin LI 		r = i;
35f0bd5302SXin LI 		for (j = 0; j < 8; ++j)
36f0bd5302SXin LI 			r = (r >> 1) ^ (poly & ~((r & 1) - 1));
37f0bd5302SXin LI 
38f0bd5302SXin LI 		xz_crc64_table[i] = r;
39f0bd5302SXin LI 	}
40f0bd5302SXin LI 
41f0bd5302SXin LI 	return;
42f0bd5302SXin LI }
43f0bd5302SXin LI 
xz_crc64(const uint8_t * buf,size_t size,uint64_t crc)44f0bd5302SXin LI XZ_EXTERN uint64_t xz_crc64(const uint8_t *buf, size_t size, uint64_t crc)
45f0bd5302SXin LI {
46f0bd5302SXin LI 	crc = ~crc;
47f0bd5302SXin LI 
48f0bd5302SXin LI 	while (size != 0) {
49f0bd5302SXin LI 		crc = xz_crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
50f0bd5302SXin LI 		--size;
51f0bd5302SXin LI 	}
52f0bd5302SXin LI 
53f0bd5302SXin LI 	return ~crc;
54f0bd5302SXin LI }
55