1 // SPDX-License-Identifier: 0BSD << 2 << 3 /* 1 /* 4 * CRC32 using the polynomial from IEEE-802.3 2 * CRC32 using the polynomial from IEEE-802.3 5 * 3 * 6 * Authors: Lasse Collin <lasse.collin@tukaani 4 * Authors: Lasse Collin <lasse.collin@tukaani.org> 7 * Igor Pavlov <https://7-zip.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. 8 */ 9 */ 9 10 10 /* 11 /* 11 * This is not the fastest implementation, but 12 * This is not the fastest implementation, but it is pretty compact. 12 * The fastest versions of xz_crc32() on moder 13 * The fastest versions of xz_crc32() on modern CPUs without hardware 13 * accelerated CRC instruction are 3-5 times a 14 * accelerated CRC instruction are 3-5 times as fast as this version, 14 * but they are bigger and use more memory for 15 * but they are bigger and use more memory for the lookup table. 15 */ 16 */ 16 17 17 #include "xz_private.h" 18 #include "xz_private.h" 18 19 19 /* 20 /* 20 * STATIC_RW_DATA is used in the pre-boot envi 21 * STATIC_RW_DATA is used in the pre-boot environment on some architectures. 21 * See <linux/decompress/mm.h> for details. 22 * See <linux/decompress/mm.h> for details. 22 */ 23 */ 23 #ifndef STATIC_RW_DATA 24 #ifndef STATIC_RW_DATA 24 # define STATIC_RW_DATA static 25 # define STATIC_RW_DATA static 25 #endif 26 #endif 26 27 27 STATIC_RW_DATA uint32_t xz_crc32_table[256]; 28 STATIC_RW_DATA uint32_t xz_crc32_table[256]; 28 29 29 void xz_crc32_init(void) !! 30 XZ_EXTERN void xz_crc32_init(void) 30 { 31 { 31 const uint32_t poly = 0xEDB88320; !! 32 const uint32_t poly = CRC32_POLY_LE; 32 33 33 uint32_t i; 34 uint32_t i; 34 uint32_t j; 35 uint32_t j; 35 uint32_t r; 36 uint32_t r; 36 37 37 for (i = 0; i < 256; ++i) { 38 for (i = 0; i < 256; ++i) { 38 r = i; 39 r = i; 39 for (j = 0; j < 8; ++j) 40 for (j = 0; j < 8; ++j) 40 r = (r >> 1) ^ (poly & 41 r = (r >> 1) ^ (poly & ~((r & 1) - 1)); 41 42 42 xz_crc32_table[i] = r; 43 xz_crc32_table[i] = r; 43 } 44 } 44 45 45 return; 46 return; 46 } 47 } 47 48 48 uint32_t xz_crc32(const uint8_t *buf, size_t s !! 49 XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc) 49 { 50 { 50 crc = ~crc; 51 crc = ~crc; 51 52 52 while (size != 0) { 53 while (size != 0) { 53 crc = xz_crc32_table[*buf++ ^ 54 crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8); 54 --size; 55 --size; 55 } 56 } 56 57 57 return ~crc; 58 return ~crc; 58 } 59 } 59 60
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.