crypto: crc32c should use library implementation
[linux-2.6-block.git] / lib / crc32.c
CommitLineData
1da177e4 1/*
78dff418
BP
2 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
3 * cleaned up code to current version of sparse and added the slicing-by-8
4 * algorithm to the closely similar existing slicing-by-4 algorithm.
5 *
1da177e4
LT
6 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
7 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
8 * Code was from the public domain, copyright abandoned. Code was
9 * subsequently included in the kernel, thus was re-licensed under the
10 * GNU GPL v2.
11 *
12 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
13 * Same crc32 function was used in 5 other places in the kernel.
14 * I made one version, and deleted the others.
15 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
16 * Some xor at the end with ~0. The generic crc32() function takes
17 * seed as an argument, and doesn't xor at the end. Then individual
18 * users can do whatever they need.
19 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
20 * fs/jffs2 uses seed 0, doesn't xor with ~0.
21 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
22 *
23 * This source code is licensed under the GNU General Public License,
24 * Version 2. See the file COPYING for more details.
25 */
26
fbedceb1
BP
27/* see: Documentation/crc32.txt for a description of algorithms */
28
1da177e4 29#include <linux/crc32.h>
1da177e4 30#include <linux/module.h>
1da177e4 31#include <linux/types.h>
1da177e4 32#include "crc32defs.h"
60e58d5c 33
9a1dbf6a 34#if CRC_LE_BITS > 8
ce4320dd 35# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
1da177e4 36#else
4f2a9463
JT
37# define tole(x) (x)
38#endif
39
9a1dbf6a 40#if CRC_BE_BITS > 8
ce4320dd 41# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
4f2a9463
JT
42#else
43# define tobe(x) (x)
1da177e4 44#endif
60e58d5c 45
1da177e4
LT
46#include "crc32table.h"
47
48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
46c5801e 49MODULE_DESCRIPTION("Various CRC32 calculations");
1da177e4
LT
50MODULE_LICENSE("GPL");
51
9a1dbf6a 52#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
ddcaccbc 53
324eb0f1 54/* implements slicing-by-4 or slicing-by-8 algorithm */
ddcaccbc 55static inline u32
836e2af9 56crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
ddcaccbc 57{
0d2daf5c 58# ifdef __LITTLE_ENDIAN
5742332d 59# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
324eb0f1
BP
60# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
61 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
62# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
63 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
ddcaccbc 64# else
5742332d 65# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
324eb0f1
BP
66# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
67 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
68# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
69 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
ddcaccbc 70# endif
4f2a9463 71 const u32 *b;
ddcaccbc 72 size_t rem_len;
0292c497
BP
73# ifdef CONFIG_X86
74 size_t i;
75# endif
5742332d 76 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
324eb0f1
BP
77 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
78 u32 q;
ddcaccbc
JT
79
80 /* Align it */
4f2a9463 81 if (unlikely((long)buf & 3 && len)) {
ddcaccbc 82 do {
4f2a9463
JT
83 DO_CRC(*buf++);
84 } while ((--len) && ((long)buf)&3);
ddcaccbc 85 }
324eb0f1
BP
86
87# if CRC_LE_BITS == 32
ddcaccbc 88 rem_len = len & 3;
ddcaccbc 89 len = len >> 2;
324eb0f1
BP
90# else
91 rem_len = len & 7;
92 len = len >> 3;
93# endif
94
4f2a9463 95 b = (const u32 *)buf;
0292c497
BP
96# ifdef CONFIG_X86
97 --b;
98 for (i = 0; i < len; i++) {
99# else
ddcaccbc 100 for (--b; len; --len) {
0292c497 101# endif
324eb0f1
BP
102 q = crc ^ *++b; /* use pre increment for speed */
103# if CRC_LE_BITS == 32
104 crc = DO_CRC4;
105# else
106 crc = DO_CRC8;
107 q = *++b;
108 crc ^= DO_CRC4;
109# endif
ddcaccbc
JT
110 }
111 len = rem_len;
112 /* And the last few bytes */
113 if (len) {
114 u8 *p = (u8 *)(b + 1) - 1;
0292c497
BP
115# ifdef CONFIG_X86
116 for (i = 0; i < len; i++)
117 DO_CRC(*++p); /* use pre increment for speed */
118# else
ddcaccbc
JT
119 do {
120 DO_CRC(*++p); /* use pre increment for speed */
121 } while (--len);
0292c497 122# endif
ddcaccbc
JT
123 }
124 return crc;
4f2a9463 125#undef DO_CRC
836e2af9 126#undef DO_CRC4
324eb0f1 127#undef DO_CRC8
ddcaccbc
JT
128}
129#endif
60e58d5c 130
2f72100c
RD
131/**
132 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
133 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
134 * other uses, or the previous crc32 value if computing incrementally.
135 * @p: pointer to buffer over which CRC is run
136 * @len: length of buffer @p
137 */
46c5801e
DW
138static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
139 size_t len, const u32 (*tab)[256],
140 u32 polynomial)
1da177e4 141{
60e58d5c 142#if CRC_LE_BITS == 1
1da177e4
LT
143 int i;
144 while (len--) {
145 crc ^= *p++;
146 for (i = 0; i < 8; i++)
46c5801e 147 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
1da177e4 148 }
60e58d5c 149# elif CRC_LE_BITS == 2
1da177e4
LT
150 while (len--) {
151 crc ^= *p++;
46c5801e
DW
152 crc = (crc >> 2) ^ tab[0][crc & 3];
153 crc = (crc >> 2) ^ tab[0][crc & 3];
154 crc = (crc >> 2) ^ tab[0][crc & 3];
155 crc = (crc >> 2) ^ tab[0][crc & 3];
1da177e4 156 }
60e58d5c 157# elif CRC_LE_BITS == 4
1da177e4
LT
158 while (len--) {
159 crc ^= *p++;
46c5801e
DW
160 crc = (crc >> 4) ^ tab[0][crc & 15];
161 crc = (crc >> 4) ^ tab[0][crc & 15];
1da177e4 162 }
60e58d5c 163# elif CRC_LE_BITS == 8
9a1dbf6a
BP
164 /* aka Sarwate algorithm */
165 while (len--) {
166 crc ^= *p++;
46c5801e 167 crc = (crc >> 8) ^ tab[0][crc & 255];
9a1dbf6a
BP
168 }
169# else
ce4320dd 170 crc = (__force u32) __cpu_to_le32(crc);
60e58d5c 171 crc = crc32_body(crc, p, len, tab);
ce4320dd 172 crc = __le32_to_cpu((__force __le32)crc);
60e58d5c 173#endif
1da177e4 174 return crc;
1da177e4 175}
46c5801e
DW
176
177#if CRC_LE_BITS == 1
178u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
179{
180 return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
181}
182u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
183{
184 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
185}
186#else
187u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
188{
189 return crc32_le_generic(crc, p, len, crc32table_le, CRCPOLY_LE);
190}
191u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
192{
193 return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE);
194}
195#endif
60e58d5c 196EXPORT_SYMBOL(crc32_le);
46c5801e 197EXPORT_SYMBOL(__crc32c_le);
1da177e4 198
2f72100c
RD
199/**
200 * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
201 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
202 * other uses, or the previous crc32 value if computing incrementally.
203 * @p: pointer to buffer over which CRC is run
204 * @len: length of buffer @p
205 */
46c5801e
DW
206static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
207 size_t len, const u32 (*tab)[256],
208 u32 polynomial)
1da177e4 209{
60e58d5c 210#if CRC_BE_BITS == 1
1da177e4
LT
211 int i;
212 while (len--) {
213 crc ^= *p++ << 24;
214 for (i = 0; i < 8; i++)
215 crc =
46c5801e 216 (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
1da177e4
LT
217 0);
218 }
60e58d5c 219# elif CRC_BE_BITS == 2
1da177e4
LT
220 while (len--) {
221 crc ^= *p++ << 24;
46c5801e
DW
222 crc = (crc << 2) ^ tab[0][crc >> 30];
223 crc = (crc << 2) ^ tab[0][crc >> 30];
224 crc = (crc << 2) ^ tab[0][crc >> 30];
225 crc = (crc << 2) ^ tab[0][crc >> 30];
1da177e4 226 }
60e58d5c 227# elif CRC_BE_BITS == 4
1da177e4
LT
228 while (len--) {
229 crc ^= *p++ << 24;
46c5801e
DW
230 crc = (crc << 4) ^ tab[0][crc >> 28];
231 crc = (crc << 4) ^ tab[0][crc >> 28];
1da177e4 232 }
60e58d5c 233# elif CRC_BE_BITS == 8
9a1dbf6a
BP
234 while (len--) {
235 crc ^= *p++ << 24;
46c5801e 236 crc = (crc << 8) ^ tab[0][crc >> 24];
9a1dbf6a
BP
237 }
238# else
ce4320dd 239 crc = (__force u32) __cpu_to_be32(crc);
60e58d5c 240 crc = crc32_body(crc, p, len, tab);
ce4320dd 241 crc = __be32_to_cpu((__force __be32)crc);
1da177e4 242# endif
60e58d5c 243 return crc;
1da177e4 244}
46c5801e
DW
245
246#if CRC_LE_BITS == 1
247u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
248{
249 return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
250}
251#else
252u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
253{
254 return crc32_be_generic(crc, p, len, crc32table_be, CRCPOLY_BE);
255}
256#endif
1da177e4 257EXPORT_SYMBOL(crc32_be);
1da177e4 258
3863ef31 259#ifdef CONFIG_CRC32_SELFTEST
1da177e4 260
3863ef31
BP
261/* 4096 random bytes */
262static u8 __attribute__((__aligned__(8))) test_buf[] =
1da177e4 263{
3863ef31
BP
264 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
265 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
266 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
267 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
268 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
269 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
270 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
271 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
272 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
273 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
274 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
275 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
276 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
277 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
278 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
279 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
280 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
281 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
282 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
283 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
284 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
285 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
286 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
287 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
288 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
289 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
290 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
291 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
292 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
293 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
294 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
295 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
296 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
297 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
298 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
299 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
300 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
301 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
302 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
303 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
304 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
305 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
306 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
307 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
308 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
309 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
310 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
311 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
312 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
313 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
314 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
315 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
316 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
317 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
318 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
319 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
320 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
321 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
322 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
323 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
324 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
325 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
326 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
327 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
328 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
329 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
330 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
331 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
332 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
333 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
334 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
335 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
336 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
337 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
338 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
339 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
340 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
341 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
342 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
343 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
344 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
345 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
346 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
347 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
348 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
349 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
350 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
351 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
352 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
353 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
354 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
355 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
356 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
357 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
358 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
359 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
360 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
361 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
362 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
363 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
364 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
365 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
366 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
367 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
368 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
369 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
370 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
371 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
372 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
373 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
374 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
375 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
376 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
377 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
378 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
379 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
380 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
381 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
382 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
383 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
384 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
385 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
386 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
387 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
388 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
389 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
390 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
391 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
392 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
393 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
394 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
395 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
396 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
397 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
398 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
399 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
400 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
401 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
402 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
403 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
404 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
405 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
406 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
407 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
408 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
409 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
410 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
411 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
412 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
413 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
414 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
415 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
416 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
417 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
418 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
419 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
420 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
421 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
422 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
423 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
424 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
425 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
426 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
427 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
428 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
429 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
430 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
431 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
432 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
433 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
434 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
435 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
436 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
437 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
438 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
439 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
440 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
441 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
442 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
443 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
444 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
445 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
446 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
447 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
448 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
449 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
450 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
451 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
452 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
453 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
454 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
455 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
456 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
457 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
458 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
459 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
460 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
461 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
462 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
463 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
464 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
465 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
466 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
467 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
468 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
469 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
470 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
471 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
472 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
473 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
474 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
475 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
476 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
477 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
478 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
479 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
480 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
481 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
482 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
483 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
484 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
485 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
486 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
487 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
488 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
489 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
490 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
491 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
492 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
493 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
494 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
495 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
496 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
497 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
498 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
499 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
500 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
501 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
502 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
503 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
504 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
505 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
506 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
507 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
508 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
509 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
510 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
511 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
512 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
513 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
514 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
515 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
516 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
517 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
518 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
519 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
520 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
521 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
522 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
523 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
524 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
525 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
526 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
527 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
528 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
529 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
530 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
531 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
532 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
533 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
534 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
535 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
536 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
537 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
538 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
539 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
540 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
541 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
542 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
543 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
544 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
545 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
546 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
547 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
548 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
549 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
550 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
551 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
552 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
553 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
554 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
555 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
556 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
557 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
558 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
559 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
560 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
561 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
562 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
563 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
564 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
565 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
566 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
567 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
568 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
569 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
570 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
571 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
572 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
573 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
574 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
575 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
576 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
577 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
578 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
579 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
580 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
581 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
582 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
583 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
584 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
585 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
586 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
587 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
588 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
589 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
590 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
591 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
592 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
593 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
594 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
595 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
596 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
597 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
598 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
599 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
600 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
601 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
602 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
603 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
604 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
605 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
606 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
607 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
608 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
609 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
610 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
611 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
612 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
613 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
614 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
615 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
616 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
617 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
618 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
619 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
620 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
621 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
622 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
623 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
624 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
625 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
626 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
627 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
628 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
629 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
630 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
631 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
632 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
633 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
634 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
635 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
636 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
637 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
638 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
639 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
640 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
641 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
642 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
643 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
644 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
645 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
646 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
647 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
648 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
649 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
650 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
651 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
652 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
653 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
654 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
655 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
656 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
657 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
658 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
659 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
660 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
661 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
662 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
663 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
664 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
665 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
666 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
667 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
668 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
669 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
670 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
671 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
672 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
673 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
674 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
675 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
676 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
677 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
678 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
679 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
680 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
681 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
682 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
683 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
684 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
685 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
686 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
687 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
688 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
689 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
690 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
691 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
692 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
693 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
694 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
695 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
696 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
697 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
698 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
699 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
700 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
701 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
702 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
703 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
704 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
705 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
706 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
707 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
708 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
709 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
710 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
711 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
712 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
713 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
714 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
715 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
716 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
717 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
718 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
719 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
720 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
721 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
722 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
723 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
724 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
725 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
726 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
727 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
728 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
729 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
730 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
731 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
732 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
733 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
734 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
735 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
736 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
737 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
738 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
739 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
740 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
741 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
742 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
743 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
744 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
745 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
746 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
747 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
748 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
749 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
750 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
751 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
752 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
753 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
754 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
755 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
756 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
757 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
758 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
759 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
760 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
761 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
762 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
763 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
764 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
765 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
766 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
767 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
768 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
769 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
770 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
771 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
772 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
773 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
774 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
775 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
776};
777
778/* 100 test cases */
779static struct crc_test {
780 u32 crc; /* random starting crc */
781 u32 start; /* random 6 bit offset in buf */
782 u32 length; /* random 11 bit length of test */
783 u32 crc_le; /* expected crc32_le result */
784 u32 crc_be; /* expected crc32_be result */
785} test[] =
1da177e4 786{
3863ef31
BP
787 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1},
788 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad},
789 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f},
790 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a},
791 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2},
792 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793},
793 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed},
794 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35},
795 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2},
796 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10},
797 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb},
798 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0},
799 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb},
800 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed},
801 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591},
802 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67},
803 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd},
804 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a},
805 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b},
806 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f},
807 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d},
808 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a},
809 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97},
810 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2},
811 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138},
812 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032},
813 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f},
814 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f},
815 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32},
816 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef},
817 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0},
818 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59},
819 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4},
820 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c},
821 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51},
822 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11},
823 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659},
824 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af},
825 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99},
826 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b},
827 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521},
828 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3},
829 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d},
830 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f},
831 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b},
832 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0},
833 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195},
834 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d},
835 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4},
836 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3},
837 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643},
838 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10},
839 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d},
840 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5},
841 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b},
842 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee},
843 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14},
844 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a},
845 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b},
846 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3},
847 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826},
848 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06},
849 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35},
850 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801},
851 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2},
852 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d},
853 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c},
854 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba},
855 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5},
856 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b},
857 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178},
858 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3},
859 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605},
860 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1},
861 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9},
862 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78},
863 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9},
864 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd},
865 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab},
866 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb},
867 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77},
868 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da},
869 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39},
870 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16},
871 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208},
872 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e},
873 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5},
874 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892},
875 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db},
876 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43},
877 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac},
878 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7},
879 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2},
880 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2},
881 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640},
882 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f},
883 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99},
884 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7},
885 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499},
886 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a},
887};
888
889#include <linux/time.h>
890
891static int __init crc32_init(void)
1da177e4 892{
3863ef31
BP
893 int i;
894 int errors = 0;
895 int bytes = 0;
896 struct timespec start, stop;
897 u64 nsec;
898 unsigned long flags;
1da177e4 899
3863ef31
BP
900 /* keep static to prevent cache warming code from
901 * getting eliminated by the compiler */
902 static u32 crc;
1da177e4 903
3863ef31
BP
904 /* pre-warm the cache */
905 for (i = 0; i < 100; i++) {
906 bytes += 2*test[i].length;
1da177e4 907
3863ef31
BP
908 crc ^= crc32_le(test[i].crc, test_buf +
909 test[i].start, test[i].length);
910
911 crc ^= crc32_be(test[i].crc, test_buf +
912 test[i].start, test[i].length);
1da177e4
LT
913 }
914
3863ef31
BP
915 /* reduce OS noise */
916 local_irq_save(flags);
917 local_irq_disable();
918
919 getnstimeofday(&start);
920 for (i = 0; i < 100; i++) {
921 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
922 test[i].start, test[i].length))
923 errors++;
924
925 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
926 test[i].start, test[i].length))
927 errors++;
1da177e4 928 }
3863ef31 929 getnstimeofday(&stop);
1da177e4 930
3863ef31
BP
931 local_irq_restore(flags);
932 local_irq_enable();
1da177e4 933
3863ef31
BP
934 nsec = stop.tv_nsec - start.tv_nsec +
935 1000000000 * (stop.tv_sec - start.tv_sec);
1da177e4 936
3863ef31
BP
937 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
938 CRC_LE_BITS, CRC_BE_BITS);
939
940 if (errors)
941 pr_warn("crc32: %d self tests failed\n", errors);
942 else {
943 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
944 bytes, nsec);
1da177e4 945 }
3863ef31 946
1da177e4
LT
947 return 0;
948}
949
3863ef31
BP
950static void __exit crc32_exit(void)
951{
952}
953
954module_init(crc32_init);
955module_exit(crc32_exit);
956#endif /* CONFIG_CRC32_SELFTEST */