grpc
third_party
bloaty
third_party
zlib
bloaty/third_party/zlib/crc32.c
Go to the documentation of this file.
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
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
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
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
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
endian = 1;
219
if
(*((
unsigned
char
*)(&endian)))
220
return
crc32_little(crc,
buf
,
len
);
221
else
222
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
unsigned
long
ZEXPORT
crc32
(crc,
buf
,
len
)
238
unsigned
long
crc;
239
const
unsigned
char
FAR
*
buf
;
240
uInt
len
;
241
{
242
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
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
c
= (
z_crc_t
)crc;
275
c
= ~
c
;
276
while
(
len
&& ((ptrdiff_t)
buf
& 3)) {
277
c
=
crc_table
[0][(
c
^ *
buf
++) & 0xff] ^ (
c
>> 8);
278
len
--;
279
}
280
281
buf4 = (
const
z_crc_t
FAR
*)(
const
void
FAR
*)
buf
;
282
while
(
len
>= 32) {
283
DOLIT32;
284
len
-= 32;
285
}
286
while
(
len
>= 4) {
287
DOLIT4;
288
len
-= 4;
289
}
290
buf
= (
const
unsigned
char
FAR
*)buf4;
291
292
if
(
len
)
do
{
293
c
=
crc_table
[0][(
c
^ *
buf
++) & 0xff] ^ (
c
>> 8);
294
}
while
(--
len
);
295
c
= ~
c
;
296
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
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
c
=
ZSWAP32
((
z_crc_t
)crc);
315
c
= ~
c
;
316
while
(
len
&& ((ptrdiff_t)
buf
& 3)) {
317
c
=
crc_table
[4][(
c
>> 24) ^ *
buf
++] ^ (
c
<< 8);
318
len
--;
319
}
320
321
buf4 = (
const
z_crc_t
FAR
*)(
const
void
FAR
*)
buf
;
322
while
(
len
>= 32) {
323
DOBIG32;
324
len
-= 32;
325
}
326
while
(
len
>= 4) {
327
DOBIG4;
328
len
-= 4;
329
}
330
buf
= (
const
unsigned
char
FAR
*)buf4;
331
332
if
(
len
)
do
{
333
c
=
crc_table
[4][(
c
>> 24) ^ *
buf
++] ^ (
c
<< 8);
334
}
while
(--
len
);
335
c
= ~
c
;
336
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
local
unsigned
long
gf2_matrix_times
(mat, vec)
345
unsigned
long
*mat;
346
unsigned
long
vec;
347
{
348
unsigned
long
sum
;
349
350
sum
= 0;
351
while
(vec) {
352
if
(vec & 1)
353
sum
^= *mat;
354
vec >>= 1;
355
mat++;
356
}
357
return
sum
;
358
}
359
360
/* ========================================================================= */
361
local
void
gf2_matrix_square
(square, mat)
362
unsigned
long
*square;
363
unsigned
long
*mat;
364
{
365
int
n
;
366
367
for
(
n
= 0;
n
<
GF2_DIM
;
n
++)
368
square[
n
] =
gf2_matrix_times
(mat, mat[
n
]);
369
}
370
371
/* ========================================================================= */
372
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
if
(len2 <= 0)
384
return
crc1;
385
386
/* put operator for one zero bit in odd */
387
odd[0] = 0xedb88320UL;
/* CRC-32 polynomial */
388
row = 1;
389
for
(
n
= 1;
n
<
GF2_DIM
;
n
++) {
390
odd[
n
] = row;
391
row <<= 1;
392
}
393
394
/* put operator for two zero bits in even */
395
gf2_matrix_square
(even, odd);
396
397
/* put operator for four zero bits in odd */
398
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
gf2_matrix_square
(even, odd);
405
if
(len2 & 1)
406
crc1 =
gf2_matrix_times
(even, crc1);
407
len2 >>= 1;
408
409
/* if no more bits set, then done */
410
if
(len2 == 0)
411
break
;
412
413
/* another iteration of the loop with odd and even swapped */
414
gf2_matrix_square
(odd, even);
415
if
(len2 & 1)
416
crc1 =
gf2_matrix_times
(odd, crc1);
417
len2 >>= 1;
418
419
/* if no more bits set, then done */
420
}
while
(len2 != 0);
421
422
/* return combined crc */
423
crc1 ^= crc2;
424
return
crc1;
425
}
426
427
/* ========================================================================= */
428
uLong
ZEXPORT
crc32_combine
(crc1, crc2, len2)
429
uLong
crc1;
430
uLong
crc2;
431
z_off_t
len2;
432
{
433
return
crc32_combine_
(crc1, crc2, len2);
434
}
435
436
uLong
ZEXPORT
crc32_combine64
(crc1, crc2, len2)
437
uLong
crc1;
438
uLong
crc2;
439
z_off64_t
len2;
440
{
441
return
crc32_combine_
(crc1, crc2, len2);
442
}
DO1
#define DO1
Definition:
bloaty/third_party/zlib/crc32.c:198
get_crc_table
const z_crc_t FAR *ZEXPORT get_crc_table()
Definition:
bloaty/third_party/zlib/crc32.c:188
gen_build_yaml.out
dictionary out
Definition:
src/benchmark/gen_build_yaml.py:24
ZEXPORT
#define ZEXPORT
Definition:
bloaty/third_party/zlib/zconf.h:380
gf2_matrix_times
unsigned long gf2_matrix_times(unsigned long *mat, unsigned long vec)
Definition:
bloaty/third_party/zlib/crc32.c:344
grpc::testing::sum
double sum(const T &container, F functor)
Definition:
test/cpp/qps/stats.h:30
crc32_combine_
uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2)
Definition:
bloaty/third_party/zlib/crc32.c:372
buf
voidpf void * buf
Definition:
bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
z_size_t
size_t z_size_t
Definition:
bloaty.cc:20
crc_table
const z_crc_t FAR crc_table[TBLS][256]
Definition:
bloaty/third_party/zlib/crc32.h:5
xds_manager.p
p
Definition:
xds_manager.py:60
poly
Definition:
hrss.c:917
setup.k
k
Definition:
third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
crc32_combine64
uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2)
Definition:
bloaty/third_party/zlib/crc32.c:436
c
void c(T a)
Definition:
miscompile_with_no_unique_address_test.cc:40
xds_interop_client.int
int
Definition:
xds_interop_client.py:113
GF2_DIM
#define GF2_DIM
Definition:
bloaty/third_party/zlib/crc32.c:341
FAR
#define FAR
Definition:
bloaty/third_party/zlib/zconf.h:387
crc32_combine
uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2)
Definition:
bloaty/third_party/zlib/crc32.c:428
gf2_matrix_square
void gf2_matrix_square(unsigned long *square, unsigned long *mat)
Definition:
bloaty/third_party/zlib/crc32.c:361
uLong
unsigned long uLong
Definition:
bloaty/third_party/zlib/zconf.h:394
crc32_z
unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, z_size_t len)
Definition:
bloaty/third_party/zlib/crc32.c:202
TBLS
#define TBLS
Definition:
bloaty/third_party/zlib/crc32.c:44
zutil.h
n
int n
Definition:
abseil-cpp/absl/container/btree_test.cc:1080
z_crc_t
unsigned long z_crc_t
Definition:
bloaty/third_party/zlib/zconf.h:431
Z_NULL
#define Z_NULL
Definition:
bloaty/third_party/zlib/zlib.h:212
benchmark.FILE
FILE
Definition:
benchmark.py:21
uInt
unsigned int uInt
Definition:
bloaty/third_party/zlib/zconf.h:393
OF
unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec))
grpc::fclose
fclose(creds_file)
first
StrT first
Definition:
cxa_demangle.cpp:4884
ZSWAP32
#define ZSWAP32(q)
Definition:
bloaty/third_party/zlib/zutil.h:268
crc32.h
z_off64_t
#define z_off64_t
Definition:
bloaty/third_party/zlib/zconf.h:513
local
#define local
Definition:
bloaty/third_party/zlib/contrib/blast/blast.c:36
table
uint8_t table[256]
Definition:
hpack_parser.cc:456
len
int len
Definition:
abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
DO8
#define DO8
Definition:
bloaty/third_party/zlib/crc32.c:199
z_off_t
#define z_off_t
Definition:
bloaty/third_party/zlib/zconf.h:504
crc32
unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, uInt len)
Definition:
bloaty/third_party/zlib/crc32.c:237
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:06