1229159Sadrian/* 2229159Sadrian * CRC32 using the polynomial from IEEE-802.3 3229159Sadrian * 4229159Sadrian * Authors: Lasse Collin <lasse.collin@tukaani.org> 5229159Sadrian * Igor Pavlov <http://7-zip.org/> 6229159Sadrian * 7229159Sadrian * This file has been put into the public domain. 8229159Sadrian * You can do whatever you want with this file. 9229159Sadrian */ 10229159Sadrian 11229159Sadrian/* 12229159Sadrian * This is not the fastest implementation, but it is pretty compact. 13229159Sadrian * The fastest versions of xz_crc32() on modern CPUs without hardware 14229159Sadrian * accelerated CRC instruction are 3-5 times as fast as this version, 15229159Sadrian * but they are bigger and use more memory for the lookup table. 16229159Sadrian */ 17229159Sadrian 18229159Sadrian#include "xz_private.h" 19229159Sadrian 20229159Sadrian/* 21229159Sadrian * STATIC_RW_DATA is used in the pre-boot environment on some architectures. 22229159Sadrian * See <linux/decompress/mm.h> for details. 23229159Sadrian */ 24229159Sadrian#ifndef STATIC_RW_DATA 25229159Sadrian# define STATIC_RW_DATA static 26229159Sadrian#endif 27229159Sadrian 28229159SadrianSTATIC_RW_DATA uint32_t xz_crc32_table[256]; 29229159Sadrian 30229159SadrianXZ_EXTERN void xz_crc32_init(void) 31229159Sadrian{ 32229159Sadrian const uint32_t poly = 0xEDB88320; 33229159Sadrian 34229159Sadrian uint32_t i; 35229159Sadrian uint32_t j; 36229159Sadrian uint32_t r; 37229159Sadrian 38229159Sadrian for (i = 0; i < 256; ++i) { 39229159Sadrian r = i; 40229159Sadrian for (j = 0; j < 8; ++j) 41229159Sadrian r = (r >> 1) ^ (poly & ~((r & 1) - 1)); 42229159Sadrian 43229159Sadrian xz_crc32_table[i] = r; 44229159Sadrian } 45229159Sadrian 46229159Sadrian return; 47229159Sadrian} 48229159Sadrian 49229159SadrianXZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc) 50229159Sadrian{ 51229159Sadrian crc = ~crc; 52229159Sadrian 53229159Sadrian while (size != 0) { 54229159Sadrian crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); 55229159Sadrian --size; 56229159Sadrian } 57229159Sadrian 58229159Sadrian return ~crc; 59229159Sadrian} 60