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