Home | History | Annotate | Download | only in xz
      1 /*
      2  * CRC64 using the polynomial from ECMA-182
      3  *
      4  * This file is similar to xz_crc32.c. See the comments there.
      5  *
      6  * Authors: Lasse Collin <lasse.collin (at) tukaani.org>
      7  *          Igor Pavlov <http://7-zip.org/>
      8  *
      9  * This file has been put into the public domain.
     10  * You can do whatever you want with this file.
     11  */
     12 
     13 #include "xz_private.h"
     14 
     15 #ifndef STATIC_RW_DATA
     16 #	define STATIC_RW_DATA static
     17 #endif
     18 
     19 STATIC_RW_DATA uint64_t xz_crc64_table[256];
     20 
     21 XZ_EXTERN void xz_crc64_init(void)
     22 {
     23 	const uint64_t poly = 0xC96C5795D7870F42;
     24 
     25 	uint32_t i;
     26 	uint32_t j;
     27 	uint64_t r;
     28 
     29 	for (i = 0; i < 256; ++i) {
     30 		r = i;
     31 		for (j = 0; j < 8; ++j)
     32 			r = (r >> 1) ^ (poly & ~((r & 1) - 1));
     33 
     34 		xz_crc64_table[i] = r;
     35 	}
     36 
     37 	return;
     38 }
     39 
     40 XZ_EXTERN uint64_t xz_crc64(const uint8_t *buf, size_t size, uint64_t crc)
     41 {
     42 	crc = ~crc;
     43 
     44 	while (size != 0) {
     45 		crc = xz_crc64_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
     46 		--size;
     47 	}
     48 
     49 	return ~crc;
     50 }
     51