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