]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - libfrog/crc32.c
xfsprogs: don't include all xfs headers just for crc32
[thirdparty/xfsprogs-dev.git] / libfrog / 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
b6571855
ES
32#include <inttypes.h>
33#include <asm/types.h>
34#include <sys/time.h>
6b803e5a 35#include "platform_defs.h"
b6571855 36/* For endian conversion routines */
6b803e5a 37#include "xfs_arch.h"
7e280e68
DC
38#include "crc32defs.h"
39
40/* types specifc to this file */
41typedef __u8 u8;
42typedef __u16 u16;
43typedef __u32 u32;
44typedef __u32 u64;
45#define __pure
46
47#if CRC_LE_BITS > 8
48# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
49#else
50# define tole(x) (x)
51#endif
52
7e280e68
DC
53#include "crc32table.h"
54
b123033a 55#if CRC_LE_BITS > 8
7e280e68
DC
56
57/* implements slicing-by-4 or slicing-by-8 algorithm */
58static inline u32
59crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
60{
b2dbd6a9 61#if __BYTE_ORDER == __LITTLE_ENDIAN
7e280e68
DC
62# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
63# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
64 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
65# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
66 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
b2dbd6a9 67# elif __BYTE_ORDER == __BIG_ENDIAN
7e280e68
DC
68# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
69# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
70 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
71# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
72 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
b2dbd6a9
ES
73# else
74# error What endian are you?
7e280e68
DC
75# endif
76 const u32 *b;
77 size_t rem_len;
78 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
79# if CRC_LE_BITS != 32
80 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
81# endif
82 u32 q;
83
84 /* Align it */
85 if (((long)buf & 3) && len) {
86 do {
87 DO_CRC(*buf++);
88 } while ((--len) && ((long)buf)&3);
89 }
90
91# if CRC_LE_BITS == 32
92 rem_len = len & 3;
93 len = len >> 2;
94# else
95 rem_len = len & 7;
96 len = len >> 3;
97# endif
98
99 b = (const u32 *)buf;
100 for (--b; len; --len) {
101 q = crc ^ *++b; /* use pre increment for speed */
102# if CRC_LE_BITS == 32
103 crc = DO_CRC4;
104# else
105 crc = DO_CRC8;
106 q = *++b;
107 crc ^= DO_CRC4;
108# endif
109 }
110 len = rem_len;
111 /* And the last few bytes */
112 if (len) {
113 u8 *p = (u8 *)(b + 1) - 1;
114 do {
115 DO_CRC(*++p); /* use pre increment for speed */
116 } while (--len);
117 }
118 return crc;
119#undef DO_CRC
120#undef DO_CRC4
121#undef DO_CRC8
122}
123#endif
124
125/**
126 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
127 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
128 * other uses, or the previous crc32 value if computing incrementally.
129 * @p: pointer to buffer over which CRC is run
130 * @len: length of buffer @p
131 */
132static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
133 size_t len, const u32 (*tab)[256],
134 u32 polynomial)
135{
136#if CRC_LE_BITS == 1
137 int i;
138 while (len--) {
139 crc ^= *p++;
140 for (i = 0; i < 8; i++)
141 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
142 }
143# elif CRC_LE_BITS == 2
144 while (len--) {
145 crc ^= *p++;
146 crc = (crc >> 2) ^ tab[0][crc & 3];
147 crc = (crc >> 2) ^ tab[0][crc & 3];
148 crc = (crc >> 2) ^ tab[0][crc & 3];
149 crc = (crc >> 2) ^ tab[0][crc & 3];
150 }
151# elif CRC_LE_BITS == 4
152 while (len--) {
153 crc ^= *p++;
154 crc = (crc >> 4) ^ tab[0][crc & 15];
155 crc = (crc >> 4) ^ tab[0][crc & 15];
156 }
157# elif CRC_LE_BITS == 8
158 /* aka Sarwate algorithm */
159 while (len--) {
160 crc ^= *p++;
161 crc = (crc >> 8) ^ tab[0][crc & 255];
162 }
163# else
164 crc = (__force u32) cpu_to_le32(crc);
165 crc = crc32_body(crc, p, len, tab);
166 crc = le32_to_cpu((__force __le32)crc);
167#endif
168 return crc;
169}
170
171#if CRC_LE_BITS == 1
7e280e68
DC
172u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len)
173{
174 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
175}
176#else
7e280e68
DC
177u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len)
178{
179 return crc32_le_generic(crc, p, len,
180 (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
181}
182#endif
183
184
185#ifdef CRC32_SELFTEST
186
187/* 4096 random bytes */
188static u8 __attribute__((__aligned__(8))) test_buf[] =
189{
190 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
191 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
192 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
193 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
194 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
195 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
196 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
197 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
198 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
199 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
200 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
201 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
202 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
203 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
204 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
205 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
206 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
207 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
208 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
209 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
210 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
211 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
212 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
213 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
214 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
215 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
216 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
217 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
218 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
219 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
220 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
221 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
222 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
223 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
224 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
225 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
226 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
227 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
228 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
229 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
230 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
231 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
232 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
233 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
234 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
235 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
236 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
237 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
238 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
239 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
240 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
241 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
242 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
243 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
244 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
245 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
246 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
247 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
248 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
249 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
250 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
251 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
252 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
253 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
254 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
255 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
256 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
257 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
258 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
259 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
260 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
261 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
262 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
263 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
264 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
265 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
266 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
267 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
268 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
269 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
270 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
271 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
272 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
273 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
274 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
275 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
276 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
277 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
278 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
279 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
280 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
281 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
282 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
283 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
284 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
285 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
286 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
287 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
288 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
289 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
290 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
291 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
292 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
293 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
294 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
295 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
296 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
297 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
298 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
299 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
300 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
301 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
302 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
303 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
304 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
305 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
306 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
307 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
308 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
309 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
310 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
311 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
312 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
313 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
314 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
315 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
316 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
317 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
318 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
319 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
320 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
321 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
322 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
323 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
324 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
325 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
326 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
327 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
328 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
329 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
330 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
331 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
332 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
333 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
334 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
335 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
336 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
337 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
338 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
339 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
340 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
341 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
342 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
343 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
344 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
345 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
346 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
347 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
348 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
349 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
350 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
351 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
352 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
353 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
354 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
355 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
356 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
357 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
358 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
359 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
360 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
361 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
362 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
363 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
364 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
365 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
366 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
367 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
368 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
369 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
370 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
371 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
372 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
373 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
374 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
375 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
376 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
377 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
378 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
379 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
380 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
381 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
382 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
383 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
384 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
385 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
386 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
387 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
388 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
389 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
390 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
391 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
392 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
393 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
394 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
395 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
396 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
397 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
398 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
399 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
400 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
401 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
402 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
403 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
404 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
405 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
406 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
407 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
408 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
409 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
410 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
411 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
412 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
413 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
414 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
415 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
416 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
417 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
418 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
419 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
420 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
421 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
422 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
423 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
424 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
425 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
426 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
427 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
428 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
429 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
430 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
431 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
432 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
433 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
434 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
435 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
436 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
437 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
438 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
439 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
440 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
441 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
442 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
443 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
444 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
445 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
446 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
447 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
448 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
449 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
450 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
451 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
452 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
453 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
454 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
455 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
456 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
457 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
458 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
459 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
460 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
461 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
462 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
463 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
464 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
465 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
466 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
467 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
468 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
469 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
470 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
471 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
472 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
473 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
474 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
475 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
476 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
477 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
478 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
479 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
480 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
481 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
482 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
483 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
484 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
485 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
486 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
487 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
488 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
489 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
490 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
491 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
492 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
493 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
494 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
495 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
496 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
497 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
498 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
499 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
500 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
501 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
502 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
503 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
504 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
505 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
506 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
507 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
508 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
509 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
510 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
511 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
512 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
513 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
514 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
515 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
516 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
517 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
518 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
519 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
520 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
521 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
522 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
523 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
524 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
525 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
526 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
527 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
528 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
529 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
530 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
531 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
532 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
533 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
534 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
535 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
536 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
537 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
538 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
539 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
540 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
541 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
542 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
543 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
544 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
545 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
546 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
547 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
548 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
549 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
550 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
551 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
552 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
553 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
554 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
555 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
556 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
557 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
558 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
559 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
560 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
561 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
562 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
563 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
564 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
565 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
566 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
567 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
568 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
569 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
570 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
571 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
572 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
573 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
574 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
575 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
576 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
577 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
578 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
579 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
580 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
581 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
582 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
583 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
584 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
585 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
586 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
587 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
588 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
589 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
590 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
591 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
592 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
593 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
594 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
595 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
596 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
597 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
598 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
599 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
600 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
601 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
602 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
603 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
604 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
605 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
606 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
607 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
608 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
609 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
610 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
611 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
612 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
613 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
614 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
615 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
616 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
617 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
618 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
619 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
620 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
621 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
622 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
623 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
624 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
625 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
626 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
627 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
628 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
629 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
630 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
631 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
632 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
633 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
634 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
635 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
636 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
637 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
638 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
639 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
640 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
641 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
642 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
643 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
644 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
645 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
646 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
647 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
648 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
649 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
650 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
651 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
652 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
653 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
654 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
655 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
656 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
657 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
658 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
659 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
660 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
661 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
662 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
663 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
664 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
665 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
666 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
667 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
668 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
669 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
670 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
671 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
672 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
673 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
674 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
675 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
676 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
677 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
678 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
679 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
680 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
681 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
682 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
683 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
684 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
685 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
686 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
687 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
688 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
689 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
690 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
691 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
692 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
693 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
694 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
695 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
696 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
697 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
698 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
699 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
700 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
701 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
702};
703
704/* 100 test cases */
705static struct crc_test {
706 u32 crc; /* random starting crc */
707 u32 start; /* random 6 bit offset in buf */
708 u32 length; /* random 11 bit length of test */
7e280e68
DC
709 u32 crc32c_le; /* expected crc32c_le result */
710} test[] =
711{
b123033a
DW
712 {0x674bf11d, 0x00000038, 0x00000542, 0xf6e93d6c},
713 {0x35c672c6, 0x0000003a, 0x000001aa, 0x0fe92aca},
714 {0x496da28e, 0x00000039, 0x000005af, 0x52e1ebb8},
715 {0x09a9b90e, 0x00000027, 0x000001f8, 0x0798af9a},
716 {0xdc97e5a9, 0x00000025, 0x000003b6, 0x18eb3152},
717 {0x47c58900, 0x0000000a, 0x000000b9, 0xd00d08c7},
718 {0x292561e8, 0x0000000c, 0x00000403, 0x8ba966bc},
719 {0x415037f6, 0x00000003, 0x00000676, 0x11d694a2},
720 {0x3466e707, 0x00000026, 0x00000042, 0x6ab3208d},
721 {0xafd1281b, 0x00000023, 0x000002ee, 0xba4603c5},
722 {0xd3857b18, 0x00000028, 0x000004a2, 0xe6071c6f},
723 {0x1d825a8f, 0x0000002b, 0x0000050b, 0x179ec30a},
724 {0x5033e3bc, 0x0000000b, 0x00000078, 0x0903beb8},
725 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0x6a7cb4fa},
726 {0xc9a0fe14, 0x00000009, 0x00000473, 0xdb535801},
727 {0x88a034b1, 0x0000001c, 0x000005ad, 0x92bed597},
728 {0xf0f72239, 0x00000020, 0x0000026d, 0x192a3f1b},
729 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0xccbaec1a},
730 {0xce589c95, 0x0000002b, 0x00000641, 0x7eabae4d},
731 {0x78edc885, 0x00000035, 0x000005be, 0x28c72982},
732 {0x9d40a377, 0x0000003b, 0x00000038, 0xc3cd4d18},
733 {0x703d0e01, 0x0000003c, 0x000006f1, 0xbca8f0e7},
734 {0x776bf505, 0x0000000f, 0x000005b2, 0x713f60b3},
735 {0x4a3e7854, 0x00000027, 0x000004b8, 0xebd08fd5},
736 {0x209172dd, 0x0000003b, 0x00000356, 0x64406c59},
737 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0x7421890e},
738 {0xfc62f297, 0x00000000, 0x00000079, 0xe9347603},
739 {0x64280b8b, 0x00000016, 0x000007ab, 0x1bef9060},
740 {0x97dd724b, 0x00000033, 0x000007ad, 0x34720072},
741 {0x61394b52, 0x00000035, 0x00000571, 0x48310f59},
742 {0x29b4faff, 0x00000024, 0x0000006e, 0x783a4213},
743 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x9e8efd41},
744 {0x86ae934b, 0x00000035, 0x00000104, 0xfc3d34a5},
745 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x17a52ae2},
746 {0x3287a80a, 0x00000026, 0x00000496, 0x886d935a},
747 {0xa4db423e, 0x00000023, 0x0000045d, 0xeaaeaeb2},
748 {0x7a1078df, 0x00000015, 0x0000014a, 0x8e900a4b},
749 {0x6048bd5b, 0x00000006, 0x0000006a, 0xd74662b1},
750 {0xd8f9ea20, 0x0000003d, 0x00000277, 0xd26752ba},
751 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x8b1fcd62},
752 {0x2dfb005d, 0x00000016, 0x00000345, 0xf54342fe},
753 {0x5a214ade, 0x00000020, 0x000005b6, 0x5b95b988},
754 {0xf0ab9cca, 0x00000032, 0x00000515, 0x2e1176be},
755 {0x91b444f9, 0x0000002e, 0x000007f8, 0x66120546},
756 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xf256a5cc},
757 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x4af1dd69},
758 {0x0470180c, 0x00000034, 0x000001f0, 0x56f0a04a},
759 {0xffaa3a3f, 0x00000036, 0x00000299, 0x74f6b6b2},
760 {0x6406cfeb, 0x00000023, 0x00000600, 0x085951fd},
761 {0xb24aaa38, 0x0000003e, 0x000004a1, 0xc65387eb},
762 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x1ca9257b},
763 {0x3db85970, 0x00000006, 0x000002b6, 0xfd196d76},
764 {0x857830c5, 0x00000003, 0x00000590, 0x5ef88339},
765 {0xe1fcd978, 0x0000003e, 0x000007d8, 0x2c3714d9},
766 {0xb982a768, 0x00000016, 0x000006e0, 0x58576548},
767 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xfd7c57de},
768 {0x2456719b, 0x00000025, 0x00000503, 0xd5fedd59},
769 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x1cc3b17b},
770 {0xcba828e3, 0x00000039, 0x000002ce, 0x270eed73},
771 {0x13d25952, 0x0000000a, 0x0000072d, 0x91ecbb11},
772 {0x0342be3f, 0x00000015, 0x00000599, 0x05ed8d0c},
773 {0xeaa344e0, 0x00000014, 0x000004d8, 0x0b09ad5b},
774 {0xbbb52021, 0x0000003b, 0x00000272, 0xf8d511fb},
775 {0xb66384dc, 0x0000001d, 0x000007fc, 0x5ad832cc},
776 {0x616c01b6, 0x00000022, 0x000002c8, 0x1214d196},
777 {0xce2bdaad, 0x00000016, 0x0000062a, 0x5747218a},
778 {0x00fe84d7, 0x00000005, 0x00000205, 0xde8f14de},
779 {0xbebdcb4c, 0x00000006, 0x0000055d, 0x3563b7b9},
780 {0xd8b1a02a, 0x00000010, 0x00000387, 0x071475d0},
781 {0x3b96cad2, 0x00000036, 0x00000347, 0x54c79d60},
782 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x4c53eee6},
783 {0x1aad454e, 0x00000025, 0x000002b2, 0x10137a3c},
784 {0xa4fec9a6, 0x00000000, 0x000006d6, 0xaa9d6c73},
785 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0xb63d23e7},
786 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7f53e9cf},
787 {0x23fddc96, 0x00000003, 0x00000627, 0x13c1cd83},
788 {0xd82ba25c, 0x00000016, 0x0000063e, 0x49ff5867},
789 {0x786f2032, 0x0000002d, 0x0000060f, 0x8467f211},
790 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x3f9683b2},
791 {0x1a6e0a39, 0x00000008, 0x00000672, 0x76a3f874},
792 {0x56000ab8, 0x0000000e, 0x000000e5, 0x863b702f},
793 {0x4717fe0c, 0x00000000, 0x000006ec, 0xdc6c58ff},
794 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x0622cc95},
795 {0xc25dd6c6, 0x00000024, 0x000006c0, 0xe85605cd},
796 {0xe9b11300, 0x00000023, 0x00000683, 0x31da5f06},
797 {0x95cd285e, 0x00000001, 0x00000047, 0xa1f2e784},
798 {0xd9245a25, 0x0000001e, 0x000003a6, 0xb07cc616},
799 {0x103279db, 0x00000006, 0x0000039b, 0xbf943b6c},
800 {0x1cba3172, 0x00000027, 0x000001c8, 0x2c01af1c},
801 {0x8f613739, 0x0000000c, 0x000001df, 0x0fe5f56d},
802 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0xf8943b2d},
803 {0xaabe5b93, 0x0000003d, 0x00000715, 0xe4d89272},
804 {0xf15dd038, 0x00000006, 0x000006db, 0x7c2f6bbb},
805 {0x584dd49c, 0x00000020, 0x000007bc, 0xabbf388b},
806 {0x5d8c9506, 0x00000020, 0x00000470, 0x1dca1f4e},
807 {0xb80d17b0, 0x00000032, 0x00000346, 0x5c170e23},
808 {0xdaf0592e, 0x00000023, 0x000007b0, 0xc0e9d672},
809 {0x4793cc85, 0x0000000d, 0x00000706, 0xc18bdc86},
810 {0x82ebf64e, 0x00000009, 0x000007c3, 0xa874fcdd},
811 {0xb18a0319, 0x00000026, 0x000007db, 0x9dc0bb48},
7e280e68
DC
812};
813
814static int crc32c_test(void)
815{
816 int i;
817 int errors = 0;
818 int bytes = 0;
819 struct timeval start, stop;
820 uint64_t usec;
821
822 /* keep static to prevent cache warming code from
823 * getting eliminated by the compiler */
824 static u32 crc;
825
826 /* pre-warm the cache */
827 for (i = 0; i < 100; i++) {
828 bytes += 2*test[i].length;
829
830 crc ^= crc32c_le(test[i].crc, test_buf +
831 test[i].start, test[i].length);
832 }
833
834 gettimeofday(&start, NULL);
835 for (i = 0; i < 100; i++) {
836 if (test[i].crc32c_le != crc32c_le(test[i].crc, test_buf +
837 test[i].start, test[i].length))
838 errors++;
839 }
840 gettimeofday(&stop, NULL);
841
842 usec = stop.tv_usec - start.tv_usec +
843 1000000 * (stop.tv_sec - start.tv_sec);
844
845 if (errors)
846 printf("crc32c: %d self tests failed\n", errors);
847 else {
848 printf("crc32c: tests passed, %d bytes in %" PRIu64 " usec\n",
849 bytes, usec);
850 }
851
852 return errors;
853}
854
7e280e68
DC
855/*
856 * make sure we always return 0 for a successful test run, and non-zero for a
857 * failed run. The build infrastructure is looking for this information to
858 * determine whether to allow the build to proceed.
859 */
860int main(int argc, char **argv)
861{
862 int errors;
863
864 printf("CRC_LE_BITS = %d\n", CRC_LE_BITS);
865
b123033a 866 errors = crc32c_test();
7e280e68
DC
867
868 return errors != 0;
869}
870#endif /* CRC32_SELFTEST */