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