xref: /aosp_15_r20/external/xz-embedded/linux/lib/xz/xz_crc64.c (revision d2c16535d139cb185e89120452531bba6b36d3c6)
1*d2c16535SElliott Hughes // SPDX-License-Identifier: 0BSD
2*d2c16535SElliott Hughes 
3*d2c16535SElliott Hughes /*
4*d2c16535SElliott Hughes  * CRC64 using the polynomial from ECMA-182
5*d2c16535SElliott Hughes  *
6*d2c16535SElliott Hughes  * This file is similar to xz_crc32.c. See the comments there.
7*d2c16535SElliott Hughes  *
8*d2c16535SElliott Hughes  * Authors: Lasse Collin <[email protected]>
9*d2c16535SElliott Hughes  *          Igor Pavlov <https://7-zip.org/>
10*d2c16535SElliott Hughes  */
11*d2c16535SElliott Hughes 
12*d2c16535SElliott Hughes #include "xz_private.h"
13*d2c16535SElliott Hughes 
14*d2c16535SElliott Hughes #ifndef STATIC_RW_DATA
15*d2c16535SElliott Hughes #	define STATIC_RW_DATA static
16*d2c16535SElliott Hughes #endif
17*d2c16535SElliott Hughes 
18*d2c16535SElliott Hughes STATIC_RW_DATA uint64_t xz_crc64_table[256];
19*d2c16535SElliott Hughes 
xz_crc64_init(void)20*d2c16535SElliott Hughes XZ_EXTERN void xz_crc64_init(void)
21*d2c16535SElliott Hughes {
22*d2c16535SElliott Hughes 	/*
23*d2c16535SElliott Hughes 	 * The ULL suffix is needed for -std=gnu89 compatibility
24*d2c16535SElliott Hughes 	 * on 32-bit platforms.
25*d2c16535SElliott Hughes 	 */
26*d2c16535SElliott Hughes 	const uint64_t poly = 0xC96C5795D7870F42ULL;
27*d2c16535SElliott Hughes 
28*d2c16535SElliott Hughes 	uint32_t i;
29*d2c16535SElliott Hughes 	uint32_t j;
30*d2c16535SElliott Hughes 	uint64_t r;
31*d2c16535SElliott Hughes 
32*d2c16535SElliott Hughes 	for (i = 0; i < 256; ++i) {
33*d2c16535SElliott Hughes 		r = i;
34*d2c16535SElliott Hughes 		for (j = 0; j < 8; ++j)
35*d2c16535SElliott Hughes 			r = (r >> 1) ^ (poly & ~((r & 1) - 1));
36*d2c16535SElliott Hughes 
37*d2c16535SElliott Hughes 		xz_crc64_table[i] = r;
38*d2c16535SElliott Hughes 	}
39*d2c16535SElliott Hughes 
40*d2c16535SElliott Hughes 	return;
41*d2c16535SElliott Hughes }
42*d2c16535SElliott Hughes 
xz_crc64(const uint8_t * buf,size_t size,uint64_t crc)43*d2c16535SElliott Hughes XZ_EXTERN uint64_t xz_crc64(const uint8_t *buf, size_t size, uint64_t crc)
44*d2c16535SElliott Hughes {
45*d2c16535SElliott Hughes 	crc = ~crc;
46*d2c16535SElliott Hughes 
47*d2c16535SElliott Hughes 	while (size != 0) {
48*d2c16535SElliott Hughes 		crc = xz_crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
49*d2c16535SElliott Hughes 		--size;
50*d2c16535SElliott Hughes 	}
51*d2c16535SElliott Hughes 
52*d2c16535SElliott Hughes 	return ~crc;
53*d2c16535SElliott Hughes }
54