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