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 HughesXZ_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 HughesXZ_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