]>
git.saurik.com Git - apple/xnu.git/blob - libkern/zlib/crc32.c
d707bdc5a87ded5a2bd72ea44424cbb0e53224d4
2 * Copyright (c) 2008 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
28 /* crc32.c -- compute the CRC-32 of a data stream
29 * Copyright (C) 1995-2005 Mark Adler
30 * For conditions of distribution and use, see copyright notice in zlib.h
32 * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
33 * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
34 * tables for updating the shift register in one step with three exclusive-ors
35 * instead of four steps with four exclusive-ors. This results in about a
36 * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
42 Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
43 protection on the static variables used to control the first-use generation
44 of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
45 first call get_crc_table() to initialize the tables before allowing more than
46 one thread to use crc32().
51 # ifndef DYNAMIC_CRC_TABLE
52 # define DYNAMIC_CRC_TABLE
53 # endif /* !DYNAMIC_CRC_TABLE */
56 #include "zutil.h" /* for STDC and FAR definitions */
60 /* Find a four-byte integer type for crc32_little() and crc32_big(). */
62 # ifdef STDC /* need ANSI C limits.h to determine sizes */
63 # include <machine/limits.h>
65 # if (UINT_MAX == 0xffffffffUL)
66 typedef unsigned int u4
;
68 # if (ULONG_MAX == 0xffffffffUL)
69 typedef unsigned long u4
;
71 # if (USHRT_MAX == 0xffffffffUL)
72 typedef unsigned short u4
;
74 # undef BYFOUR /* can't find a four-byte integer type! */
79 #endif /* !NOBYFOUR */
81 /* Definitions for doing the crc four data bytes at a time. */
83 # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
84 (((w)&0xff00)<<8)+(((w)&0xff)<<24))
85 local
unsigned long crc32_little
OF((unsigned long,
86 const unsigned char FAR
*, unsigned));
87 local
unsigned long crc32_big
OF((unsigned long,
88 const unsigned char FAR
*, unsigned));
94 /* Local functions for crc concatenation */
95 local
unsigned long gf2_matrix_times
OF((unsigned long *mat
,
97 local
void gf2_matrix_square
OF((unsigned long *square
, unsigned long *mat
));
99 #ifdef DYNAMIC_CRC_TABLE
101 local
volatile int crc_table_empty
= 1;
102 local
unsigned long FAR crc_table
[TBLS
][256];
103 local
void make_crc_table
OF((void));
105 local
void write_table
OF((FILE *, const unsigned long FAR
*));
106 #endif /* MAKECRCH */
108 Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
109 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.
111 Polynomials over GF(2) are represented in binary, one bit per coefficient,
112 with the lowest powers in the most significant bit. Then adding polynomials
113 is just exclusive-or, and multiplying a polynomial by x is a right shift by
114 one. If we call the above polynomial p, and represent a byte as the
115 polynomial q, also with the lowest power in the most significant bit (so the
116 byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
117 where a mod b means the remainder after dividing a by b.
119 This calculation is done using the shift-register method of multiplying and
120 taking the remainder. The register is initialized to zero, and for each
121 incoming bit, x^32 is added mod p to the register if the bit is a one (where
122 x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
123 x (which is shifting right by one and adding x^32 mod p if the bit shifted
124 out is a one). We start with the highest power (least significant bit) of
125 q and repeat for all eight bits of q.
127 The first table is simply the CRC of all possible eight bit values. This is
128 all the information needed to generate CRCs on data a byte at a time for all
129 combinations of CRC register values and incoming bytes. The remaining tables
130 allow for word-at-a-time CRC calculation for both big-endian and little-
131 endian machines, where a word is four bytes.
133 local
void make_crc_table()
137 unsigned long poly
; /* polynomial exclusive-or pattern */
138 /* terms of polynomial defining this crc (except x^32): */
139 static volatile int first
= 1; /* flag to limit concurrent making */
140 static const unsigned char p
[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
142 /* See if another task is already doing this (not thread-safe, but better
143 than nothing -- significantly reduces duration of vulnerability in
144 case the advice about DYNAMIC_CRC_TABLE is ignored) */
148 /* make exclusive-or pattern from polynomial (0xedb88320UL) */
150 for (n
= 0; n
< sizeof(p
)/sizeof(unsigned char); n
++)
151 poly
|= 1UL << (31 - p
[n
]);
153 /* generate a crc for every 8-bit value */
154 for (n
= 0; n
< 256; n
++) {
155 c
= (unsigned long)n
;
156 for (k
= 0; k
< 8; k
++)
157 c
= c
& 1 ? poly
^ (c
>> 1) : c
>> 1;
162 /* generate crc for each value followed by one, two, and three zeros,
163 and then the byte reversal of those as well as the first table */
164 for (n
= 0; n
< 256; n
++) {
166 crc_table
[4][n
] = REV(c
);
167 for (k
= 1; k
< 4; k
++) {
168 c
= crc_table
[0][c
& 0xff] ^ (c
>> 8);
170 crc_table
[k
+ 4][n
] = REV(c
);
177 else { /* not first */
178 /* wait for the other guy to finish (not efficient, but rare) */
179 while (crc_table_empty
)
184 /* write out CRC tables to crc32.h */
188 out
= fopen("crc32.h", "w");
189 if (out
== NULL
) return;
190 fprintf(out
, "/* crc32.h -- tables for rapid CRC calculation\n");
191 fprintf(out
, " * Generated automatically by crc32.c\n */\n\n");
192 fprintf(out
, "local const unsigned long FAR ");
193 fprintf(out
, "crc_table[TBLS][256] =\n{\n {\n");
194 write_table(out
, crc_table
[0]);
196 fprintf(out
, "#ifdef BYFOUR\n");
197 for (k
= 1; k
< 8; k
++) {
198 fprintf(out
, " },\n {\n");
199 write_table(out
, crc_table
[k
]);
201 fprintf(out
, "#endif\n");
203 fprintf(out
, " }\n};\n");
206 #endif /* MAKECRCH */
210 local
void write_table(out
, table
)
212 const unsigned long FAR
*table
;
216 for (n
= 0; n
< 256; n
++)
217 fprintf(out
, "%s0x%08lxUL%s", n
% 5 ? "" : " ", table
[n
],
218 n
== 255 ? "\n" : (n
% 5 == 4 ? ",\n" : ", "));
220 #endif /* MAKECRCH */
222 #else /* !DYNAMIC_CRC_TABLE */
223 /* ========================================================================
224 * Tables of CRC-32s of all single-byte values, made by make_crc_table().
227 #endif /* DYNAMIC_CRC_TABLE */
229 /* =========================================================================
230 * This function can be used by asm versions of crc32()
232 const unsigned long FAR
* ZEXPORT
get_crc_table()
234 #ifdef DYNAMIC_CRC_TABLE
237 #endif /* DYNAMIC_CRC_TABLE */
238 return (const unsigned long FAR
*)crc_table
;
241 /* ========================================================================= */
242 #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
243 #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
245 /* ========================================================================= */
246 unsigned long ZEXPORT
z_crc32(crc
, buf
, len
)
248 const unsigned char FAR
*buf
;
251 if (buf
== Z_NULL
) return 0UL;
253 #ifdef DYNAMIC_CRC_TABLE
256 #endif /* DYNAMIC_CRC_TABLE */
259 if (sizeof(void *) == sizeof(ptrdiff_t)) {
263 if (*((unsigned char *)(&endian
)))
264 return crc32_little(crc
, buf
, len
);
266 return crc32_big(crc
, buf
, len
);
269 crc
= crc
^ 0xffffffffUL
;
277 return crc
^ 0xffffffffUL
;
282 /* ========================================================================= */
283 #define DOLIT4 c ^= *buf4++; \
284 c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
285 crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
286 #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
288 /* ========================================================================= */
289 local
unsigned long crc32_little(crc
, buf
, len
)
291 const unsigned char FAR
*buf
;
295 register const u4 FAR
*buf4
;
299 while (len
&& ((ptrdiff_t)buf
& 3)) {
300 c
= crc_table
[0][(c
^ *buf
++) & 0xff] ^ (c
>> 8);
304 buf4
= (const u4 FAR
*)(const void FAR
*)buf
;
313 buf
= (const unsigned char FAR
*)buf4
;
316 c
= crc_table
[0][(c
^ *buf
++) & 0xff] ^ (c
>> 8);
319 return (unsigned long)c
;
322 /* ========================================================================= */
323 #define DOBIG4 c ^= *++buf4; \
324 c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
325 crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
326 #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
328 /* ========================================================================= */
329 local
unsigned long crc32_big(crc
, buf
, len
)
331 const unsigned char FAR
*buf
;
335 register const u4 FAR
*buf4
;
339 while (len
&& ((ptrdiff_t)buf
& 3)) {
340 c
= crc_table
[4][(c
>> 24) ^ *buf
++] ^ (c
<< 8);
344 buf4
= (const u4 FAR
*)(const void FAR
*)buf
;
355 buf
= (const unsigned char FAR
*)buf4
;
358 c
= crc_table
[4][(c
>> 24) ^ *buf
++] ^ (c
<< 8);
361 return (unsigned long)(REV(c
));
366 #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
368 /* ========================================================================= */
369 local
unsigned long gf2_matrix_times(mat
, vec
)
385 /* ========================================================================= */
386 local
void gf2_matrix_square(square
, mat
)
387 unsigned long *square
;
392 for (n
= 0; n
< GF2_DIM
; n
++)
393 square
[n
] = gf2_matrix_times(mat
, mat
[n
]);
396 /* ========================================================================= */
397 uLong ZEXPORT
z_crc32_combine(crc1
, crc2
, len2
)
404 unsigned long even
[GF2_DIM
]; /* even-power-of-two zeros operator */
405 unsigned long odd
[GF2_DIM
]; /* odd-power-of-two zeros operator */
407 /* degenerate case */
411 /* put operator for one zero bit in odd */
412 odd
[0] = 0xedb88320L
; /* CRC-32 polynomial */
414 for (n
= 1; n
< GF2_DIM
; n
++) {
419 /* put operator for two zero bits in even */
420 gf2_matrix_square(even
, odd
);
422 /* put operator for four zero bits in odd */
423 gf2_matrix_square(odd
, even
);
425 /* apply len2 zeros to crc1 (first square will put the operator for one
426 zero byte, eight zero bits, in even) */
428 /* apply zeros operator for this bit of len2 */
429 gf2_matrix_square(even
, odd
);
431 crc1
= gf2_matrix_times(even
, crc1
);
434 /* if no more bits set, then done */
438 /* another iteration of the loop with odd and even swapped */
439 gf2_matrix_square(odd
, even
);
441 crc1
= gf2_matrix_times(odd
, crc1
);
444 /* if no more bits set, then done */
447 /* return combined crc */