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