xref: /plan9/sys/src/cmd/unix/drawterm/libsec/blowfish.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1 #include "os.h"
2 #include <mp.h>
3 #include <libsec.h>
4 
5 // Blowfish block cipher.  See:
6 // 	Lecture Notes in Computer Science 809
7 // 	Fast Software Encryption
8 // 	Cambridge Security Workshop, Cambridge, England (1993)
9 
10 static u32int sbox[1024];
11 static u32int pbox[BFrounds+2];
12 
13 static void bfencrypt(u32int *, BFstate *);
14 static void bfdecrypt(u32int *, BFstate *);
15 
16 void
setupBFstate(BFstate * s,uchar key[],int keybytes,uchar * ivec)17 setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec)
18 {
19 	int i, j;
20 	u32int n, buf[2];
21 
22 	memset(s, 0, sizeof(*s));
23 	memset(buf, 0, sizeof buf);
24 
25 	if (keybytes > sizeof(s->key))
26 		keybytes = sizeof(s->key);
27 
28 	memmove(s->key, key, keybytes);
29 
30 	if (ivec != nil)
31 		memmove(s->ivec, ivec, sizeof(s->ivec));
32 	else
33 		memset(s->ivec, 0, sizeof(s->ivec));
34 
35 	memmove(s->pbox, pbox, sizeof(pbox));
36 	memmove(s->sbox, sbox, sizeof(sbox));
37 
38 	if (keybytes > 4*(BFrounds + 2))
39 		keybytes = 4*(BFrounds + 2);
40 
41 	for(i=j=0; i < BFrounds+2; i++) {
42 		n = key[j];
43 		j = (j+1) % keybytes;
44 
45 		n <<= 8;
46 		n |= key[j];
47 		j = (j+1) % keybytes;
48 
49 		n <<= 8;
50 		n |= key[j];
51 		j = (j+1) % keybytes;
52 
53 		n <<= 8;
54 		n |= key[j];
55 		j = (j+1) % keybytes;
56 
57 		s->pbox[i] ^= n;
58 	}
59 
60 	for(i=0; i < BFrounds+2; i += 2) {
61 		bfencrypt(buf, s);
62 		s->pbox[i] = buf[0];
63 		s->pbox[i+1] = buf[1];
64 	}
65 
66 	for(i=0; i < 1024; i += 2) {
67 		bfencrypt(buf, s);
68 		s->sbox[i] = buf[0];
69 		s->sbox[i+1] = buf[1];
70 	}
71 
72 	s->setup = 0xcafebabe;
73 }
74 
75 void
bfCBCencrypt(uchar * buf,int n,BFstate * s)76 bfCBCencrypt(uchar *buf, int n, BFstate *s)
77 {
78 	int i;
79 	uchar *p;
80 	u32int bo[2], bi[2], b;
81 
82 	assert((n & 7) == 0);
83 
84 	bo[0] =  s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24);
85 	bo[1] =  s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24);
86 
87 	for(i=0; i < n; i += 8, buf += 8) {
88 		bi[0] =  buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24);
89 		bi[1] =  buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24);
90 
91 		bi[0] ^= bo[0];
92 		bi[1] ^= bo[1];
93 
94 		bfencrypt(bi, s);
95 
96 		bo[0] = bi[0];
97 		bo[1] = bi[1];
98 
99 		p = buf;
100 		b = bo[0];
101 		*p++ = b;
102 		b >>= 8;
103 		*p++ = b;
104 		b >>= 8;
105 		*p++ = b;
106 		b >>= 8;
107 		*p++ = b;
108 
109 		b = bo[1];
110 		*p++ = b;
111 		b >>= 8;
112 		*p++ = b;
113 		b >>= 8;
114 		*p++ = b;
115 		b >>= 8;
116 		*p = b;
117 	}
118 
119 	s->ivec[7] = bo[1] >> 24;
120 	s->ivec[6] = bo[1] >> 16;
121 	s->ivec[5] = bo[1] >> 8;
122 	s->ivec[4] = bo[1];
123 
124 	s->ivec[3] = bo[0] >> 24;
125 	s->ivec[2] = bo[0] >> 16;
126 	s->ivec[1] = bo[0] >> 8;
127 	s->ivec[0] = bo[0];
128 
129 	return;
130 }
131 
132 void
bfCBCdecrypt(uchar * buf,int n,BFstate * s)133 bfCBCdecrypt(uchar *buf, int n, BFstate *s)
134 {
135 	int i;
136 	uchar *p;
137 	u32int b, bo[2], bi[2], xr[2];
138 
139 	assert((n & 7) == 0);
140 
141 	bo[0] =  s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24);
142 	bo[1] =  s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24);
143 
144 	for(i=0; i < n; i += 8, buf += 8) {
145 		bi[0] =  buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24);
146 		bi[1] =  buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24);
147 
148 		xr[0] = bi[0];
149 		xr[1] = bi[1];
150 
151 		bfdecrypt(bi, s);
152 
153 		bo[0] ^= bi[0];
154 		bo[1] ^= bi[1];
155 
156 		p = buf;
157 		b = bo[0];
158 		*p++ = b;
159 		b >>= 8;
160 		*p++ = b;
161 		b >>= 8;
162 		*p++ = b;
163 		b >>= 8;
164 		*p++ = b;
165 
166 		b = bo[1];
167 		*p++ = b;
168 		b >>= 8;
169 		*p++ = b;
170 		b >>= 8;
171 		*p++ = b;
172 		b >>= 8;
173 		*p = b;
174 
175 		bo[0] = xr[0];
176 		bo[1] = xr[1];
177 	}
178 
179 	s->ivec[7] = bo[1] >> 24;
180 	s->ivec[6] = bo[1] >> 16;
181 	s->ivec[5] = bo[1] >> 8;
182 	s->ivec[4] = bo[1];
183 
184 	s->ivec[3] = bo[0] >> 24;
185 	s->ivec[2] = bo[0] >> 16;
186 	s->ivec[1] = bo[0] >> 8;
187 	s->ivec[0] = bo[0];
188 
189 	return;
190 }
191 
192 void
bfECBencrypt(uchar * buf,int n,BFstate * s)193 bfECBencrypt(uchar *buf, int n, BFstate *s)
194 {
195 	int i;
196 	u32int b[2];
197 
198 	for(i=0; i < n; i += 8, buf += 8) {
199 		b[0] =  buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24);
200 		b[1] =  buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24);
201 
202 		bfencrypt(b, s);
203 
204 		buf[7] = b[1] >> 24;
205 		buf[6] = b[1] >> 16;
206 		buf[5] = b[1] >> 8;
207 		buf[4] = b[1];
208 
209 		buf[3] = b[0] >> 24;
210 		buf[2] = b[0] >> 16;
211 		buf[1] = b[0] >> 8;
212 		buf[0] = b[0];
213 	}
214 
215 	return;
216 }
217 
218 void
bfECBdecrypt(uchar * buf,int n,BFstate * s)219 bfECBdecrypt(uchar *buf, int n, BFstate *s)
220 {
221 	int i;
222 	u32int b[2];
223 
224 	for(i=0; i < n; i += 8, buf += 8) {
225 		b[0] =  buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24);
226 		b[1] =  buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24);
227 
228 		bfdecrypt(b, s);
229 
230 		buf[7] = b[1] >> 24;
231 		buf[6] = b[1] >> 16;
232 		buf[5] = b[1] >> 8;
233 		buf[4] = b[1];
234 
235 		buf[3] = b[0] >> 24;
236 		buf[2] = b[0] >> 16;
237 		buf[1] = b[0] >> 8;
238 		buf[0] = b[0];
239 	}
240 
241 	return;
242 }
243 
244 static void
bfencrypt(u32int * b,BFstate * s)245 bfencrypt(u32int *b, BFstate *s)
246 {
247 	int i;
248 	u32int l, r;
249 	u32int *pb, *sb;
250 
251 	l = b[0];
252 	r = b[1];
253 
254 	pb = s->pbox;
255 	sb = s->sbox;
256 
257 	l ^= pb[0];
258 
259 	for(i=1; i<16; i += 2) {
260 		r ^= pb[i];
261 		r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^
262 			sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)];
263 
264 		l ^= pb[i+1];
265 		l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^
266 			sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)];
267 	}
268 
269 	r ^= pb[BFrounds+1];
270 
271 	/* sic */
272 	b[0] = r;
273 	b[1] = l;
274 
275 	return;
276 }
277 
278 static void
bfdecrypt(u32int * b,BFstate * s)279 bfdecrypt(u32int *b, BFstate *s)
280 {
281 	int i;
282 	u32int l, r;
283 	u32int *pb, *sb;
284 
285 	l = b[0];
286 	r = b[1];
287 
288 	pb = s->pbox;
289 	sb = s->sbox;
290 
291 	l ^= pb[BFrounds+1];
292 
293 	for(i=16; i > 0; i -= 2) {
294 		r ^= pb[i];
295 		r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^
296 			sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)];
297 
298 		l ^= pb[i-1];
299 		l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^
300 			sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)];
301 	}
302 
303 	r ^= pb[0];
304 
305 	/* sic */
306 	b[0] = r;
307 	b[1] = l;
308 
309 	return;
310 }
311 
312 static u32int pbox[BFrounds+2] = {
313 	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
314 	0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
315 	0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
316 	0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
317 	0x9216d5d9, 0x8979fb1b
318 };
319 
320 static u32int sbox[1024] = {
321 	0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L,
322 	0xb8e1afedL, 0x6a267e96L, 0xba7c9045L, 0xf12c7f99L,
323 	0x24a19947L, 0xb3916cf7L, 0x0801f2e2L, 0x858efc16L,
324 	0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL,
325 	0x0d95748fL, 0x728eb658L, 0x718bcd58L, 0x82154aeeL,
326 	0x7b54a41dL, 0xc25a59b5L, 0x9c30d539L, 0x2af26013L,
327 	0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL,
328 	0x8e79dcb0L, 0x603a180eL, 0x6c9e0e8bL, 0xb01e8a3eL,
329 	0xd71577c1L, 0xbd314b27L, 0x78af2fdaL, 0x55605c60L,
330 	0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L,
331 	0x55ca396aL, 0x2aab10b6L, 0xb4cc5c34L, 0x1141e8ceL,
332 	0xa15486afL, 0x7c72e993L, 0xb3ee1411L, 0x636fbc2aL,
333 	0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL,
334 	0xafd6ba33L, 0x6c24cf5cL, 0x7a325381L, 0x28958677L,
335 	0x3b8f4898L, 0x6b4bb9afL, 0xc4bfe81bL, 0x66282193L,
336 	0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L,
337 	0xef845d5dL, 0xe98575b1L, 0xdc262302L, 0xeb651b88L,
338 	0x23893e81L, 0xd396acc5L, 0x0f6d6ff3L, 0x83f44239L,
339 	0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL,
340 	0x21c66842L, 0xf6e96c9aL, 0x670c9c61L, 0xabd388f0L,
341 	0x6a51a0d2L, 0xd8542f68L, 0x960fa728L, 0xab5133a3L,
342 	0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L,
343 	0xa1f1651dL, 0x39af0176L, 0x66ca593eL, 0x82430e88L,
344 	0x8cee8619L, 0x456f9fb4L, 0x7d84a5c3L, 0x3b8b5ebeL,
345 	0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L,
346 	0x4ed3aa62L, 0x363f7706L, 0x1bfedf72L, 0x429b023dL,
347 	0x37d0d724L, 0xd00a1248L, 0xdb0fead3L, 0x49f1c09bL,
348 	0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L,
349 	0xe3fe501aL, 0xb6794c3bL, 0x976ce0bdL, 0x04c006baL,
350 	0xc1a94fb6L, 0x409f60c4L, 0x5e5c9ec2L, 0x196a2463L,
351 	0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL,
352 	0x6dfc511fL, 0x9b30952cL, 0xcc814544L, 0xaf5ebd09L,
353 	0xbee3d004L, 0xde334afdL, 0x660f2807L, 0x192e4bb3L,
354 	0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL,
355 	0x5579c0bdL, 0x1a60320aL, 0xd6a100c6L, 0x402c7279L,
356 	0x679f25feL, 0xfb1fa3ccL, 0x8ea5e9f8L, 0xdb3222f8L,
357 	0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL,
358 	0x323db5faL, 0xfd238760L, 0x53317b48L, 0x3e00df82L,
359 	0x9e5c57bbL, 0xca6f8ca0L, 0x1a87562eL, 0xdf1769dbL,
360 	0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L,
361 	0x695b27b0L, 0xbbca58c8L, 0xe1ffa35dL, 0xb8f011a0L,
362 	0x10fa3d98L, 0xfd2183b8L, 0x4afcb56cL, 0x2dd1d35bL,
363 	0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L,
364 	0xe1ddf2daL, 0xa4cb7e33L, 0x62fb1341L, 0xcee4c6e8L,
365 	0xef20cadaL, 0x36774c01L, 0xd07e9efeL, 0x2bf11fb4L,
366 	0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L,
367 	0xd08ed1d0L, 0xafc725e0L, 0x8e3c5b2fL, 0x8e7594b7L,
368 	0x8ff6e2fbL, 0xf2122b64L, 0x8888b812L, 0x900df01cL,
369 	0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL,
370 	0x2f2f2218L, 0xbe0e1777L, 0xea752dfeL, 0x8b021fa1L,
371 	0xe5a0cc0fL, 0xb56f74e8L, 0x18acf3d6L, 0xce89e299L,
372 	0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L,
373 	0x165fa266L, 0x80957705L, 0x93cc7314L, 0x211a1477L,
374 	0xe6ad2065L, 0x77b5fa86L, 0xc75442f5L, 0xfb9d35cfL,
375 	0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L,
376 	0x00250e2dL, 0x2071b35eL, 0x226800bbL, 0x57b8e0afL,
377 	0x2464369bL, 0xf009b91eL, 0x5563911dL, 0x59dfa6aaL,
378 	0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L,
379 	0x83260376L, 0x6295cfa9L, 0x11c81968L, 0x4e734a41L,
380 	0xb3472dcaL, 0x7b14a94aL, 0x1b510052L, 0x9a532915L,
381 	0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L,
382 	0x08ba6fb5L, 0x571be91fL, 0xf296ec6bL, 0x2a0dd915L,
383 	0xb6636521L, 0xe7b9f9b6L, 0xff34052eL, 0xc5855664L,
384 	0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL,
385 	0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L,
386 	0xad6ea6b0L, 0x49a7df7dL, 0x9cee60b8L, 0x8fedb266L,
387 	0xecaa8c71L, 0x699a17ffL, 0x5664526cL, 0xc2b19ee1L,
388 	0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL,
389 	0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L,
390 	0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L,
391 	0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL,
392 	0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a70a1L,
393 	0x687f3584L, 0x52a0e286L, 0xb79c5305L, 0xaa500737L,
394 	0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L,
395 	0xb03ada37L, 0xf0500c0dL, 0xf01c1f04L, 0x0200b3ffL,
396 	0xae0cf51aL, 0x3cb574b2L, 0x25837a58L, 0xdc0921bdL,
397 	0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L,
398 	0x3ae5e581L, 0x37c2dadcL, 0xc8b57634L, 0x9af3dda7L,
399 	0xa9446146L, 0x0fd0030eL, 0xecc8c73eL, 0xa4751e41L,
400 	0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L,
401 	0x4e548b38L, 0x4f6db908L, 0x6f420d03L, 0xf60a04bfL,
402 	0x2cb81290L, 0x24977c79L, 0x5679b072L, 0xbcaf89afL,
403 	0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL,
404 	0x5512721fL, 0x2e6b7124L, 0x501adde6L, 0x9f84cd87L,
405 	0x7a584718L, 0x7408da17L, 0xbc9f9abcL, 0xe94b7d8cL,
406 	0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L,
407 	0xef1c1847L, 0x3215d908L, 0xdd433b37L, 0x24c2ba16L,
408 	0x12a14d43L, 0x2a65c451L, 0x50940002L, 0x133ae4ddL,
409 	0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL,
410 	0x043556f1L, 0xd7a3c76bL, 0x3c11183bL, 0x5924a509L,
411 	0xf28fe6edL, 0x97f1fbfaL, 0x9ebabf2cL, 0x1e153c6eL,
412 	0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L,
413 	0x771fe71cL, 0x4e3d06faL, 0x2965dcb9L, 0x99e71d0fL,
414 	0x803e89d6L, 0x5266c825L, 0x2e4cc978L, 0x9c10b36aL,
415 	0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L,
416 	0xf2f74ea7L, 0x361d2b3dL, 0x1939260fL, 0x19c27960L,
417 	0x5223a708L, 0xf71312b6L, 0xebadfe6eL, 0xeac31f66L,
418 	0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L,
419 	0xc332ddefL, 0xbe6c5aa5L, 0x65582185L, 0x68ab9802L,
420 	0xeecea50fL, 0xdb2f953bL, 0x2aef7dadL, 0x5b6e2f84L,
421 	0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L,
422 	0x13cca830L, 0xeb61bd96L, 0x0334fe1eL, 0xaa0363cfL,
423 	0xb5735c90L, 0x4c70a239L, 0xd59e9e0bL, 0xcbaade14L,
424 	0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL,
425 	0x648b1eafL, 0x19bdf0caL, 0xa02369b9L, 0x655abb50L,
426 	0x40685a32L, 0x3c2ab4b3L, 0x319ee9d5L, 0xc021b8f7L,
427 	0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L,
428 	0xf837889aL, 0x97e32d77L, 0x11ed935fL, 0x16681281L,
429 	0x0e358829L, 0xc7e61fd6L, 0x96dedfa1L, 0x7858ba99L,
430 	0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L,
431 	0xcdb30aebL, 0x532e3054L, 0x8fd948e4L, 0x6dbc3128L,
432 	0x58ebf2efL, 0x34c6ffeaL, 0xfe28ed61L, 0xee7c3c73L,
433 	0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L,
434 	0x45eee2b6L, 0xa3aaabeaL, 0xdb6c4f15L, 0xfacb4fd0L,
435 	0xc742f442L, 0xef6abbb5L, 0x654f3b1dL, 0x41cd2105L,
436 	0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L,
437 	0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L,
438 	0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L,
439 	0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L,
440 	0x58428d2aL, 0x0c55f5eaL, 0x1dadf43eL, 0x233f7061L,
441 	0x3372f092L, 0x8d937e41L, 0xd65fecf1L, 0x6c223bdbL,
442 	0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL,
443 	0xa6078084L, 0x19f8509eL, 0xe8efd855L, 0x61d99735L,
444 	0xa969a7aaL, 0xc50c06c2L, 0x5a04abfcL, 0x800bcadcL,
445 	0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L,
446 	0xdb73dbd3L, 0x105588cdL, 0x675fda79L, 0xe3674340L,
447 	0xc5c43465L, 0x713e38d8L, 0x3d28f89eL, 0xf16dff20L,
448 	0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L,
449 	0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L,
450 	0x411520f7L, 0x7602d4f7L, 0xbcf46b2eL, 0xd4a20068L,
451 	0xd4082471L, 0x3320f46aL, 0x43b7d4b7L, 0x500061afL,
452 	0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L,
453 	0x4d95fc1dL, 0x96b591afL, 0x70f4ddd3L, 0x66a02f45L,
454 	0xbfbc09ecL, 0x03bd9785L, 0x7fac6dd0L, 0x31cb8504L,
455 	0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL,
456 	0x28507825L, 0x530429f4L, 0x0a2c86daL, 0xe9b66dfbL,
457 	0x68dc1462L, 0xd7486900L, 0x680ec0a4L, 0x27a18deeL,
458 	0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L,
459 	0xaace1e7cL, 0xd3375fecL, 0xce78a399L, 0x406b2a42L,
460 	0x20fe9e35L, 0xd9f385b9L, 0xee39d7abL, 0x3b124e8bL,
461 	0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L,
462 	0x3a6efa74L, 0xdd5b4332L, 0x6841e7f7L, 0xca7820fbL,
463 	0xfb0af54eL, 0xd8feb397L, 0x454056acL, 0xba489527L,
464 	0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL,
465 	0x55a867bcL, 0xa1159a58L, 0xcca92963L, 0x99e1db33L,
466 	0xa62a4a56L, 0x3f3125f9L, 0x5ef47e1cL, 0x9029317cL,
467 	0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L,
468 	0x95c11548L, 0xe4c66d22L, 0x48c1133fL, 0xc70f86dcL,
469 	0x07f9c9eeL, 0x41041f0fL, 0x404779a4L, 0x5d886e17L,
470 	0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L,
471 	0x257b7834L, 0x602a9c60L, 0xdff8e8a3L, 0x1f636c1bL,
472 	0x0e12b4c2L, 0x02e1329eL, 0xaf664fd1L, 0xcad18115L,
473 	0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L,
474 	0x85b2a20eL, 0xe6ba0d99L, 0xde720c8cL, 0x2da2f728L,
475 	0xd0127845L, 0x95b794fdL, 0x647d0862L, 0xe7ccf5f0L,
476 	0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL,
477 	0x0a476341L, 0x992eff74L, 0x3a6f6eabL, 0xf4f8fd37L,
478 	0xa812dc60L, 0xa1ebddf8L, 0x991be14cL, 0xdb6e6b0dL,
479 	0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L,
480 	0xf1290dc7L, 0xcc00ffa3L, 0xb5390f92L, 0x690fed0bL,
481 	0x667b9ffbL, 0xcedb7d9cL, 0xa091cf0bL, 0xd9155ea3L,
482 	0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL,
483 	0x37392eb3L, 0xcc115979L, 0x8026e297L, 0xf42e312dL,
484 	0x6842ada7L, 0xc66a2b3bL, 0x12754cccL, 0x782ef11cL,
485 	0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L,
486 	0x1a6b1018L, 0x11caedfaL, 0x3d25bdd8L, 0xe2e1c3c9L,
487 	0x44421659L, 0x0a121386L, 0xd90cec6eL, 0xd5abea2aL,
488 	0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL,
489 	0x9dbc8057L, 0xf0f7c086L, 0x60787bf8L, 0x6003604dL,
490 	0xd1fd8346L, 0xf6381fb0L, 0x7745ae04L, 0xd736fcccL,
491 	0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL,
492 	0x77a057beL, 0xbde8ae24L, 0x55464299L, 0xbf582e61L,
493 	0x4e58f48fL, 0xf2ddfda2L, 0xf474ef38L, 0x8789bdc2L,
494 	0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L,
495 	0x7aeb2661L, 0x8b1ddf84L, 0x846a0e79L, 0x915f95e2L,
496 	0x466e598eL, 0x20b45770L, 0x8cd55591L, 0xc902de4cL,
497 	0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL,
498 	0xb77f19b6L, 0xe0a9dc09L, 0x662d09a1L, 0xc4324633L,
499 	0xe85a1f02L, 0x09f0be8cL, 0x4a99a025L, 0x1d6efe10L,
500 	0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L,
501 	0xdcb7da83L, 0x573906feL, 0xa1e2ce9bL, 0x4fcd7f52L,
502 	0x50115e01L, 0xa70683faL, 0xa002b5c4L, 0x0de6d027L,
503 	0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L,
504 	0xf0177a28L, 0xc0f586e0L, 0x006058aaL, 0x30dc7d62L,
505 	0x11e69ed7L, 0x2338ea63L, 0x53c2dd94L, 0xc2c21634L,
506 	0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L,
507 	0x6f05e409L, 0x4b7c0188L, 0x39720a3dL, 0x7c927c24L,
508 	0x86e3725fL, 0x724d9db9L, 0x1ac15bb4L, 0xd39eb8fcL,
509 	0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L,
510 	0x1e50ef5eL, 0xb161e6f8L, 0xa28514d9L, 0x6c51133cL,
511 	0x6fd5c7e7L, 0x56e14ec4L, 0x362abfceL, 0xddc6c837L,
512 	0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L,
513 	0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL,
514 	0x5cb0679eL, 0x4fa33742L, 0xd3822740L, 0x99bc9bbeL,
515 	0xd5118e9dL, 0xbf0f7315L, 0xd62d1c7eL, 0xc700c47bL,
516 	0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L,
517 	0x5748ab2fL, 0xbc946e79L, 0xc6a376d2L, 0x6549c2c8L,
518 	0x530ff8eeL, 0x468dde7dL, 0xd5730a1dL, 0x4cd04dc6L,
519 	0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L,
520 	0xa1fad5f0L, 0x6a2d519aL, 0x63ef8ce2L, 0x9a86ee22L,
521 	0xc089c2b8L, 0x43242ef6L, 0xa51e03aaL, 0x9cf2d0a4L,
522 	0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L,
523 	0x2826a2f9L, 0xa73a3ae1L, 0x4ba99586L, 0xef5562e9L,
524 	0xc72fefd3L, 0xf752f7daL, 0x3f046f69L, 0x77fa0a59L,
525 	0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L,
526 	0xe990fd5aL, 0x9e34d797L, 0x2cf0b7d9L, 0x022b8b51L,
527 	0x96d5ac3aL, 0x017da67dL, 0xd1cf3ed6L, 0x7c7d2d28L,
528 	0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL,
529 	0xe029ac71L, 0xe019a5e6L, 0x47b0acfdL, 0xed93fa9bL,
530 	0xe8d3c48dL, 0x283b57ccL, 0xf8d56629L, 0x79132e28L,
531 	0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL,
532 	0x15056dd4L, 0x88f46dbaL, 0x03a16125L, 0x0564f0bdL,
533 	0xc3eb9e15L, 0x3c9057a2L, 0x97271aecL, 0xa93a072aL,
534 	0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L,
535 	0x7533d928L, 0xb155fdf5L, 0x03563482L, 0x8aba3cbbL,
536 	0x28517711L, 0xc20ad9f8L, 0xabcc5167L, 0xccad925fL,
537 	0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L,
538 	0xea7a90c2L, 0xfb3e7bceL, 0x5121ce64L, 0x774fbe32L,
539 	0xa8b6e37eL, 0xc3293d46L, 0x48de5369L, 0x6413e680L,
540 	0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L,
541 	0xb39a460aL, 0x6445c0ddL, 0x586cdecfL, 0x1c20c8aeL,
542 	0x5bbef7ddL, 0x1b588d40L, 0xccd2017fL, 0x6bb4e3bbL,
543 	0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L,
544 	0x72eacea8L, 0xfa6484bbL, 0x8d6612aeL, 0xbf3c6f47L,
545 	0xd29be463L, 0x542f5d9eL, 0xaec2771bL, 0xf64e6370L,
546 	0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL,
547 	0x4040cb08L, 0x4eb4e2ccL, 0x34d2466aL, 0x0115af84L,
548 	0xe1b00428L, 0x95983a1dL, 0x06b89fb4L, 0xce6ea048L,
549 	0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L,
550 	0x611560b1L, 0xe7933fdcL, 0xbb3a792bL, 0x344525bdL,
551 	0xa08839e1L, 0x51ce794bL, 0x2f32c9b7L, 0xa01fbac9L,
552 	0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L,
553 	0x1a908749L, 0xd44fbd9aL, 0xd0dadecbL, 0xd50ada38L,
554 	0x0339c32aL, 0xc6913667L, 0x8df9317cL, 0xe0b12b4fL,
555 	0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL,
556 	0xbf97222cL, 0x15e6fc2aL, 0x0f91fc71L, 0x9b941525L,
557 	0xfae59361L, 0xceb69cebL, 0xc2a86459L, 0x12baa8d1L,
558 	0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L,
559 	0xe0ec6e0eL, 0x1698db3bL, 0x4c98a0beL, 0x3278e964L,
560 	0x9f1f9532L, 0xe0d392dfL, 0xd3a0342bL, 0x8971f21eL,
561 	0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L,
562 	0xdf359f8dL, 0x9b992f2eL, 0xe60b6f47L, 0x0fe3f11dL,
563 	0xe54cda54L, 0x1edad891L, 0xce6279cfL, 0xcd3e7e6fL,
564 	0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L,
565 	0xf523f357L, 0xa6327623L, 0x93a83531L, 0x56cccd02L,
566 	0xacf08162L, 0x5a75ebb5L, 0x6e163697L, 0x88d273ccL,
567 	0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L,
568 	0xe6c6c7bdL, 0x327a140aL, 0x45e1d006L, 0xc3f27b9aL,
569 	0xc9aa53fdL, 0x62a80f00L, 0xbb25bfe2L, 0x35bdd2f6L,
570 	0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL,
571 	0x53113ec0L, 0x1640e3d3L, 0x38abbd60L, 0x2547adf0L,
572 	0xba38209cL, 0xf746ce76L, 0x77afa1c5L, 0x20756060L,
573 	0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL,
574 	0x1948c25cL, 0x02fb8a8cL, 0x01c36ae4L, 0xd6ebe1f9L,
575 	0x90d4f869L, 0xa65cdea0L, 0x3f09252dL, 0xc208e69fL,
576 	0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L,
577 };
578 
579 
580