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