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