URI:
       tblowfish.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tblowfish.c (19414B)
       ---
            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
           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
           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
          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
          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
          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
          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
          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 };