1*221b1638SMasahiro Yamada /* crc32.c -- compute the CRC-32 of a data stream 2*221b1638SMasahiro Yamada * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler 3*221b1638SMasahiro Yamada * For conditions of distribution and use, see copyright notice in zlib.h 4*221b1638SMasahiro Yamada * 5*221b1638SMasahiro Yamada * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster 6*221b1638SMasahiro Yamada * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing 7*221b1638SMasahiro Yamada * tables for updating the shift register in one step with three exclusive-ors 8*221b1638SMasahiro Yamada * instead of four steps with four exclusive-ors. This results in about a 9*221b1638SMasahiro Yamada * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. 10*221b1638SMasahiro Yamada */ 11*221b1638SMasahiro Yamada 12*221b1638SMasahiro Yamada /* @(#) $Id$ */ 13*221b1638SMasahiro Yamada 14*221b1638SMasahiro Yamada /* 15*221b1638SMasahiro Yamada Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore 16*221b1638SMasahiro Yamada protection on the static variables used to control the first-use generation 17*221b1638SMasahiro Yamada of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should 18*221b1638SMasahiro Yamada first call get_crc_table() to initialize the tables before allowing more than 19*221b1638SMasahiro Yamada one thread to use crc32(). 20*221b1638SMasahiro Yamada 21*221b1638SMasahiro Yamada DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. 22*221b1638SMasahiro Yamada */ 23*221b1638SMasahiro Yamada 24*221b1638SMasahiro Yamada #ifdef MAKECRCH 25*221b1638SMasahiro Yamada # include <stdio.h> 26*221b1638SMasahiro Yamada # ifndef DYNAMIC_CRC_TABLE 27*221b1638SMasahiro Yamada # define DYNAMIC_CRC_TABLE 28*221b1638SMasahiro Yamada # endif /* !DYNAMIC_CRC_TABLE */ 29*221b1638SMasahiro Yamada #endif /* MAKECRCH */ 30*221b1638SMasahiro Yamada 31*221b1638SMasahiro Yamada #include "zutil.h" /* for STDC and FAR definitions */ 32*221b1638SMasahiro Yamada 33*221b1638SMasahiro Yamada /* Definitions for doing the crc four data bytes at a time. */ 34*221b1638SMasahiro Yamada #if !defined(NOBYFOUR) && defined(Z_U4) 35*221b1638SMasahiro Yamada # define BYFOUR 36*221b1638SMasahiro Yamada #endif 37*221b1638SMasahiro Yamada #ifdef BYFOUR 38*221b1638SMasahiro Yamada local unsigned long crc32_little OF((unsigned long, 39*221b1638SMasahiro Yamada const unsigned char FAR *, z_size_t)); 40*221b1638SMasahiro Yamada local unsigned long crc32_big OF((unsigned long, 41*221b1638SMasahiro Yamada const unsigned char FAR *, z_size_t)); 42*221b1638SMasahiro Yamada # define TBLS 8 43*221b1638SMasahiro Yamada #else 44*221b1638SMasahiro Yamada # define TBLS 1 45*221b1638SMasahiro Yamada #endif /* BYFOUR */ 46*221b1638SMasahiro Yamada 47*221b1638SMasahiro Yamada /* Local functions for crc concatenation */ 48*221b1638SMasahiro Yamada local unsigned long gf2_matrix_times OF((unsigned long *mat, 49*221b1638SMasahiro Yamada unsigned long vec)); 50*221b1638SMasahiro Yamada local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); 51*221b1638SMasahiro Yamada local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); 52*221b1638SMasahiro Yamada 53*221b1638SMasahiro Yamada 54*221b1638SMasahiro Yamada #ifdef DYNAMIC_CRC_TABLE 55*221b1638SMasahiro Yamada 56*221b1638SMasahiro Yamada local volatile int crc_table_empty = 1; 57*221b1638SMasahiro Yamada local z_crc_t FAR crc_table[TBLS][256]; 58*221b1638SMasahiro Yamada local void make_crc_table OF((void)); 59*221b1638SMasahiro Yamada #ifdef MAKECRCH 60*221b1638SMasahiro Yamada local void write_table OF((FILE *, const z_crc_t FAR *)); 61*221b1638SMasahiro Yamada #endif /* MAKECRCH */ 62*221b1638SMasahiro Yamada /* 63*221b1638SMasahiro Yamada Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: 64*221b1638SMasahiro Yamada x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. 65*221b1638SMasahiro Yamada 66*221b1638SMasahiro Yamada Polynomials over GF(2) are represented in binary, one bit per coefficient, 67*221b1638SMasahiro Yamada with the lowest powers in the most significant bit. Then adding polynomials 68*221b1638SMasahiro Yamada is just exclusive-or, and multiplying a polynomial by x is a right shift by 69*221b1638SMasahiro Yamada one. If we call the above polynomial p, and represent a byte as the 70*221b1638SMasahiro Yamada polynomial q, also with the lowest power in the most significant bit (so the 71*221b1638SMasahiro Yamada byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, 72*221b1638SMasahiro Yamada where a mod b means the remainder after dividing a by b. 73*221b1638SMasahiro Yamada 74*221b1638SMasahiro Yamada This calculation is done using the shift-register method of multiplying and 75*221b1638SMasahiro Yamada taking the remainder. The register is initialized to zero, and for each 76*221b1638SMasahiro Yamada incoming bit, x^32 is added mod p to the register if the bit is a one (where 77*221b1638SMasahiro Yamada x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by 78*221b1638SMasahiro Yamada x (which is shifting right by one and adding x^32 mod p if the bit shifted 79*221b1638SMasahiro Yamada out is a one). We start with the highest power (least significant bit) of 80*221b1638SMasahiro Yamada q and repeat for all eight bits of q. 81*221b1638SMasahiro Yamada 82*221b1638SMasahiro Yamada The first table is simply the CRC of all possible eight bit values. This is 83*221b1638SMasahiro Yamada all the information needed to generate CRCs on data a byte at a time for all 84*221b1638SMasahiro Yamada combinations of CRC register values and incoming bytes. The remaining tables 85*221b1638SMasahiro Yamada allow for word-at-a-time CRC calculation for both big-endian and little- 86*221b1638SMasahiro Yamada endian machines, where a word is four bytes. 87*221b1638SMasahiro Yamada */ 88*221b1638SMasahiro Yamada local void make_crc_table() 89*221b1638SMasahiro Yamada { 90*221b1638SMasahiro Yamada z_crc_t c; 91*221b1638SMasahiro Yamada int n, k; 92*221b1638SMasahiro Yamada z_crc_t poly; /* polynomial exclusive-or pattern */ 93*221b1638SMasahiro Yamada /* terms of polynomial defining this crc (except x^32): */ 94*221b1638SMasahiro Yamada static volatile int first = 1; /* flag to limit concurrent making */ 95*221b1638SMasahiro Yamada static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; 96*221b1638SMasahiro Yamada 97*221b1638SMasahiro Yamada /* See if another task is already doing this (not thread-safe, but better 98*221b1638SMasahiro Yamada than nothing -- significantly reduces duration of vulnerability in 99*221b1638SMasahiro Yamada case the advice about DYNAMIC_CRC_TABLE is ignored) */ 100*221b1638SMasahiro Yamada if (first) { 101*221b1638SMasahiro Yamada first = 0; 102*221b1638SMasahiro Yamada 103*221b1638SMasahiro Yamada /* make exclusive-or pattern from polynomial (0xedb88320UL) */ 104*221b1638SMasahiro Yamada poly = 0; 105*221b1638SMasahiro Yamada for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) 106*221b1638SMasahiro Yamada poly |= (z_crc_t)1 << (31 - p[n]); 107*221b1638SMasahiro Yamada 108*221b1638SMasahiro Yamada /* generate a crc for every 8-bit value */ 109*221b1638SMasahiro Yamada for (n = 0; n < 256; n++) { 110*221b1638SMasahiro Yamada c = (z_crc_t)n; 111*221b1638SMasahiro Yamada for (k = 0; k < 8; k++) 112*221b1638SMasahiro Yamada c = c & 1 ? poly ^ (c >> 1) : c >> 1; 113*221b1638SMasahiro Yamada crc_table[0][n] = c; 114*221b1638SMasahiro Yamada } 115*221b1638SMasahiro Yamada 116*221b1638SMasahiro Yamada #ifdef BYFOUR 117*221b1638SMasahiro Yamada /* generate crc for each value followed by one, two, and three zeros, 118*221b1638SMasahiro Yamada and then the byte reversal of those as well as the first table */ 119*221b1638SMasahiro Yamada for (n = 0; n < 256; n++) { 120*221b1638SMasahiro Yamada c = crc_table[0][n]; 121*221b1638SMasahiro Yamada crc_table[4][n] = ZSWAP32(c); 122*221b1638SMasahiro Yamada for (k = 1; k < 4; k++) { 123*221b1638SMasahiro Yamada c = crc_table[0][c & 0xff] ^ (c >> 8); 124*221b1638SMasahiro Yamada crc_table[k][n] = c; 125*221b1638SMasahiro Yamada crc_table[k + 4][n] = ZSWAP32(c); 126*221b1638SMasahiro Yamada } 127*221b1638SMasahiro Yamada } 128*221b1638SMasahiro Yamada #endif /* BYFOUR */ 129*221b1638SMasahiro Yamada 130*221b1638SMasahiro Yamada crc_table_empty = 0; 131*221b1638SMasahiro Yamada } 132*221b1638SMasahiro Yamada else { /* not first */ 133*221b1638SMasahiro Yamada /* wait for the other guy to finish (not efficient, but rare) */ 134*221b1638SMasahiro Yamada while (crc_table_empty) 135*221b1638SMasahiro Yamada ; 136*221b1638SMasahiro Yamada } 137*221b1638SMasahiro Yamada 138*221b1638SMasahiro Yamada #ifdef MAKECRCH 139*221b1638SMasahiro Yamada /* write out CRC tables to crc32.h */ 140*221b1638SMasahiro Yamada { 141*221b1638SMasahiro Yamada FILE *out; 142*221b1638SMasahiro Yamada 143*221b1638SMasahiro Yamada out = fopen("crc32.h", "w"); 144*221b1638SMasahiro Yamada if (out == NULL) return; 145*221b1638SMasahiro Yamada fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); 146*221b1638SMasahiro Yamada fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); 147*221b1638SMasahiro Yamada fprintf(out, "local const z_crc_t FAR "); 148*221b1638SMasahiro Yamada fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); 149*221b1638SMasahiro Yamada write_table(out, crc_table[0]); 150*221b1638SMasahiro Yamada # ifdef BYFOUR 151*221b1638SMasahiro Yamada fprintf(out, "#ifdef BYFOUR\n"); 152*221b1638SMasahiro Yamada for (k = 1; k < 8; k++) { 153*221b1638SMasahiro Yamada fprintf(out, " },\n {\n"); 154*221b1638SMasahiro Yamada write_table(out, crc_table[k]); 155*221b1638SMasahiro Yamada } 156*221b1638SMasahiro Yamada fprintf(out, "#endif\n"); 157*221b1638SMasahiro Yamada # endif /* BYFOUR */ 158*221b1638SMasahiro Yamada fprintf(out, " }\n};\n"); 159*221b1638SMasahiro Yamada fclose(out); 160*221b1638SMasahiro Yamada } 161*221b1638SMasahiro Yamada #endif /* MAKECRCH */ 162*221b1638SMasahiro Yamada } 163*221b1638SMasahiro Yamada 164*221b1638SMasahiro Yamada #ifdef MAKECRCH 165*221b1638SMasahiro Yamada local void write_table(out, table) 166*221b1638SMasahiro Yamada FILE *out; 167*221b1638SMasahiro Yamada const z_crc_t FAR *table; 168*221b1638SMasahiro Yamada { 169*221b1638SMasahiro Yamada int n; 170*221b1638SMasahiro Yamada 171*221b1638SMasahiro Yamada for (n = 0; n < 256; n++) 172*221b1638SMasahiro Yamada fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", 173*221b1638SMasahiro Yamada (unsigned long)(table[n]), 174*221b1638SMasahiro Yamada n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); 175*221b1638SMasahiro Yamada } 176*221b1638SMasahiro Yamada #endif /* MAKECRCH */ 177*221b1638SMasahiro Yamada 178*221b1638SMasahiro Yamada #else /* !DYNAMIC_CRC_TABLE */ 179*221b1638SMasahiro Yamada /* ======================================================================== 180*221b1638SMasahiro Yamada * Tables of CRC-32s of all single-byte values, made by make_crc_table(). 181*221b1638SMasahiro Yamada */ 182*221b1638SMasahiro Yamada #include "crc32.h" 183*221b1638SMasahiro Yamada #endif /* DYNAMIC_CRC_TABLE */ 184*221b1638SMasahiro Yamada 185*221b1638SMasahiro Yamada /* ========================================================================= 186*221b1638SMasahiro Yamada * This function can be used by asm versions of crc32() 187*221b1638SMasahiro Yamada */ 188*221b1638SMasahiro Yamada const z_crc_t FAR * ZEXPORT get_crc_table() 189*221b1638SMasahiro Yamada { 190*221b1638SMasahiro Yamada #ifdef DYNAMIC_CRC_TABLE 191*221b1638SMasahiro Yamada if (crc_table_empty) 192*221b1638SMasahiro Yamada make_crc_table(); 193*221b1638SMasahiro Yamada #endif /* DYNAMIC_CRC_TABLE */ 194*221b1638SMasahiro Yamada return (const z_crc_t FAR *)crc_table; 195*221b1638SMasahiro Yamada } 196*221b1638SMasahiro Yamada 197*221b1638SMasahiro Yamada /* ========================================================================= */ 198*221b1638SMasahiro Yamada #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) 199*221b1638SMasahiro Yamada #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 200*221b1638SMasahiro Yamada 201*221b1638SMasahiro Yamada /* ========================================================================= */ 202*221b1638SMasahiro Yamada unsigned long ZEXPORT crc32_z(crc, buf, len) 203*221b1638SMasahiro Yamada unsigned long crc; 204*221b1638SMasahiro Yamada const unsigned char FAR *buf; 205*221b1638SMasahiro Yamada z_size_t len; 206*221b1638SMasahiro Yamada { 207*221b1638SMasahiro Yamada if (buf == Z_NULL) return 0UL; 208*221b1638SMasahiro Yamada 209*221b1638SMasahiro Yamada #ifdef DYNAMIC_CRC_TABLE 210*221b1638SMasahiro Yamada if (crc_table_empty) 211*221b1638SMasahiro Yamada make_crc_table(); 212*221b1638SMasahiro Yamada #endif /* DYNAMIC_CRC_TABLE */ 213*221b1638SMasahiro Yamada 214*221b1638SMasahiro Yamada #ifdef BYFOUR 215*221b1638SMasahiro Yamada if (sizeof(void *) == sizeof(ptrdiff_t)) { 216*221b1638SMasahiro Yamada z_crc_t endian; 217*221b1638SMasahiro Yamada 218*221b1638SMasahiro Yamada endian = 1; 219*221b1638SMasahiro Yamada if (*((unsigned char *)(&endian))) 220*221b1638SMasahiro Yamada return crc32_little(crc, buf, len); 221*221b1638SMasahiro Yamada else 222*221b1638SMasahiro Yamada return crc32_big(crc, buf, len); 223*221b1638SMasahiro Yamada } 224*221b1638SMasahiro Yamada #endif /* BYFOUR */ 225*221b1638SMasahiro Yamada crc = crc ^ 0xffffffffUL; 226*221b1638SMasahiro Yamada while (len >= 8) { 227*221b1638SMasahiro Yamada DO8; 228*221b1638SMasahiro Yamada len -= 8; 229*221b1638SMasahiro Yamada } 230*221b1638SMasahiro Yamada if (len) do { 231*221b1638SMasahiro Yamada DO1; 232*221b1638SMasahiro Yamada } while (--len); 233*221b1638SMasahiro Yamada return crc ^ 0xffffffffUL; 234*221b1638SMasahiro Yamada } 235*221b1638SMasahiro Yamada 236*221b1638SMasahiro Yamada /* ========================================================================= */ 237*221b1638SMasahiro Yamada unsigned long ZEXPORT crc32(crc, buf, len) 238*221b1638SMasahiro Yamada unsigned long crc; 239*221b1638SMasahiro Yamada const unsigned char FAR *buf; 240*221b1638SMasahiro Yamada uInt len; 241*221b1638SMasahiro Yamada { 242*221b1638SMasahiro Yamada return crc32_z(crc, buf, len); 243*221b1638SMasahiro Yamada } 244*221b1638SMasahiro Yamada 245*221b1638SMasahiro Yamada #ifdef BYFOUR 246*221b1638SMasahiro Yamada 247*221b1638SMasahiro Yamada /* 248*221b1638SMasahiro Yamada This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit 249*221b1638SMasahiro Yamada integer pointer type. This violates the strict aliasing rule, where a 250*221b1638SMasahiro Yamada compiler can assume, for optimization purposes, that two pointers to 251*221b1638SMasahiro Yamada fundamentally different types won't ever point to the same memory. This can 252*221b1638SMasahiro Yamada manifest as a problem only if one of the pointers is written to. This code 253*221b1638SMasahiro Yamada only reads from those pointers. So long as this code remains isolated in 254*221b1638SMasahiro Yamada this compilation unit, there won't be a problem. For this reason, this code 255*221b1638SMasahiro Yamada should not be copied and pasted into a compilation unit in which other code 256*221b1638SMasahiro Yamada writes to the buffer that is passed to these routines. 257*221b1638SMasahiro Yamada */ 258*221b1638SMasahiro Yamada 259*221b1638SMasahiro Yamada /* ========================================================================= */ 260*221b1638SMasahiro Yamada #define DOLIT4 c ^= *buf4++; \ 261*221b1638SMasahiro Yamada c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ 262*221b1638SMasahiro Yamada crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] 263*221b1638SMasahiro Yamada #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 264*221b1638SMasahiro Yamada 265*221b1638SMasahiro Yamada /* ========================================================================= */ 266*221b1638SMasahiro Yamada local unsigned long crc32_little(crc, buf, len) 267*221b1638SMasahiro Yamada unsigned long crc; 268*221b1638SMasahiro Yamada const unsigned char FAR *buf; 269*221b1638SMasahiro Yamada z_size_t len; 270*221b1638SMasahiro Yamada { 271*221b1638SMasahiro Yamada register z_crc_t c; 272*221b1638SMasahiro Yamada register const z_crc_t FAR *buf4; 273*221b1638SMasahiro Yamada 274*221b1638SMasahiro Yamada c = (z_crc_t)crc; 275*221b1638SMasahiro Yamada c = ~c; 276*221b1638SMasahiro Yamada while (len && ((ptrdiff_t)buf & 3)) { 277*221b1638SMasahiro Yamada c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); 278*221b1638SMasahiro Yamada len--; 279*221b1638SMasahiro Yamada } 280*221b1638SMasahiro Yamada 281*221b1638SMasahiro Yamada buf4 = (const z_crc_t FAR *)(const void FAR *)buf; 282*221b1638SMasahiro Yamada while (len >= 32) { 283*221b1638SMasahiro Yamada DOLIT32; 284*221b1638SMasahiro Yamada len -= 32; 285*221b1638SMasahiro Yamada } 286*221b1638SMasahiro Yamada while (len >= 4) { 287*221b1638SMasahiro Yamada DOLIT4; 288*221b1638SMasahiro Yamada len -= 4; 289*221b1638SMasahiro Yamada } 290*221b1638SMasahiro Yamada buf = (const unsigned char FAR *)buf4; 291*221b1638SMasahiro Yamada 292*221b1638SMasahiro Yamada if (len) do { 293*221b1638SMasahiro Yamada c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); 294*221b1638SMasahiro Yamada } while (--len); 295*221b1638SMasahiro Yamada c = ~c; 296*221b1638SMasahiro Yamada return (unsigned long)c; 297*221b1638SMasahiro Yamada } 298*221b1638SMasahiro Yamada 299*221b1638SMasahiro Yamada /* ========================================================================= */ 300*221b1638SMasahiro Yamada #define DOBIG4 c ^= *buf4++; \ 301*221b1638SMasahiro Yamada c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ 302*221b1638SMasahiro Yamada crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] 303*221b1638SMasahiro Yamada #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 304*221b1638SMasahiro Yamada 305*221b1638SMasahiro Yamada /* ========================================================================= */ 306*221b1638SMasahiro Yamada local unsigned long crc32_big(crc, buf, len) 307*221b1638SMasahiro Yamada unsigned long crc; 308*221b1638SMasahiro Yamada const unsigned char FAR *buf; 309*221b1638SMasahiro Yamada z_size_t len; 310*221b1638SMasahiro Yamada { 311*221b1638SMasahiro Yamada register z_crc_t c; 312*221b1638SMasahiro Yamada register const z_crc_t FAR *buf4; 313*221b1638SMasahiro Yamada 314*221b1638SMasahiro Yamada c = ZSWAP32((z_crc_t)crc); 315*221b1638SMasahiro Yamada c = ~c; 316*221b1638SMasahiro Yamada while (len && ((ptrdiff_t)buf & 3)) { 317*221b1638SMasahiro Yamada c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); 318*221b1638SMasahiro Yamada len--; 319*221b1638SMasahiro Yamada } 320*221b1638SMasahiro Yamada 321*221b1638SMasahiro Yamada buf4 = (const z_crc_t FAR *)(const void FAR *)buf; 322*221b1638SMasahiro Yamada while (len >= 32) { 323*221b1638SMasahiro Yamada DOBIG32; 324*221b1638SMasahiro Yamada len -= 32; 325*221b1638SMasahiro Yamada } 326*221b1638SMasahiro Yamada while (len >= 4) { 327*221b1638SMasahiro Yamada DOBIG4; 328*221b1638SMasahiro Yamada len -= 4; 329*221b1638SMasahiro Yamada } 330*221b1638SMasahiro Yamada buf = (const unsigned char FAR *)buf4; 331*221b1638SMasahiro Yamada 332*221b1638SMasahiro Yamada if (len) do { 333*221b1638SMasahiro Yamada c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); 334*221b1638SMasahiro Yamada } while (--len); 335*221b1638SMasahiro Yamada c = ~c; 336*221b1638SMasahiro Yamada return (unsigned long)(ZSWAP32(c)); 337*221b1638SMasahiro Yamada } 338*221b1638SMasahiro Yamada 339*221b1638SMasahiro Yamada #endif /* BYFOUR */ 340*221b1638SMasahiro Yamada 341*221b1638SMasahiro Yamada #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ 342*221b1638SMasahiro Yamada 343*221b1638SMasahiro Yamada /* ========================================================================= */ 344*221b1638SMasahiro Yamada local unsigned long gf2_matrix_times(mat, vec) 345*221b1638SMasahiro Yamada unsigned long *mat; 346*221b1638SMasahiro Yamada unsigned long vec; 347*221b1638SMasahiro Yamada { 348*221b1638SMasahiro Yamada unsigned long sum; 349*221b1638SMasahiro Yamada 350*221b1638SMasahiro Yamada sum = 0; 351*221b1638SMasahiro Yamada while (vec) { 352*221b1638SMasahiro Yamada if (vec & 1) 353*221b1638SMasahiro Yamada sum ^= *mat; 354*221b1638SMasahiro Yamada vec >>= 1; 355*221b1638SMasahiro Yamada mat++; 356*221b1638SMasahiro Yamada } 357*221b1638SMasahiro Yamada return sum; 358*221b1638SMasahiro Yamada } 359*221b1638SMasahiro Yamada 360*221b1638SMasahiro Yamada /* ========================================================================= */ 361*221b1638SMasahiro Yamada local void gf2_matrix_square(square, mat) 362*221b1638SMasahiro Yamada unsigned long *square; 363*221b1638SMasahiro Yamada unsigned long *mat; 364*221b1638SMasahiro Yamada { 365*221b1638SMasahiro Yamada int n; 366*221b1638SMasahiro Yamada 367*221b1638SMasahiro Yamada for (n = 0; n < GF2_DIM; n++) 368*221b1638SMasahiro Yamada square[n] = gf2_matrix_times(mat, mat[n]); 369*221b1638SMasahiro Yamada } 370*221b1638SMasahiro Yamada 371*221b1638SMasahiro Yamada /* ========================================================================= */ 372*221b1638SMasahiro Yamada local uLong crc32_combine_(crc1, crc2, len2) 373*221b1638SMasahiro Yamada uLong crc1; 374*221b1638SMasahiro Yamada uLong crc2; 375*221b1638SMasahiro Yamada z_off64_t len2; 376*221b1638SMasahiro Yamada { 377*221b1638SMasahiro Yamada int n; 378*221b1638SMasahiro Yamada unsigned long row; 379*221b1638SMasahiro Yamada unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ 380*221b1638SMasahiro Yamada unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ 381*221b1638SMasahiro Yamada 382*221b1638SMasahiro Yamada /* degenerate case (also disallow negative lengths) */ 383*221b1638SMasahiro Yamada if (len2 <= 0) 384*221b1638SMasahiro Yamada return crc1; 385*221b1638SMasahiro Yamada 386*221b1638SMasahiro Yamada /* put operator for one zero bit in odd */ 387*221b1638SMasahiro Yamada odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ 388*221b1638SMasahiro Yamada row = 1; 389*221b1638SMasahiro Yamada for (n = 1; n < GF2_DIM; n++) { 390*221b1638SMasahiro Yamada odd[n] = row; 391*221b1638SMasahiro Yamada row <<= 1; 392*221b1638SMasahiro Yamada } 393*221b1638SMasahiro Yamada 394*221b1638SMasahiro Yamada /* put operator for two zero bits in even */ 395*221b1638SMasahiro Yamada gf2_matrix_square(even, odd); 396*221b1638SMasahiro Yamada 397*221b1638SMasahiro Yamada /* put operator for four zero bits in odd */ 398*221b1638SMasahiro Yamada gf2_matrix_square(odd, even); 399*221b1638SMasahiro Yamada 400*221b1638SMasahiro Yamada /* apply len2 zeros to crc1 (first square will put the operator for one 401*221b1638SMasahiro Yamada zero byte, eight zero bits, in even) */ 402*221b1638SMasahiro Yamada do { 403*221b1638SMasahiro Yamada /* apply zeros operator for this bit of len2 */ 404*221b1638SMasahiro Yamada gf2_matrix_square(even, odd); 405*221b1638SMasahiro Yamada if (len2 & 1) 406*221b1638SMasahiro Yamada crc1 = gf2_matrix_times(even, crc1); 407*221b1638SMasahiro Yamada len2 >>= 1; 408*221b1638SMasahiro Yamada 409*221b1638SMasahiro Yamada /* if no more bits set, then done */ 410*221b1638SMasahiro Yamada if (len2 == 0) 411*221b1638SMasahiro Yamada break; 412*221b1638SMasahiro Yamada 413*221b1638SMasahiro Yamada /* another iteration of the loop with odd and even swapped */ 414*221b1638SMasahiro Yamada gf2_matrix_square(odd, even); 415*221b1638SMasahiro Yamada if (len2 & 1) 416*221b1638SMasahiro Yamada crc1 = gf2_matrix_times(odd, crc1); 417*221b1638SMasahiro Yamada len2 >>= 1; 418*221b1638SMasahiro Yamada 419*221b1638SMasahiro Yamada /* if no more bits set, then done */ 420*221b1638SMasahiro Yamada } while (len2 != 0); 421*221b1638SMasahiro Yamada 422*221b1638SMasahiro Yamada /* return combined crc */ 423*221b1638SMasahiro Yamada crc1 ^= crc2; 424*221b1638SMasahiro Yamada return crc1; 425*221b1638SMasahiro Yamada } 426*221b1638SMasahiro Yamada 427*221b1638SMasahiro Yamada /* ========================================================================= */ 428*221b1638SMasahiro Yamada uLong ZEXPORT crc32_combine(crc1, crc2, len2) 429*221b1638SMasahiro Yamada uLong crc1; 430*221b1638SMasahiro Yamada uLong crc2; 431*221b1638SMasahiro Yamada z_off_t len2; 432*221b1638SMasahiro Yamada { 433*221b1638SMasahiro Yamada return crc32_combine_(crc1, crc2, len2); 434*221b1638SMasahiro Yamada } 435*221b1638SMasahiro Yamada 436*221b1638SMasahiro Yamada uLong ZEXPORT crc32_combine64(crc1, crc2, len2) 437*221b1638SMasahiro Yamada uLong crc1; 438*221b1638SMasahiro Yamada uLong crc2; 439*221b1638SMasahiro Yamada z_off64_t len2; 440*221b1638SMasahiro Yamada { 441*221b1638SMasahiro Yamada return crc32_combine_(crc1, crc2, len2); 442*221b1638SMasahiro Yamada } 443