1be9ac0eaSchristos /* crc32.c
2*cb63e24eSchristos Copyright (C) 2009-2024 Free Software Foundation, Inc.
3be9ac0eaSchristos
4be9ac0eaSchristos This file is part of the libiberty library.
5be9ac0eaSchristos
6be9ac0eaSchristos This file is free software; you can redistribute it and/or modify
7be9ac0eaSchristos it under the terms of the GNU General Public License as published by
8be9ac0eaSchristos the Free Software Foundation; either version 2 of the License, or
9be9ac0eaSchristos (at your option) any later version.
10be9ac0eaSchristos
11be9ac0eaSchristos In addition to the permissions in the GNU General Public License, the
12be9ac0eaSchristos Free Software Foundation gives you unlimited permission to link the
13be9ac0eaSchristos compiled version of this file into combinations with other programs,
14be9ac0eaSchristos and to distribute those combinations without any restriction coming
15be9ac0eaSchristos from the use of this file. (The General Public License restrictions
16be9ac0eaSchristos do apply in other respects; for example, they cover modification of
17be9ac0eaSchristos the file, and distribution when not linked into a combined
18be9ac0eaSchristos executable.)
19be9ac0eaSchristos
20be9ac0eaSchristos This program is distributed in the hope that it will be useful,
21be9ac0eaSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of
22be9ac0eaSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23be9ac0eaSchristos GNU General Public License for more details.
24be9ac0eaSchristos
25be9ac0eaSchristos You should have received a copy of the GNU General Public License
26be9ac0eaSchristos along with this program; if not, write to the Free Software
27be9ac0eaSchristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
28be9ac0eaSchristos */
29be9ac0eaSchristos
30be9ac0eaSchristos #ifdef HAVE_CONFIG_H
31be9ac0eaSchristos #include "config.h"
32be9ac0eaSchristos #endif
33be9ac0eaSchristos
34be9ac0eaSchristos #include "libiberty.h"
35be9ac0eaSchristos
368cbf5cb7Schristos /* This table was generated by the following program.
37be9ac0eaSchristos
38be9ac0eaSchristos #include <stdio.h>
39be9ac0eaSchristos
40be9ac0eaSchristos int
41be9ac0eaSchristos main ()
42be9ac0eaSchristos {
438cbf5cb7Schristos unsigned int i, j;
44be9ac0eaSchristos unsigned int c;
45be9ac0eaSchristos int table[256];
46be9ac0eaSchristos
47be9ac0eaSchristos for (i = 0; i < 256; i++)
48be9ac0eaSchristos {
49be9ac0eaSchristos for (c = i << 24, j = 8; j > 0; --j)
50be9ac0eaSchristos c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
51be9ac0eaSchristos table[i] = c;
52be9ac0eaSchristos }
53be9ac0eaSchristos
54be9ac0eaSchristos printf ("static const unsigned int crc32_table[] =\n{\n");
55be9ac0eaSchristos for (i = 0; i < 256; i += 4)
56be9ac0eaSchristos {
57be9ac0eaSchristos printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
58be9ac0eaSchristos table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
59be9ac0eaSchristos if (i + 4 < 256)
60be9ac0eaSchristos putchar (',');
61be9ac0eaSchristos putchar ('\n');
62be9ac0eaSchristos }
63be9ac0eaSchristos printf ("};\n");
64be9ac0eaSchristos return 0;
65be9ac0eaSchristos }
66be9ac0eaSchristos
67be9ac0eaSchristos For more information on CRC, see, e.g.,
68be9ac0eaSchristos http://www.ross.net/crc/download/crc_v3.txt. */
69be9ac0eaSchristos
70be9ac0eaSchristos static const unsigned int crc32_table[] =
71be9ac0eaSchristos {
72be9ac0eaSchristos 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
73be9ac0eaSchristos 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
74be9ac0eaSchristos 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
75be9ac0eaSchristos 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
76be9ac0eaSchristos 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
77be9ac0eaSchristos 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
78be9ac0eaSchristos 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
79be9ac0eaSchristos 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
80be9ac0eaSchristos 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
81be9ac0eaSchristos 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
82be9ac0eaSchristos 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
83be9ac0eaSchristos 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
84be9ac0eaSchristos 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
85be9ac0eaSchristos 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
86be9ac0eaSchristos 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
87be9ac0eaSchristos 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
88be9ac0eaSchristos 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
89be9ac0eaSchristos 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
90be9ac0eaSchristos 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
91be9ac0eaSchristos 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
92be9ac0eaSchristos 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
93be9ac0eaSchristos 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
94be9ac0eaSchristos 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
95be9ac0eaSchristos 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
96be9ac0eaSchristos 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
97be9ac0eaSchristos 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
98be9ac0eaSchristos 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
99be9ac0eaSchristos 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
100be9ac0eaSchristos 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
101be9ac0eaSchristos 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
102be9ac0eaSchristos 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
103be9ac0eaSchristos 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
104be9ac0eaSchristos 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
105be9ac0eaSchristos 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
106be9ac0eaSchristos 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
107be9ac0eaSchristos 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
108be9ac0eaSchristos 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
109be9ac0eaSchristos 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
110be9ac0eaSchristos 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
111be9ac0eaSchristos 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
112be9ac0eaSchristos 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
113be9ac0eaSchristos 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
114be9ac0eaSchristos 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
115be9ac0eaSchristos 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
116be9ac0eaSchristos 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
117be9ac0eaSchristos 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
118be9ac0eaSchristos 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
119be9ac0eaSchristos 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
120be9ac0eaSchristos 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
121be9ac0eaSchristos 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
122be9ac0eaSchristos 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
123be9ac0eaSchristos 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
124be9ac0eaSchristos 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
125be9ac0eaSchristos 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
126be9ac0eaSchristos 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
127be9ac0eaSchristos 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
128be9ac0eaSchristos 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
129be9ac0eaSchristos 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
130be9ac0eaSchristos 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
131be9ac0eaSchristos 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
132be9ac0eaSchristos 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
133be9ac0eaSchristos 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
134be9ac0eaSchristos 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
135be9ac0eaSchristos 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
136be9ac0eaSchristos };
137be9ac0eaSchristos
138be9ac0eaSchristos /*
139be9ac0eaSchristos
140883529b6Schristos @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
141883529b6Schristos int @var{len}, unsigned int @var{init})
142be9ac0eaSchristos
143be9ac0eaSchristos Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
144be9ac0eaSchristos starting value is @var{init}; this may be used to compute the CRC of
145be9ac0eaSchristos data split across multiple buffers by passing the return value of each
146be9ac0eaSchristos call as the @var{init} parameter of the next.
147be9ac0eaSchristos
1488cbf5cb7Schristos This is used by the @command{gdb} remote protocol for the @samp{qCRC}
1498cbf5cb7Schristos command. In order to get the same results as gdb for a block of data,
1508cbf5cb7Schristos you must pass the first CRC parameter as @code{0xffffffff}.
151be9ac0eaSchristos
152be9ac0eaSchristos This CRC can be specified as:
153be9ac0eaSchristos
154be9ac0eaSchristos Width : 32
155be9ac0eaSchristos Poly : 0x04c11db7
156be9ac0eaSchristos Init : parameter, typically 0xffffffff
157be9ac0eaSchristos RefIn : false
158be9ac0eaSchristos RefOut : false
159be9ac0eaSchristos XorOut : 0
160be9ac0eaSchristos
161be9ac0eaSchristos This differs from the "standard" CRC-32 algorithm in that the values
162be9ac0eaSchristos are not reflected, and there is no final XOR value. These differences
163be9ac0eaSchristos make it easy to compose the values of multiple blocks.
164be9ac0eaSchristos
165be9ac0eaSchristos @end deftypefn
166be9ac0eaSchristos
167be9ac0eaSchristos */
168be9ac0eaSchristos
169be9ac0eaSchristos unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)170be9ac0eaSchristos xcrc32 (const unsigned char *buf, int len, unsigned int init)
171be9ac0eaSchristos {
172be9ac0eaSchristos unsigned int crc = init;
173be9ac0eaSchristos while (len--)
174be9ac0eaSchristos {
175be9ac0eaSchristos crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
176be9ac0eaSchristos buf++;
177be9ac0eaSchristos }
178be9ac0eaSchristos return crc;
179be9ac0eaSchristos }
180