xref: /netbsd-src/external/gpl3/binutils/dist/libiberty/crc32.c (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
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