116dce513Schristos /* crc32.c
2*e992f068Schristos Copyright (C) 2009-2022 Free Software Foundation, Inc.
316dce513Schristos
416dce513Schristos This file is part of the libiberty library.
516dce513Schristos
616dce513Schristos This file is free software; you can redistribute it and/or modify
716dce513Schristos it under the terms of the GNU General Public License as published by
816dce513Schristos the Free Software Foundation; either version 2 of the License, or
916dce513Schristos (at your option) any later version.
1016dce513Schristos
1116dce513Schristos In addition to the permissions in the GNU General Public License, the
1216dce513Schristos Free Software Foundation gives you unlimited permission to link the
1316dce513Schristos compiled version of this file into combinations with other programs,
1416dce513Schristos and to distribute those combinations without any restriction coming
1516dce513Schristos from the use of this file. (The General Public License restrictions
1616dce513Schristos do apply in other respects; for example, they cover modification of
1716dce513Schristos the file, and distribution when not linked into a combined
1816dce513Schristos executable.)
1916dce513Schristos
2016dce513Schristos This program is distributed in the hope that it will be useful,
2116dce513Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of
2216dce513Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2316dce513Schristos GNU General Public License for more details.
2416dce513Schristos
2516dce513Schristos You should have received a copy of the GNU General Public License
2616dce513Schristos along with this program; if not, write to the Free Software
2716dce513Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
2816dce513Schristos */
2916dce513Schristos
3016dce513Schristos #ifdef HAVE_CONFIG_H
3116dce513Schristos #include "config.h"
3216dce513Schristos #endif
3316dce513Schristos
3416dce513Schristos #include "libiberty.h"
3516dce513Schristos
3616dce513Schristos /* This table was generated by the following program.
3716dce513Schristos
3816dce513Schristos #include <stdio.h>
3916dce513Schristos
4016dce513Schristos int
4116dce513Schristos main ()
4216dce513Schristos {
4316dce513Schristos unsigned int i, j;
4416dce513Schristos unsigned int c;
4516dce513Schristos int table[256];
4616dce513Schristos
4716dce513Schristos for (i = 0; i < 256; i++)
4816dce513Schristos {
4916dce513Schristos for (c = i << 24, j = 8; j > 0; --j)
5016dce513Schristos c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
5116dce513Schristos table[i] = c;
5216dce513Schristos }
5316dce513Schristos
5416dce513Schristos printf ("static const unsigned int crc32_table[] =\n{\n");
5516dce513Schristos for (i = 0; i < 256; i += 4)
5616dce513Schristos {
5716dce513Schristos printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
5816dce513Schristos table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
5916dce513Schristos if (i + 4 < 256)
6016dce513Schristos putchar (',');
6116dce513Schristos putchar ('\n');
6216dce513Schristos }
6316dce513Schristos printf ("};\n");
6416dce513Schristos return 0;
6516dce513Schristos }
6616dce513Schristos
6716dce513Schristos For more information on CRC, see, e.g.,
6816dce513Schristos http://www.ross.net/crc/download/crc_v3.txt. */
6916dce513Schristos
7016dce513Schristos static const unsigned int crc32_table[] =
7116dce513Schristos {
7216dce513Schristos 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
7316dce513Schristos 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
7416dce513Schristos 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
7516dce513Schristos 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
7616dce513Schristos 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
7716dce513Schristos 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
7816dce513Schristos 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
7916dce513Schristos 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
8016dce513Schristos 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
8116dce513Schristos 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
8216dce513Schristos 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
8316dce513Schristos 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
8416dce513Schristos 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
8516dce513Schristos 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
8616dce513Schristos 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
8716dce513Schristos 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
8816dce513Schristos 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
8916dce513Schristos 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
9016dce513Schristos 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
9116dce513Schristos 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
9216dce513Schristos 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
9316dce513Schristos 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
9416dce513Schristos 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
9516dce513Schristos 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
9616dce513Schristos 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
9716dce513Schristos 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
9816dce513Schristos 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
9916dce513Schristos 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
10016dce513Schristos 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
10116dce513Schristos 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
10216dce513Schristos 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
10316dce513Schristos 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
10416dce513Schristos 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
10516dce513Schristos 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
10616dce513Schristos 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
10716dce513Schristos 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
10816dce513Schristos 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
10916dce513Schristos 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
11016dce513Schristos 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
11116dce513Schristos 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
11216dce513Schristos 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
11316dce513Schristos 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
11416dce513Schristos 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
11516dce513Schristos 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
11616dce513Schristos 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
11716dce513Schristos 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
11816dce513Schristos 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
11916dce513Schristos 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
12016dce513Schristos 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
12116dce513Schristos 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
12216dce513Schristos 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
12316dce513Schristos 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
12416dce513Schristos 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
12516dce513Schristos 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
12616dce513Schristos 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
12716dce513Schristos 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
12816dce513Schristos 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
12916dce513Schristos 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
13016dce513Schristos 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
13116dce513Schristos 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
13216dce513Schristos 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
13316dce513Schristos 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
13416dce513Schristos 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
13516dce513Schristos 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
13616dce513Schristos };
13716dce513Schristos
13816dce513Schristos /*
13916dce513Schristos
14016dce513Schristos @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
14116dce513Schristos int @var{len}, unsigned int @var{init})
14216dce513Schristos
14316dce513Schristos Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
14416dce513Schristos starting value is @var{init}; this may be used to compute the CRC of
14516dce513Schristos data split across multiple buffers by passing the return value of each
14616dce513Schristos call as the @var{init} parameter of the next.
14716dce513Schristos
14816dce513Schristos This is used by the @command{gdb} remote protocol for the @samp{qCRC}
14916dce513Schristos command. In order to get the same results as gdb for a block of data,
15016dce513Schristos you must pass the first CRC parameter as @code{0xffffffff}.
15116dce513Schristos
15216dce513Schristos This CRC can be specified as:
15316dce513Schristos
15416dce513Schristos Width : 32
15516dce513Schristos Poly : 0x04c11db7
15616dce513Schristos Init : parameter, typically 0xffffffff
15716dce513Schristos RefIn : false
15816dce513Schristos RefOut : false
15916dce513Schristos XorOut : 0
16016dce513Schristos
16116dce513Schristos This differs from the "standard" CRC-32 algorithm in that the values
16216dce513Schristos are not reflected, and there is no final XOR value. These differences
16316dce513Schristos make it easy to compose the values of multiple blocks.
16416dce513Schristos
16516dce513Schristos @end deftypefn
16616dce513Schristos
16716dce513Schristos */
16816dce513Schristos
16916dce513Schristos unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)17016dce513Schristos xcrc32 (const unsigned char *buf, int len, unsigned int init)
17116dce513Schristos {
17216dce513Schristos unsigned int crc = init;
17316dce513Schristos while (len--)
17416dce513Schristos {
17516dce513Schristos crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
17616dce513Schristos buf++;
17716dce513Schristos }
17816dce513Schristos return crc;
17916dce513Schristos }
180