14fee23f9Smrg /* crc32.c
2*b1e83836Smrg Copyright (C) 2009-2022 Free Software Foundation, Inc.
34fee23f9Smrg
44fee23f9Smrg This file is part of the libiberty library.
54fee23f9Smrg
64fee23f9Smrg This file is free software; you can redistribute it and/or modify
74fee23f9Smrg it under the terms of the GNU General Public License as published by
84fee23f9Smrg the Free Software Foundation; either version 2 of the License, or
94fee23f9Smrg (at your option) any later version.
104fee23f9Smrg
114fee23f9Smrg In addition to the permissions in the GNU General Public License, the
124fee23f9Smrg Free Software Foundation gives you unlimited permission to link the
134fee23f9Smrg compiled version of this file into combinations with other programs,
144fee23f9Smrg and to distribute those combinations without any restriction coming
154fee23f9Smrg from the use of this file. (The General Public License restrictions
164fee23f9Smrg do apply in other respects; for example, they cover modification of
174fee23f9Smrg the file, and distribution when not linked into a combined
184fee23f9Smrg executable.)
194fee23f9Smrg
204fee23f9Smrg This program is distributed in the hope that it will be useful,
214fee23f9Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
224fee23f9Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
234fee23f9Smrg GNU General Public License for more details.
244fee23f9Smrg
254fee23f9Smrg You should have received a copy of the GNU General Public License
264fee23f9Smrg along with this program; if not, write to the Free Software
274fee23f9Smrg Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
284fee23f9Smrg */
294fee23f9Smrg
304fee23f9Smrg #ifdef HAVE_CONFIG_H
314fee23f9Smrg #include "config.h"
324fee23f9Smrg #endif
334fee23f9Smrg
344fee23f9Smrg #include "libiberty.h"
354fee23f9Smrg
36f9a78e0eSmrg /* This table was generated by the following program.
374fee23f9Smrg
384fee23f9Smrg #include <stdio.h>
394fee23f9Smrg
404fee23f9Smrg int
414fee23f9Smrg main ()
424fee23f9Smrg {
43f9a78e0eSmrg unsigned int i, j;
444fee23f9Smrg unsigned int c;
454fee23f9Smrg int table[256];
464fee23f9Smrg
474fee23f9Smrg for (i = 0; i < 256; i++)
484fee23f9Smrg {
494fee23f9Smrg for (c = i << 24, j = 8; j > 0; --j)
504fee23f9Smrg c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
514fee23f9Smrg table[i] = c;
524fee23f9Smrg }
534fee23f9Smrg
544fee23f9Smrg printf ("static const unsigned int crc32_table[] =\n{\n");
554fee23f9Smrg for (i = 0; i < 256; i += 4)
564fee23f9Smrg {
574fee23f9Smrg printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
584fee23f9Smrg table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
594fee23f9Smrg if (i + 4 < 256)
604fee23f9Smrg putchar (',');
614fee23f9Smrg putchar ('\n');
624fee23f9Smrg }
634fee23f9Smrg printf ("};\n");
644fee23f9Smrg return 0;
654fee23f9Smrg }
664fee23f9Smrg
674fee23f9Smrg For more information on CRC, see, e.g.,
684fee23f9Smrg http://www.ross.net/crc/download/crc_v3.txt. */
694fee23f9Smrg
704fee23f9Smrg static const unsigned int crc32_table[] =
714fee23f9Smrg {
724fee23f9Smrg 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
734fee23f9Smrg 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
744fee23f9Smrg 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
754fee23f9Smrg 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
764fee23f9Smrg 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
774fee23f9Smrg 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
784fee23f9Smrg 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
794fee23f9Smrg 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
804fee23f9Smrg 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
814fee23f9Smrg 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
824fee23f9Smrg 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
834fee23f9Smrg 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
844fee23f9Smrg 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
854fee23f9Smrg 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
864fee23f9Smrg 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
874fee23f9Smrg 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
884fee23f9Smrg 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
894fee23f9Smrg 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
904fee23f9Smrg 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
914fee23f9Smrg 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
924fee23f9Smrg 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
934fee23f9Smrg 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
944fee23f9Smrg 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
954fee23f9Smrg 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
964fee23f9Smrg 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
974fee23f9Smrg 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
984fee23f9Smrg 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
994fee23f9Smrg 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
1004fee23f9Smrg 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
1014fee23f9Smrg 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
1024fee23f9Smrg 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
1034fee23f9Smrg 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
1044fee23f9Smrg 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
1054fee23f9Smrg 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
1064fee23f9Smrg 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
1074fee23f9Smrg 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
1084fee23f9Smrg 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
1094fee23f9Smrg 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
1104fee23f9Smrg 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
1114fee23f9Smrg 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
1124fee23f9Smrg 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
1134fee23f9Smrg 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
1144fee23f9Smrg 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
1154fee23f9Smrg 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
1164fee23f9Smrg 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
1174fee23f9Smrg 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
1184fee23f9Smrg 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
1194fee23f9Smrg 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
1204fee23f9Smrg 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
1214fee23f9Smrg 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
1224fee23f9Smrg 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
1234fee23f9Smrg 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
1244fee23f9Smrg 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
1254fee23f9Smrg 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
1264fee23f9Smrg 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
1274fee23f9Smrg 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
1284fee23f9Smrg 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
1294fee23f9Smrg 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
1304fee23f9Smrg 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
1314fee23f9Smrg 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
1324fee23f9Smrg 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
1334fee23f9Smrg 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
1344fee23f9Smrg 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
1354fee23f9Smrg 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
1364fee23f9Smrg };
1374fee23f9Smrg
1384fee23f9Smrg /*
1394fee23f9Smrg
14048fb7bfaSmrg @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
14148fb7bfaSmrg int @var{len}, unsigned int @var{init})
1424fee23f9Smrg
1434fee23f9Smrg Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
1444fee23f9Smrg starting value is @var{init}; this may be used to compute the CRC of
1454fee23f9Smrg data split across multiple buffers by passing the return value of each
1464fee23f9Smrg call as the @var{init} parameter of the next.
1474fee23f9Smrg
148f9a78e0eSmrg This is used by the @command{gdb} remote protocol for the @samp{qCRC}
149f9a78e0eSmrg command. In order to get the same results as gdb for a block of data,
150f9a78e0eSmrg you must pass the first CRC parameter as @code{0xffffffff}.
1514fee23f9Smrg
1524fee23f9Smrg This CRC can be specified as:
1534fee23f9Smrg
1544fee23f9Smrg Width : 32
1554fee23f9Smrg Poly : 0x04c11db7
1564fee23f9Smrg Init : parameter, typically 0xffffffff
1574fee23f9Smrg RefIn : false
1584fee23f9Smrg RefOut : false
1594fee23f9Smrg XorOut : 0
1604fee23f9Smrg
1614fee23f9Smrg This differs from the "standard" CRC-32 algorithm in that the values
1624fee23f9Smrg are not reflected, and there is no final XOR value. These differences
1634fee23f9Smrg make it easy to compose the values of multiple blocks.
1644fee23f9Smrg
1654fee23f9Smrg @end deftypefn
1664fee23f9Smrg
1674fee23f9Smrg */
1684fee23f9Smrg
1694fee23f9Smrg unsigned int
xcrc32(const unsigned char * buf,int len,unsigned int init)1704fee23f9Smrg xcrc32 (const unsigned char *buf, int len, unsigned int init)
1714fee23f9Smrg {
1724fee23f9Smrg unsigned int crc = init;
1734fee23f9Smrg while (len--)
1744fee23f9Smrg {
1754fee23f9Smrg crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
1764fee23f9Smrg buf++;
1774fee23f9Smrg }
1784fee23f9Smrg return crc;
1794fee23f9Smrg }
180