1 /* 2 * CRC32 using the polynomial from IEEE-802.3 3 * 4 * Authors: Lasse Collin <lasse.collin@tukaani.org> 5 * Igor Pavlov <http://7-zip.org/> 6 * 7 * This file has been put into the public domain. 8 * You can do whatever you want with this file. 9 */ 10 11 /* 12 * This is not the fastest implementation, but it is pretty compact. 13 * The fastest versions of xz_crc32() on modern CPUs without hardware 14 * accelerated CRC instruction are 3-5 times as fast as this version, 15 * but they are bigger and use more memory for the lookup table. 16 */ 17 18 #include <linux/crc32poly.h> 19 #include "xz_private.h" 20 21 /* 22 * STATIC_RW_DATA is used in the pre-boot environment on some architectures. 23 * See <linux/decompress/mm.h> for details. 24 */ 25 #ifndef STATIC_RW_DATA 26 # define STATIC_RW_DATA static 27 #endif 28 29 STATIC_RW_DATA uint32_t xz_crc32_table[256]; 30 31 XZ_EXTERN void xz_crc32_init(void) 32 { 33 const uint32_t poly = CRC32_POLY_LE; 34 35 uint32_t i; 36 uint32_t j; 37 uint32_t r; 38 39 for (i = 0; i < 256; ++i) { 40 r = i; 41 for (j = 0; j < 8; ++j) 42 r = (r >> 1) ^ (poly & ~((r & 1) - 1)); 43 44 xz_crc32_table[i] = r; 45 } 46 47 return; 48 } 49 50 XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc) 51 { 52 crc = ~crc; 53 54 while (size != 0) { 55 crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); 56 --size; 57 } 58 59 return ~crc; 60 } 61