LCOV - code coverage report
Current view: top level - modules/zlib/src - crc32.c (source / functions) Hit Total Coverage
Test: output.info Lines: 26 87 29.9 %
Date: 2017-07-14 16:53:18 Functions: 3 10 30.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13