/* BLOWFISH II : 128-bit block (like AES) 64 rounds */ /* by Alexander PUKALL 2005 */ /* Code free for all, even for commercial software */ /* key up to 4224 bits */ /* compile with gcc : gcc blowfish2.c -o blowfish2 */ /* BLOWFISH II : 128-bit block (like AES) 64 rounds blowfish2.c: C implementation of the Blowfish II algorithm. Blowfish 1 Copyright (C) 1997 by Paul Kocher. Blowfish II 128-bit block 2005 by Alexander Pukall COMMENTS ON USING THIS CODE: Normal usage is as follows: [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.) [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to the key, and the number of bytes in the key. [3] To encrypt a 128-bit block, call Blowfish_Encrypt with a pointer to BLOWFISH_CTX, a pointer to the 64-bit left half of the plaintext and a pointer to the 64-bit right half. The plaintext will be overwritten with the ciphertext. [4] Decryption is the same as encryption except that the plaintext and ciphertext are reversed. Warning #1: The code does not check key lengths. (Caveat encryptor.) Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab". Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before freeing it. Warning #4: Endianness conversions are the responsibility of the caller. (To encrypt bytes on a little-endian platforms, you'll probably want to swap bytes around instead of just casting.) Warning #5: Make sure to use a reasonable mode of operation for your application. (If you don't know what CBC mode is, see Warning #7.) Warning #6: This code is susceptible to timing attacks. Warning #7: Security engineering is risky and non-intuitive. Have someone check your work. If you don't know what you are doing, get help. This is code is fast enough for most applications, but is not optimized for speed. Modifications by Alexander Pukall: N = 64 rounds ORIG_P[64+2] = generated from Pi ORIG_S[8][256] = generated from Pi Modifications to use uint64_t for L and R The original Blowfish algorithm supports key sizes up to 576 bits because the ORIG_P[16+2] is 576 bits long (18*32 bits = 576) Blowfish II supports key sizes up to 4224 bits because ORIG_P[64+2] is 4224 bits long (66*64 bits = 4224). */ #include #include typedef struct { uint64_t P[64 + 2]; uint64_t S[8][256]; } BLOWFISH_CTX; void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen); void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uint64_t *xl, uint64_t *xr); void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uint64_t *xl, uint64_t *xr); #define N 64 static const uint64_t ORIG_P[64 + 2] = { 0x243F6A8885A308D3,0x13198A2E03707344,0xA4093822299F31D0, 0x082EFA98EC4E6C89,0x452821E638D01377,0xBE5466CF34E90C6C, 0xC0AC29B7C97C50DD,0x3F84D5B5B5470917,0x9216D5D98979FB1B, 0xD1310BA698DFB5AC,0x2FFD72DBD01ADFB7,0xB8E1AFED6A267E96, 0xBA7C9045F12C7F99,0x24A19947B3916CF7,0x0801F2E2858EFC16, 0x636920D871574E69,0xA458FEA3F4933D7E,0x0D95748F728EB658, 0x718BCD5882154AEE,0x7B54A41DC25A59B5,0x9C30D5392AF26013, 0xC5D1B023286085F0,0xCA417918B8DB38EF,0x8E79DCB0603A180E, 0x6C9E0E8BB01E8A3E,0xD71577C1BD314B27,0x78AF2FDA55605C60, 0xE65525F3AA55AB94,0x5748986263E81440,0x55CA396A2AAB10B6, 0xB4CC5C341141E8CE,0xA15486AF7C72E993,0xB3EE1411636FBC2A, 0x2BA9C55D741831F6,0xCE5C3E169B87931E,0xAFD6BA336C24CF5C, 0x7A32538128958677,0x3B8F48986B4BB9AF,0xC4BFE81B66282193, 0x61D809CCFB21A991,0x487CAC605DEC8032,0xEF845D5DE98575B1, 0xDC262302EB651B88,0x23893E81D396ACC5,0x0F6D6FF383F44239, 0x2E0B4482A4842004,0x69C8F04A9E1F9B5E,0x21C66842F6E96C9A, 0x670C9C61ABD388F0,0x6A51A0D2D8542F68,0x960FA728AB5133A3, 0x6EEF0B6C137A3BE4,0xBA3BF0507EFB2A98,0xA1F1651D39AF0176, 0x66CA593E82430E88,0x8CEE8619456F9FB4,0x7D84A5C33B8B5EBE, 0xE06F75D885C12073,0x401A449F56C16AA6,0x4ED3AA62363F7706, 0x1BFEDF72429B023D,0x37D0D724D00A1248,0xDB0FEAD349F1C09B, 0x075372C980991B7B,0x25D479D8F6E8DEF7,0xE3FE501AB6794C3B }; static const uint64_t ORIG_S[8][256] = { { 0x976CE0BD04C006BA,0xC1A94FB6409F60C4,0x5E5C9EC2196A2463, 0x68FB6FAF3E6C53B5,0x1339B2EB3B52EC6F,0x6DFC511F9B30952C, 0xCC814544AF5EBD09,0xBEE3D004DE334AFD,0x660F2807192E4BB3, 0xC0CBA85745C8740F,0xD20B5F39B9D3FBDB,0x5579C0BD1A60320A, 0xD6A100C6402C7279,0x679F25FEFB1FA3CC,0x8EA5E9F8DB3222F8, 0x3C7516DFFD616B15,0x2F501EC8AD0552AB,0x323DB5FAFD238760, 0x53317B483E00DF82,0x9E5C57BBCA6F8CA0,0x1A87562EDF1769DB, 0xD542A8F6287EFFC3,0xAC6732C68C4F5573,0x695B27B0BBCA58C8, 0xE1FFA35DB8F011A0,0x10FA3D98FD2183B8,0x4AFCB56C2DD1D35B, 0x9A53E479B6F84565,0xD28E49BC4BFB9790,0xE1DDF2DAA4CB7E33, 0x62FB1341CEE4C6E8,0xEF20CADA36774C01,0xD07E9EFE2BF11FB4, 0x95DBDA4DAE909198,0xEAAD8E716B93D5A0,0xD08ED1D0AFC725E0, 0x8E3C5B2F8E7594B7,0x8FF6E2FBF2122B64,0x8888B812900DF01C, 0x4FAD5EA0688FC31C,0xD1CFF191B3A8C1AD,0x2F2F2218BE0E1777, 0xEA752DFE8B021FA1,0xE5A0CC0FB56F74E8,0x18ACF3D6CE89E299, 0xB4A84FE0FD13E0B7,0x7CC43B81D2ADA8D9,0x165FA26680957705, 0x93CC7314211A1477,0xE6AD206577B5FA86,0xC75442F5FB9D35CF, 0xEBCDAF0C7B3E89A0,0xD6411BD3AE1E7E49,0x00250E2D2071B35E, 0x226800BB57B8E0AF,0x2464369BF009B91E,0x5563911D59DFA6AA, 0x78C14389D95A537F,0x207D5BA202E5B9C5,0x832603766295CFA9, 0x11C819684E734A41,0xB3472DCA7B14A94A,0x1B5100529A532915, 0xD60F573FBC9BC6E4,0x2B60A47681E67400,0x08BA6FB5571BE91F, 0xF296EC6B2A0DD915,0xB6636521E7B9F9B6,0xFF34052EC5855664, 0x53B02D5DA99F8FA1,0x08BA47996E85076A,0x4B7A70E9B5B32944, 0xDB75092EC4192623,0xAD6EA6B049A7DF7D,0x9CEE60B88FEDB266, 0xECAA8C71699A18FF,0x5664526CC2B19EE1,0x193602A575094C29, 0xA0591340E4183A3E,0x3F54989A5B429D65,0x6B8FE4D699F73FD6, 0xA1D29C07EFE830F5,0x4D2D38E6F0255DC1,0x4CDD20868470EB26, 0x6382E9C6021ECC5E,0x09686B3F3EBAEFC9,0x3C9718146B6A70A1, 0x687F358452A0E286,0xB79C5305AA500737,0x3E07841C7FDEAE5C, 0x8E7D44EC5716F2B8,0xB03ADA37F0500C0D,0xF01C1F040200B3FF, 0xAE0CF51A3CB574B2,0x25837A58DC0921BD,0xD19113F97CA92FF6, 0x9432477322F54701,0x3AE5E58137C2DADC,0xC8B576349AF3DDA7, 0xA94461460FD0030E,0xECC8C73EA4751E41,0xE238CD993BEA0E2F, 0x3280BBA1183EB331,0x4E548B384F6DB908,0x6F420D03F60A04BF, 0x2CB8129024977C79,0x5679B072BCAF89AF,0xDE9A771FD9930810, 0xB38BAE12DCCF3F2E,0x5512721F2E6B7124,0x501ADDE69F84CD87, 0x7A5847187408DA17,0xBC9F9ABCE94B7D8C,0xEC7AEC3ADB851DFA, 0x63094366C464C3D2,0xEF1C18473215D808,0xDD433B3724C2BA16, 0x12A14D432A65C451,0x50940002133AE4DD,0x71DFF89E10314E55, 0x81AC77D65F11199B,0x043556F1D7A3C76B,0x3C11183B5924A509, 0xF28FE6ED97F1FBFA,0x9EBABF2C1E153C6E,0x86E34570EAE96FB1, 0x860E5E0A5A3E2AB3,0x771FE71C4E3D06FA,0x2965DCB999E71D0F, 0x803E89D65266C825,0x2E4CC9789C10B36A,0xC6150EBA94E2EA78, 0xA6FC3C531E0A2DF4,0xF2F74EA7361D2B3D,0x1939260F19C27960, 0x5223A708F71312B6,0xEBADFE6EEAC31F66,0xE3BC4595A67BC883, 0xB17F37D1018CFF28,0xC332DDEFBE6C5AA5,0x6558218568AB9702, 0xEECEA50FDB2F953B,0x2AEF7DAD5B6E2F84,0x1521B62829076170, 0xECDD4775619F1510,0x13CCA830EB61BD96,0x0334FE1EAA0363CF, 0xB5735C904C70A239,0xD59E9E0BCBAADE14,0xEECC86BC60622CA7, 0x9CAB5CABB2F3846E,0x648B1EAF19BDF0CA,0xA02369B9655ABB50, 0x40685A323C2AB4B3,0x319EE9D5C021B8F7,0x9B540B19875FA099, 0x95F7997E623D7DA8,0xF837889A97E32D77,0x11ED935F16681281, 0x0E358829C7E61FD6,0x96DEDFA17858BA99,0x57F584A51B227263, 0x9B83C3FF1AC24696,0xCDB30AEB532E3054,0x8FD948E46DBC3128, 0x58EBF2EF34C6FFEA,0xFE28ED61EE7C3C73,0x5D4A14D9E864B7E3, 0x42105D14203E13E0,0x45EEE2B6A3AAABEA,0xDB6C4F15FACB4FD0, 0xC742F442EF6ABBB5,0x654F3B1D41CD2105,0xD81E799E86854DC7, 0xE44B476A3D816250,0xCF62A1F25B8D2646,0xFC8883A0C1C7B6A3, 0x7F1524C369CB7492,0x47848A0B5692B285,0x095BBF00AD19489D, 0x1462B17423820D00,0x58428D2A0C55F5EA,0x1DADF43E233F7061, 0x3372F0928D937E41,0xD65FECF16C223BDB,0x7CDE3759CBEE7460, 0x4085F2A7CE77326E,0xA607808419F8509E,0xE8EFD85561D99735, 0xA969A7AAC50C06C2,0x5A04ABFC800BCADC,0x9E447A2EC3453484, 0xFDD567050E1E9EC9,0xDB73DBD3105588CD,0x675FDA79E3674340, 0xC5C43465713E38D8,0x3D28F89EF16DFF20,0x153E21E78FB03D4A, 0xE6E39F2BDB83ADF7,0xE93D5A68948140F7,0xF64C261C94692934, 0x411520F77602D4F7,0xBCF46B2ED4A10068,0xD40824713320F46A, 0x43B7D4B7500061AF,0x1E39F62E97244546,0x14214F74BF8B8840, 0x4D95FC1D96B591AF,0x70F4DDD366A02F45,0xBFBC09EC03BD9785, 0x7FAC6DD031CB8504,0x96EB27B355FD3941,0xDA2547E6ABCA0A9A, 0x28507825530429F4,0x0A2C86DAE9B66DFB,0x68DC1462D7486900, 0x680EC0A427A18DEE,0x4F3FFEA2E887AD8C,0xB58CE0067AF4D6B6, 0xAACE1E7CD3375FEC,0xCE78A399406B2A42,0x20FE9E35D9F385B9, 0xEE39D7AB3B124E8B,0x1DC9FAF74B6D1856,0x26A36631EAE397B2, 0x3A6EFA74DD5B4332,0x6841E7F7CA7820FB,0xFB0AF54ED8FEB397, 0x454056ACBA489527,0x55533A3A20838D87,0xFE6BA9B7D096954B, 0x55A867BCA1159A58,0xCCA9296399E1DB33,0xA62A4A563F3125F9, 0x5EF47E1C9029317C,0xFDF8E80204272F70,0x80BB155C05282CE3, 0x95C11548E4C66D22,0x48C1133FC70F86DC,0x07F9C9EE41041F0F, 0x404779A45D886E17,0x325F51EBD59BC0D1,0xF2BCC18F41113564, 0x257B7834602A9C60,0xDFF8E8A31F636C1B,0x0E12B4C202E1329E, 0xAF664FD1CAD18115,0x6B2395E0333E92E1,0x3B240B62EEBEB922, 0x85B2A20EE6BA0D99,0xDE720C8C2DA2F728,0xD012784595B794FD, 0x647D0862E7CCF5F0,0x5449A36F877D48FA,0xC39DFD27F33E8D1E, 0x0A476341992EFF74}, { 0x3A6F6EABF4F8FD37,0xA812DC60A1EBDDF8,0x991BE14CDB6E6B0D, 0xC67B55106D672C37,0x2765D43BDCD0E804,0xF1290DC7CC00FFA3, 0xB5390F92690FED0B,0x667BA0FBCEDB7D9C,0xA091CF0BD9155EA3, 0xBB132F88515BAD24,0x7B9479BF763BD6EB,0x37392EB3CC115979, 0x8026E297F42E312D,0x6842ADA7C66A2B3B,0x12754CCC782EF11C, 0x6A124237B79251E7,0x06A1BBE64BFB6350,0x1A6B101811CAEDFA, 0x3D25BDD8E2E1C3C9,0x444216590A121386,0xD90CEC6ED5ABEA2A, 0x64AF674EDA86A85F,0xBEBFE98864E4C3FE,0x9DBC8057F0F7C086, 0x60787BF86003604D,0xD1FD8346F6381FB0,0x7745AE04D736FCCC, 0x83426B33F01EAB71,0xB08041873B005E5F,0x77A057BEBDE8AE24, 0x55464299BF582E61,0x4E58F48FF2DDFDA2,0xF474EF388789BDC2, 0x5366F9C3C8B38E74,0xB475F25546FCD9B9,0x7AEB26618B1DDF84, 0x846A0E79915F95E2,0x466E598E20B45770,0x8CD55591C802DE4C, 0xB90BACE1BB8205D0,0x11A862487574A99E,0xB77F19B6E0A9DC09, 0x662D09A1C4324633,0xE85A1F0209F0BE8C,0x4A99A0251D6EFE10, 0x1AB93D1D0BA5A4DF,0xA186F20F2868F169,0xDCB7DA83573906FE, 0xA1E2CE9B4FCD7F52,0x50115E01A70683FA,0xA002B5C40DE6D027, 0x9AF88C27773F8641,0xC3604C0661A806B5,0xF0177A28C0F586E0, 0x006058AA30DC7D62,0x11E69ED72338EA63,0x53C2DD94C2C21634, 0xBBCBEE5690BCB6DE,0xEBFC7DA1CE591D76,0x6F05E4094B7C0188, 0x39720A3D7C927C24,0x86E3725F724D9DB9,0x1AC15BB4D39EB8FC, 0xED54557808FCA5B5,0xD83D7CD34DAD0FC4,0x1E50EF5EB161E6F8, 0xA28514D96C51133C,0x6FD5C7E756E14EC4,0x362ABFCEDDC6C837, 0xD79A323492638212,0x670EFA8E406000E0,0x3A39CE37D3FBF5CF, 0xABC277375AC52D1B,0x5CB0679E4FA33742,0xD382274099BC9BBE, 0xD5118E9DBF0F7315,0xD62D1C7EC700C47B,0xB78C1B6B21A19045, 0xB26EB1BE6A366EB4,0x5748AB2FBC946E79,0xC6A376D26549C2C8, 0x530FF8EE468DDE7D,0xD5730A1D4CD04DC6,0x2939BBDBA9BA4650, 0xAC9526E8BE5EE304,0xA1FAD5F06A2D519A,0x63EF8CE29A86EE22, 0xC089C2B843242EF6,0xA51E03AA9CF2D0A4,0x83C061BA9BE96A4D, 0x8FE51550BA645BD6,0x2826A2F9A73A3AE1,0x4BA99586EF5562E9, 0xC72FEFD3F752F7DA,0x3F046F6977FA0A59,0x80E4A91587B08601, 0x9B09E6AD3B3EE593,0xE990FD5A9E34D797,0x2CF0B7D9022B8B51, 0x96D5AC3A017DA67D,0xD1CF3ED67C7D2D28,0x1F9F25CFADF2B89B, 0x5AD6B4725A88F54C,0xE029AC71E019A5E6,0x47B0ACFDED93FA9B, 0xE8D3C48D283B57CC,0xF8D5662979132E28,0x785F0191ED756055, 0xF7960E44E3D35E8C,0x15056DD488F46DBA,0x03A161250564F0BD, 0xC3EB9E153C9057A2,0x97271AECA93A072A,0x1B3F6D9B1E6321F5, 0xF59C66FB26DCF319,0x7533D928B155FDF5,0x035634828ABA3CBB, 0x28517711C20AD9F8,0xABCC5167CCAD925F,0x4DE817513830DC8E, 0x379D58629320F991,0xEA7A90C2FB3E7BCE,0x5121CE64774FBE32, 0xA8B6E37EC3293D46,0x48DE53696413E680,0xA2AE0810DD6DB224, 0x69852DFD09072166,0xB39A460A6445C0DD,0x586CDECF1C20C8AE, 0x5BBEF7DD1B588D40,0xCCD2017F6BB4E3BB,0xDDA26A7E3A5AFF45, 0x3E350A44BCB4CDD5,0x72EACEA8FA6484BB,0x8D6612AEBF3C6F47, 0xD29BE463542F5D9E,0xAEC2771BF64E6370,0x740E0D8DE75B1358, 0xF8721671AF537D5D,0x4040CB084EB4E2CC,0x34D2466A0115AF84, 0xE1B0042895983A1D,0x06B89FB4CE6EA048,0x6F3F3B823520AB82, 0x011A1D4B277228F8,0x611560B1E7933FDC,0xBB3A792B344525BD, 0xA08839E151CE794B,0x2F32C9B7A01FBAC9,0xE01CC87EBCC7D1F6, 0xCF0111C3A1E8AAC7,0x1A908749D44FBD9A,0xD0DADECBD50ADA37, 0x0339C32AC6913667,0x8DF9317CE0B12B4F,0xF79E59B743F5BB3A, 0xF2D519FF27D9459C,0xBF97222C15E6FC2A,0x0F91FC719B941525, 0xFAE59361CEB69CEB,0xC2A8645912BAA8D1,0xB6C1075EE3056A0C, 0x10D25065CB03A442,0xE0EC6E0E1698DB3B,0x4C98A0BE3278E964, 0x9F1F9532E0D392DF,0xD3A0342B8971F21E,0x1B0A74414BA3348C, 0xC5BE7120C37632D8,0xDF359F8D9B992F2E,0xE60B6F470FE3F11D, 0xE54CDA541EDAD891,0xCE6279CFCD3E7E6F,0x1618B166FD2C1D05, 0x848FD2C5F6FB2299,0xF523F357A6327623,0x93A8353156CCCD02, 0xACF081625A75EBB5,0x6E16369788D273CC,0xDE96629281B949D0, 0x4C50901B71C65614,0xE6C6C7BD327A140A,0x45E1D006C3F27B9A, 0xC9AA53FD62A80F00,0xBB25BFE235BDD2F6,0x71126905B2040222, 0xB6CBCF7CCD769C2B,0x53113EC01640E3D3,0x38ABBD602547ADF0, 0xBA38209CF746CE76,0x77AFA1C520756060,0x85CBFE4E8AE88DD8, 0x7AAAF9B04CF9AA7E,0x1948C25C03FB8A8C,0x01C36AE4D6EBE2F9, 0x90D4F869A65CDEA0,0x3F09252DC208E69F,0xB74E6132CE77E25B, 0x578FDFE33AC372E6,0xB83ACB022002397A,0x6EC6FB5BFFCFD4DD, 0x4CBF5ED1F43FE582,0x3EF4E8232D152AF0,0xE718C97059BD9820, 0x1F4A9D62E7A529BA,0x89E1248D3BF88656,0xC5114D0EBC4CEE16, 0x034D8A3920E47882,0xE9AE8FBDE3ABDC1F,0x6DA51E525DB2BAE1, 0x01F86E7A6D9C68A9,0x2708FCD9293CBC0C,0xB03C87F8A8AD2C2F, 0x00424EEBCACB452D,0x89CC71FCD59C7F91,0x7F0622BC6D8A08B1, 0x834D21326884CA82,0xE3AACBF37786F2FA,0x2CAB6E3DCE535AD1, 0xF20AC607C6B8E14F,0x5EB4388E775014A6,0x656665F7B64A43E4, 0xBA383D01B2E41079,0x8EB2986F909E0CA4,0x1F7B37772C126030, 0x85088718C4E7D1BD,0x4065FFCE8392FD8A,0xAA36D12BB4C8C9D0, 0x994FB0B714F96818,0xF9A53998A0A178C6,0x2684A81E8AE972F6, 0xB8425EB67A29D486,0x551BD719AF32C189,0xD5145505DC81D53E, 0x48424EDAB796EF46,0xA0498F03667DEEDE,0x03AC0AB3C497733D, 0x5316A89130A88FCC,0x9604440ACEEB893A,0x7725B82B0E1EF69D, 0x302A5C8EE7B84DEF,0x5A31B096C9EBF88D,0x512D788E7E4002EE, 0x87E02AF6C358A1BB,0x02E8D7AFDF9FB0E7,0x790E942A3B3C1ABA, 0xC6FFA7AF9DF796F9,0x321BB9940174A8A8,0xED22162CCFF1BB99, 0xDAA8D551A4D5E44B,0xECDDE3ECA80DC509,0x0393EEF272523D31, 0xD48E3A1C224EB65E,0x6052C3A42109C32F,0x052EE388ED9F7EA9, 0x91C62F9777B55BA0}, { 0x150CBCA33AEC6525,0xDF31838343A9CE26,0x9362AD8B0134140B, 0x8DF5CF811E9FF559,0x167F05643812F4E0,0x588A52B0CBB8E944, 0xEF5B16A373C4EDA1,0x7DFCFEEAF54BCBBE,0x8773E3D2C531DCD0, 0x55C4672952774F3A,0x57CA6BC0467D3A3B,0x24778425B7991E9A, 0xDD825C26E452C8EE,0xFCACDE1E84833AF3,0x61211D031732C131, 0xCCADB247E606BE8C,0x712B39F188B4EF39,0x3A9FCDC5C5755169, 0x1FF6994F39829CB0,0x110165733343CBEB,0x61D3D0B444F30AEF, 0xA8AE73752A3A1C9D,0xB4B70914D6AB250C,0x853B7328495F948F, 0xD2A4ED8E6CF751E4,0xC320BB75D9CAA0B3,0x8BA562624E84B03F, 0xEEA8076E74A07FE5,0x8039E00C36FFDAF8,0x03731358B9E671B9, 0xDAC4CE1CB25B10ED,0x4DD3D5B1FCF2B480,0x4634F57925EAC400, 0xA9AC55EA728932DF,0x06041D055D31F502,0xC539C2E32B89D9DB, 0x5BCC0A98C05BFD6F,0x1B2506222E21BE0E,0x60973B04ECD54A67, 0xB54FE638A6ED6615,0x981A910A5D92928D,0xAC6FC697E73C63AD, 0x456EDF5F457A8145,0x51875A64CD3099F1,0x69B5F18A8C73EE0B, 0x5E57368F6C7AF4BB,0x7A595926AAB49EC6,0x8AC8FCFB8016CBDB, 0x8BBC1F476982C711,0x85C7DA7A58811477,0xCD67FAD1D764D9B4, 0xC81029505CD09DA5,0x1BB1F14795167D80,0x0366046DAF1DACA1, 0xA2247B2311301A54,0x791D99C67A4FB7CF,0x277449A409E57492, 0x35C9A57E5E7F500A,0xB9A62A8AD5242A6B,0xA13378599CDA3346, 0x148740474328BA08,0xEB81D51F3248896A,0x8007D85D0F6E8DDA, 0x8250BDAFCE2EE042,0x897EE0225F003612,0x3BA18F9026314076, 0x7824035A3B57E2D5,0x8E78AED1E90DC600,0x90C15EA624609519, 0xB72EC3F8663DDCEF,0xEF574232194195B6,0x20C9203FF993700E, 0xC1A44A7CBAEDE941,0xF98AD4C4F8F43F26,0xF060DD080EB9DF1D, 0x9B33618855EEB734,0x6C56D0D433A0D6E4,0x182885B21DAFB611, 0xF04D46F750CDCB91,0x407B4733D7A2B343,0x0269AC52B520773C, 0x8C910B9F7680E5F6,0xC79AD874FD97CFE6,0xDEB78FB3279EE2A1, 0x7428670533645AA5,0x554438084F1FC8DC,0x116CC402D4F14617, 0x6183CD9EE11D5B9E,0x195D2523EF2F8E07,0xD836767C44811938, 0xAD366C9FDAB0065B,0x2C5BD6F663F7D10E,0x79104BD1D7C3E497, 0x432DD056932F8F20,0x878025A708E90347,0xCDAC2120753A3201, 0x9C6BE2FD03F7B32B,0x0AB85150D75A8F1E,0x8FBF70ECE0C67DF9, 0x71F250E41ABB9BF0,0x3F17F108EDBFDC76,0x37DCD54A48CCE570, 0x8011BB358BC70BFB,0x8194F91BD0816B10,0x5B3FE6415C6C5D42, 0x39D03AD66881CC3B,0x95ED2BBA9B2DF677,0x7DB8057E0E1A306A, 0x9C73B22B0F6FAE4C,0x1477324E85041C8A,0x31F1B31CB03F5338, 0x3A3E70F003BDA3D7,0x21507C16990FC0DC,0xEC48EB1B6E5AA777, 0x9DC7E5750C9490FC,0xE8B70BB69C2462DE,0x58F9D6E286C90D9E, 0x393954BDB5F2A4FD,0xA1CAD7C66DEDFC47,0x4664D28514E21038, 0xA34AE5A60CC88295,0x26D74884885A7DAA,0xAB0E25AAE328DACF, 0x3D75CA5C9315B071,0xA8F86A7A869A2A3B,0x73C244966E32834B, 0x247DEE3AB3A3E118,0x0E3E864B85639D62,0x88B3363FB3A767E5, 0x4B847B5E39540816,0x7538DE9741B0D6D8,0xED77D7107636B96C, 0xF57D4C5B2066FFB3,0x17877F49FF0478D2,0x759AF12C0E64DCF8, 0x547B59F127BCEC3D,0x18CE85B88418FE15,0xF07CF6B4A5827EC1, 0xED2893DE8A5FE68B,0x4E112D7347572CCB,0xAF86678002E62D57, 0xE2994ED7B1C7EBA4,0x01AAD3603470F655,0x8F1BB1A1E9FC7E99, 0x995672B0A2FA5702,0x15B4DE2A4F23088C,0xF2F97EC938568716, 0x61A4FFCCF419CF11,0xCCFACBCEBBCA28E3,0x784DD43E1150DEE3, 0xBC060BA08223C3D9,0x4BDA38C78D9A7575,0x4C007EC0AB58EFBB, 0x5CC287D0F064EA5C,0x85C0368AAF2AD213,0x0EAAC3CDCE740241, 0xFB003622BFAA4ABB,0x583B589762A96A1A,0xD06C7F57FF53F144, 0xDD67F044D1C28282,0x8BDA0388548D04D4,0x4E4DAB2DB00734EE, 0xD46E84086EFCE2BD,0x39C9FB1B50898815,0xC67E79C49FDEDF05, 0x10DA0B2AF8B32839,0x06C91AF07F24F3BC,0xFB10760CB49F0850, 0xD2CC97D8EC63395B,0x9DB31D42A7CEC064,0xF90E398D479ACAB7, 0x07BE140A28F3754D,0x728C72A3F53F82D5,0xBDEFD866BF22F70B, 0x655E9A03A6F11D63,0x4A7132F693E833A5,0x5E9274B4015F4E35, 0x6A59DCDD9D1E85EF,0x137D430AA6BE0B0F,0x12A13EA30191692D, 0x91A1E7691CC2852D,0xAEE7300FDAF3860E,0x408AC32A6A50C876, 0x996E523B8C04F81B,0x417F8595AA4CC582,0xFCB3B8E23C2156FC, 0xCD71AECD32A95C70,0x7924389BD1047541,0x9516C77F3DF7F5A6, 0xB1384D6FCB22F10B,0xBC73CA3B1EC4F4F4,0xB9DEE7FB93A467F7, 0xD638221089A1405C,0xFD2FB6A54BC618B6,0x96F3BB267289FE18, 0xEB855796F09854D1,0xDC9E8AFCAF106FDB,0xF5A238571B1815CA, 0x0A6F7CB51513353F,0x8AC43941D1600967,0xBA7A830ACD6CE82C, 0x29AB1461C4BE5ECF,0xBF756728EE1651D2,0x8351FEF2D9A56503, 0x1160D3CCB0767848,0x82FA32727DC7523B,0x409D85E9F46167C9, 0xEF335BFEDE10E539,0x360295CD5E0F347A,0x9DC0DA0142AC93FC, 0x32C3BEC9171678B9,0x4C78A82B7C2C748F,0x3828095E064D62C9, 0xF49CB2BE9C9F0126,0x321485CB4773E463,0x0E24D3491B7D32E8, 0x5D15EE76A962F764,0xDEB15D4574DB8D32,0x099610F3B3BD25A7, 0x8A4A1E30E3A7F974,0x11B6004CDA44BF5E,0x9848711F5104ADE1, 0x4A3B2AC8CF048420,0x2F073250BE5F1DCC,0x59F58B34F5410B4B, 0x172EDC27C8B798C9,0xE7FBA7BEE8131C63,0x3DA9D7944FA593B6, 0x684A0C6BEA248658,0x6A33F10A3A76F7C9,0x490BCC010090EDAC, 0x643FE36AA33A5490,0xA3D5F8B48CF3FCE6,0xF53EF83439DC6EED, 0xCB7A2AD77357022B,0xBDA4E4538DB6C313,0x88DF6453A5E9EA24, 0x5DC52D198ABE6869,0x6BDB8D96E21B92AB,0x8C3DB835FFCEDFCA, 0xAE947E3B49A2B4BD,0x298CCC36A3D7193B,0x922D5A7ED0C5161D, 0xE4CD940BE06728C4,0xEF5CB80D23E73708,0x29C4FD6F93F61230, 0x4E30CF0507C74C09,0xC04C1B3D943D5EC6,0x03E1291945FDD157, 0x11348FB5CB36DBA1,0xC5FE692324A33B0E,0x499425F2FA87319C, 0x587D2E1DE3BF7A76,0x3D1A1D39600D94E4,0x88019070C7BAEDFD, 0x13733CC160299767}, { 0xE3EDE1160BC75684,0x44ABBD60A47D8E20,0xC589A0633522CB00, 0xE87815164ACE93CC,0x6B9E5D20A12CFE3D,0x11371EEB584A4436, 0xA6DF8D4BB44831C6,0x852C8C2A711EB439,0x6DB68C03A9FB89F3, 0xFC170E64EA76B5B0,0x8DBE0E5F805CAD36,0x7530AC9C6CF68E35, 0x891A338814ED7939,0xE8214B6BDB3206B1,0xE4A66072C4497E62, 0xFC14BB667F4EC9A0,0x5648857D9958EF6C,0xCE2487DDB79E1FAC, 0x49687EF7BFB13209,0x72F4723CF6652529,0xD291228D7308942B, 0xF00DE97DE596928C,0xF7017FC9A08BF910,0x1AB9C11568F592BE, 0xB48A4ECE91C1B9D0,0x0BC340B19ED82B04,0x435D352B0BD8FCEF, 0x3544FFDBB90F5CEE,0xACB9B26C18141308,0xF0D3923E920D0C84, 0x67D95EEE3D2892EE,0xCBBF9791DAC6ABFA,0x2107CA17EEB2D41F, 0x0A15B8536117F7F8,0xE38EFD17847C5965,0x299F455128902084, 0xE3C19C842DA0FC7F,0x438542355030A02B,0x09B20BFDA067ADC3, 0x207E8E2296B7B8C3,0xAE2034D10DF42664,0x8AEC66374C6A4CAF, 0x021C5E382756DF1F,0xDAB397892E258D3F,0xBBEB27F2593CA22C, 0x02F538557C761FBD,0x5D1F93565BD28C1D,0xF93CE73599B8AA44, 0x118489EF0E0ED804,0x26E9A60FC55BA1A7,0x2D592A941EE1BBCA, 0xF3E4EA86BB639898,0x8A2C6F5594D4EF71,0xD3DD68B3E2E12B5D, 0xE3A3F757D7EE1599,0xA4C0E18D9997F82D,0xBD32A8C683CB1B29, 0xA059953A4F92D812,0xBB2289A9855D888C,0x677D6EF341DA321A, 0x2B4FFC49B1821BD2,0x0257E7E26F413397,0xCB31728801CB390C, 0x3CB685B21CB3FBA1,0x788DB8A125D301BB,0x63BFFA8112F19D42, 0xA26082BE05E4E1AC,0x2FA9937F2125AB76,0xE5E315E2266C09BD, 0xDC5B8B66D671F135,0x7F354193FABCB03A,0x3C9D682D7F698313, 0x8BA04039FF140FDC,0x312A0A394E8C9048,0x1A2290ECB9F91D01, 0x28CD49E7AF451EC0,0x0F6ADBDE5FFFC10A,0xC53C8C75FA7DCF99, 0x01FC98CCB44CA6F3,0x6BD7A58209C968C0,0xAC23BCFD1A4FA2E1, 0x7FC86C6FB1B0E97C,0x9ED901F601EAF9F0,0x95F1081A1BEBBF37, 0xDB26CD0DA39B1F05,0x4C6E73DF5FB3F0FA,0x3EB86A198B26131C, 0xCAC5592422935EBD,0x95EACD29BF617EFA,0x2F41A05EFFE82B79, 0xA86A40EF4867CAE7,0x9C39B9117A125986,0xE37D32CE39DBCB51, 0x3F68378EB6844A13,0x7CC5A27CA798F90C,0x0620A80357EC10A5, 0xEB8432E5703111DE,0xE859F372BE354560,0x82656F21A2C57145, 0x14A9B7E1C553EA68,0xD2D5DD6F9307BB8A,0x14B7194207B5105C, 0x8184D3C3A12DDC77,0x519F29673D8158CE,0xB3C32CA30F77E983, 0x2128E5D7E296BBAA,0xB3C36F108C02701B,0x79799E52E875F1CF, 0xFADFFB023A68E76C,0xB092A17C4F389380,0x26649815211577DA, 0x64DF730E2B87A4FD,0x1A5E4F14169CFCF2,0xE076A65F976E635C, 0xDCAD57936E017E84,0x2123F4ADCFE3E761,0x7689CE9C7291B34A, 0x3128D6249BFEF6AF,0xED98745FAD9BCAA0,0xE48850A31635FB8B, 0x06FD57BD0D326219,0x1746DFA4E85901E7,0xAE9D5A4533D88A6D, 0x21EA70902DE52E47,0x711024D7735E27C4,0x8348E17F014190E7, 0xF6DF0D50C6700128,0x5B70ECABA6A01C98,0x1114AF3E1DD46FD6, 0x1E3C56823076FA3D,0x642F2EB5A7C7C625,0x75655A99C51920CD, 0xEFC5E07D1C996040,0xE3048644EF5FC2BA,0xF381235F5959D426, 0xB1485DBBF14BB82B,0x340CA2AB7E8C3151,0x5901BB9DD8C93107, 0x1693701C2F0FD38A,0x2265D674ECC395FB,0xF951CBE74CDE4AF9, 0x16DE85E3E0CB3310,0x8B16C0143A0106FF,0xF125B5B3CB45F407, 0x79E7389F5CD3A367,0x5A80B1E4EDB17199,0x436EA05A3E377949, 0x3A3D4ECDE00B34A0,0xFFA49567F668FA93,0x36BCAE2201E1C17C, 0xEAC3650F973AD8D5,0x430DBB8D05F92104,0x5641EDCE3AC26AFB, 0x786AFF702A2CACB4,0xF6228018EEB3E205,0x5223B6B884DA7B94, 0xF69CB1725661CED8,0x52D65674BB06447D,0x10D976884A4D4E2E, 0x85562963AFB9FD77,0x3EB067C62ECCB316,0xB715B82C4CD5704B, 0xFC48C9515A696AAA,0x91CA3A2FC6C97B48,0x1E1227EEEA5AAE0F, 0x1FCE1B1B0149C632,0xFDD8AFD9F6466639,0x645338F3EB8392C8, 0x3318915B53748398,0xBB711937AFAA09E5,0x5FC32FF1B3C1FE1D, 0xACA39DBE6F87B608,0xBED2B1B1C036C554,0x22DAAF24CAF4F53D, 0xF854E55A212471D9,0x7D2D07779B25563B,0x85ED851CDC95DBE4, 0x6FF966162C13E934,0x0886BA4D85F776EC,0x4FC3757CCC791C7D, 0x67171D83FE93E855,0x650428C5A5D69909,0x1A4AF2BC95B74227, 0x26AE05E937CC6E58,0xB6EBF6A679FC9DBC,0x6A289F831DB090A4, 0xFED906D8873153D8,0x8D17068C2FCB255D,0x9CE6F36322E5F0E9, 0x99505EC4777D1D28,0xCEA31A15FC3F4432,0x40EF079C4F26C32B, 0xF9C2CB89F0B40D03,0x4F10DBC4BC83DE6D,0xE34AE5CB8798EC34, 0x632D8651CC6CAF6B,0xCE4797BD98CA8826,0xC28D82EDC7BCD3B2, 0x2AFB56FFB2280BF9,0x0FAA53BA70BB13F1,0xB88C9BEE75F865DB, 0x65B9747600C27A47,0x7147367E52B391D3,0x9A10C6322889967A, 0xD667521FE7E68D9F,0x41B14D505D608D8A,0x2A8D5EE472197B7A, 0x9E0D40E0B7D84D86,0x8FAEF64A9F40B830,0x085A45BF37C66777, 0xDD26FE46494978CD,0xC336AC136D0EF2D0,0x93D63D524059298F, 0x758E39DEB59FB07A,0x9F5087D97A5ABFA6,0xEA89450159E9B256, 0x0B81091656CF23AC,0x8BDD7C9476FA3428,0x0CD33C02749D58A8, 0xC14D4DCE4D984D74,0xBCEA2DF9BA5EE882,0xFDFB1D43FA94D0CA, 0xEC038FBE3F78E4BC,0x0C83727C60A40C3B,0xB60283FD1A1F7DF8, 0x83647DDF5A6EA43A,0x45E2C5FA1164677D,0x12C2242292D83289, 0x67C64BB1516CF2FD,0xDEFC03FA52D573DD,0xF2DA185F6FCEF553, 0x280C9FAE8BEBE1C3,0x5C4648C6AC8E2156,0x39F3ACDDAAFF23EC, 0x426570EEFF59D494,0x19C3BE0BD6F859FB,0x23CE10871775DA1A, 0xBA648A66CCC808C4,0x51BE41EA51A28FD8,0x34DF5E938481F74F, 0x6100816D3340A466,0x70548249C75E5120,0xBA79702279A00748, 0x6F067133E39C6F68,0xD4A56F6DE85BF670,0x9BC03ABAA6FC1A71, 0x7896217952937711,0x04CF9FD6C613F747,0xADB4E5E44BD90F88, 0x994FD52DF174D699,0x30042813012C0114,0xF26207D02A6E2994, 0xD01EA8CA8B4289E4,0x288B2E9FB77EC8C2,0x062AB5EF441C44B9, 0x023017B24D33E3F7}, { 0xC9C549126B629FC5,0x13D2028D708FFC38,0x99BF4A68002FA9F9, 0x959B2BDBBF79C584,0x2A6AE3A9AF0DEF7F,0x3961DFF94E0F2FC3, 0x375602F6CB38090E,0xFF27FA5FB4361DAD,0x27F105C6FF7A86A7, 0x89C6A294797B99FD,0x859C810D3E650654,0xCD5FAEBDAA91E7A4, 0x80B70152513A0E3B,0xF3D5225D6212305A,0x0B2E2D04D6E0A998, 0xBC00734CB44E2BC4,0xDF6923BF27418C14,0x6B0D8E79BBC2202C, 0x4F5354ECCF70BFBD,0x3004547DA9FC32F9,0x284A7E7F49AB8971, 0x7C4C5273348AECA7,0x4AF7B4566A7D274F,0x41144E72C6576B5E, 0x94DE31E88FFF2C89,0xC4B22594D0138A97,0x63EFE7A453EA6DDF, 0xB611ECB4722FE373,0xF819C4B88FC3DF60,0x93E879D9871E50B2, 0x0AB6063FF823AB24,0x1D753E36002FE0A2,0x59155829A234E540, 0x2A3A5EF606E16C73,0x398EED502BA793DF,0xA2E4CD3D50E7C902, 0x455226EE9CC01966,0xE783C5FAA4A03BB8,0xE627076A6A926733, 0x7ECFF39F7A1F3091,0x0CFB8FC622B3ED44,0x3BF287327CC97604, 0x16588EBC87273BFD,0x23AD2E3D79DC9FA4,0x6F33F954DC3DDFAA, 0x8855135E2935EF4E,0x980A08E4CADE1B0B,0x0AE829C4B9832D25, 0x7E26508CB0E1D951,0x014E05A1EFEF032A,0x7D73E257F5E46436, 0x3EDDB5EABF92518C,0xBEB2E77DE87FBEA2,0xE774B1C87370FA54, 0x8212C2D3FD68BCD3,0x80FDFEBF5965C349,0x36E0BE298259B3C2, 0x7900B71C3BBDE591,0x4BE48027CBABC230,0x9AB8623D10F1DDB8, 0x67353FE74B23E082,0x14D19143CD01BBD9,0x9B8F27FEE6873317, 0xA80F9F28BE002243,0x95E3326A1A5D0985,0xE9CDFC8A83BB7D8B, 0xDD5BDCBFB6238048,0xAC5DB086974C4A25,0x3138A84A6EE55DF9, 0xB6AAFF87D1AAAB74,0x7D882D01EAC51639,0xB1D786708070B049, 0x2B2D6ACBBE60CA03,0x7E9FB44B03BB7CDD,0xD46CD6E2B7355F16, 0x28189952E1F24EF1,0xAB1BB900C9ED265C,0xE2D04CF2396E9E95, 0xE90B7C2BC71EDFBF,0x2BFD0239BCAA1AE2,0xD5A67AC75C09E06C, 0x1042C9914BD7A768,0xB95D116A50577DF5,0x4D5BA7FD9302A958, 0x10EFB35D7C44D04C,0x2840CD3BBFE8A000,0x6E1D0B91BF83166F, 0xC94BEADCE2A22661,0x29F3DEC66D94A52B,0x6DE8D82598C80D5A, 0xDBA35D1E9FC9976E,0x70C6F78CCB1DC1AC,0x5F89D50A1A0F5014, 0x89BA6ABE2675A341,0x2E91CA2D639705C6,0x0A1E10F5ECB1CDF8, 0xC6F4D4C76CA28E32,0x6C1F1960E1FFBA3D,0xFDABA7B749417CCB, 0x2EBE5734F41BB7B7,0xFF1B3883F1C9AB13,0xD2BB196566A38EFA, 0x7B512382658E0EA5,0x935BB5D4A12A9BF7,0x960FBAA2555C0B70, 0x3E525A53AED652B2,0xB391181888F09E91,0xEB9C20C7852CB5B6, 0xFE412D512E5FC6F7,0xFCE8C877AEBF0456,0x64E554384FAE86D3, 0x3F7FCB2D2961457A,0xEAAA1911B7B127B4,0xFB0705A22D459DC0, 0xE1BDFA1C0BFDEE98,0xF87B87A9F83C326A,0x5EF4FBCDA686CCD5, 0x3A6062109261F2CB,0x6DE5ADF39C432638,0xD3E5B2421AA14DF5, 0xB8C3E2A48D04B5AB,0x353AD3256B300551,0x2C293E7B5CD65ED1, 0xD1424A125365A941,0x2D7DABF9A99A9EF0,0xA22E73F4144C14B0, 0xB28D10B4DAEDEACE,0xED1C674702891AF1,0x97086B1018A4CF83, 0xE2BFABED37127735,0x02F6EA6EE53CEE62,0xABD1EE13E70FB008, 0xC74EF42B9A66ADC1,0xB37D68BD31CF57BA,0x50FE1D7E33412595, 0x5E1D0F55FF19FA60,0x60BC42EF8A205D65,0xF6C988FE294D1666, 0x58FBD06F63EB46E3,0x6EF46444A4CDBE82,0x8B5264728BD852F1, 0xBCAE0DB7DD7356F2,0xA668BEA6E240D70C,0x3B57508CB52C4041, 0x896E399798C84992,0x55762FF107ED577E,0x594A7E2FBCB2EB8F, 0x9AEBC80F2B38F26A,0x43E6DD993FE053CB,0xBD77A7E5122AEAAD, 0xE7928B16D1212579,0x095BD76F6E364AE7,0x45C5C8EC7B9A739E, 0x192B00027D4F1F15,0xC7370445FF3569DA,0x4D89F2C82087874D, 0x3001B7CAB20DC804,0x8E85FFCF7DE4AB5D,0x3BA794F55A19ADE7, 0x1D485BEBF50C76DA,0xE937C2354A69FF66,0x65B0FDC5E27F9505, 0xFDEC5B5707A41CB5,0x56226E58F0342F9D,0xE47B29225D24BE40, 0x0708B0582DA0D569,0xCAEACAFB626D88B6,0xD9A23DDAFC49DE6C, 0x0E54F8C288AE7A36,0x5A16100CF86D7CA0,0x1B400779B429DCFF, 0xFFDB45E8FE03B385,0x55883F5A18C4C190,0x36080E4DE983C048, 0xA7619E4D5D7023BA,0xEA1B4448FAE19DF1,0x920A7A62FF9BE5DA, 0x8D630C913A8457B3,0xC1317AAD19B125E4,0x2AC60DA85EF6A4FC, 0x18453D57CBE16E34,0x5B3D0DC184E910D3,0x5989E958B02A738C, 0xA76A21342AE3153D,0x6C9A6DA3A6B590C3,0x9294F2B261FFD9FC, 0x5DC7ABBC0A085E11,0x718F3BE7FD0598BF,0x8552331CA17183EC, 0xC702CAA9151C171F,0x02A6E9CD28FC2637,0x1D79CE9FCA06C85D, 0xF990DF8D4704243D,0x4A5C1F56FE965B3C,0x603347ADDC37A650, 0x1CAE34EB5EBB9A97,0x137D411F4DEFE9FE,0x8B1E6D8B9D92A7DD, 0x5888051BBD7DE708,0x2A05F513CD02F32D,0xF37A6090024DF9AA, 0x3E9D2A7E829CFEF2,0x61D25546792B1059,0x1B042CABCC51561C, 0xBA6A92F3C9C23431,0xDAFA0C012658242F,0x15388A8C97D1C6E1, 0x1D75A986270AE314,0x00AD6269F740DAF5,0xE11ACD2629ED5C7D, 0x78B8E95513F8D4C2,0x9B4216455EB07F9E,0xDE96E41B398E740F, 0x47F4DBAA6AF2216B,0xE324E52ED534622F,0xBFA0F89B7BF36FA7, 0xAD459D4846671973,0xBC8C0111A08779BF,0xBF7E8F32F914239A, 0x7C039FA68DCBCC5C,0xB2C77934F9D19EE2,0x2014EFF97BF6F383, 0x18A1E15B762D0A76,0xAB97671844F7D0F7,0xD900ED19F558726F, 0xC40702BEFEF81427,0x3C04AD1AA20E9FEC,0xA5994E7F4FAE1300, 0xC30D8C955DFFC1E9,0x28B67F51321D79A4,0x80805CDDCAAC217A, 0xC450000E76A4C407,0xE6B11477FB29BA1F,0xB6117B2EDB67EFDF, 0x90919CF5F2402660,0x870990DEE6953D45,0x59DCA2BBE1D1EFE0, 0x1AFC02321CB98FBD,0x4D64D3E14F230A06,0x6711320EA8A9F71A, 0xB30472183291CE32,0x50E85B556358D19B,0x75574349C061908A, 0xD8FD1AA7E4FC7A61,0xC01E9492FB30E932,0x8EE6D89FAA3D9A2E, 0xF8B5C1B7C0B0BA37,0xD81FDFDD54EB3270,0x9CD27406EB1FF9F7, 0x338CAE31F8B82E2F,0x85FD727AB033FA40,0xD702FBCBB7403203, 0xDE77DD60D4423BA3,0x4C85C9518E850016,0x7A70931FEE8600A5, 0xADBBA0197CD52986}, { 0x626263A3B381D4D1,0x28913CD012DA73DA,0x6B41DD34C1ADA2FB, 0x8D97DA19B167ED9B,0xB4812D4C5BB6CDA7,0x669C5EB0AB412ED2, 0xD3C0D38280BCADE4,0x961F99BE007375C9,0xE1CD3F0D18427E6B, 0x2F8E1F31AC07916B,0x0BCB45904214A966,0x080DEA4FE4402AB8, 0x3164DA2C4EC6D4B3,0xEC1AB3E0371AA403,0x703CC4A2D61C9EAF, 0xDF938277B360CC64,0xA809622ED1CA223A,0x0D0C41C61FC1CB73, 0x6B1D07D0F7631F64,0xCD6C472B23716169,0x7C547D101DE31920, 0xB8AA5D5D5A08B84D,0x8783FA268476EEC3,0x4AD24805DEA948D4, 0xEFD4680DE1082145,0x1F400A6F5CB25D7B,0x5830BAE8DFC1B3DD, 0xA52EEAC39FA9E4E6,0xE780295AA1FDA9CB,0x05292076633BD6C1, 0x84F452863BCCD3F0,0x0C0FFA13A48AC0E7,0xC10B071D8F38B069, 0xFC797F140A0C843B,0x55B2102F2B6F2CBA,0x6A65ABF4BC13F3D5, 0x7AB981E9ED36BC8A,0x01590DEDE28853A9,0x880A305A45927BB5, 0xAD60BEC2758C9434,0x4F5CC2D0842FFFA1,0xB56BC910589D9119, 0x29510482F6B85BCB,0x191C5E8C0AAC8F1D,0x53AEE004B3A760B2, 0x6C47171AE122EE50,0x8F882588C3AF791D,0x3AB1E787787F23A2, 0x740A3D69F574F889,0x563A7542EE0275A9,0x1D4C7F0288B0F4BD, 0x0B6A095505C57B60,0xFCDC13AC38250CC2,0x7C0F6DD8FEE40397, 0x75D040BD4F8C08B0,0xDA40BCD1AB461EA7,0x0BB2664FB361B106, 0xFF88C17C7ECBBDF3,0xCB397F5A34BD8C06,0x2C79097E71DC4099, 0x0C7E28743703E385,0x6B4E04AB3244D2E0,0x7FB8C9F38282173F, 0x21AFABC5CA89F8C3,0x3AA25BFAE9E1B88B,0x77E8C0B888B0B2EE, 0x8D7E99220B214D8B,0xE4C85444B026A4F2,0xF29A85E1881A45A5, 0x73105CDEBCF4939A,0x6B923A2FFAA6D9CD,0x44EB8BB4794D87DF, 0x0A60094B3CB6F83C,0x03661679A1F217E8,0x963C57F0455BA773, 0x48ED66F36494C7AA,0x0B20EAFD85EB9191,0x1C890980EFA34C0D, 0xBDA11E825B6095DB,0x3E193DB7CE3E5F19,0xD52A1E3477B0CC82, 0x489DB03838376CC8,0x3CEF20B0BC9F84E9,0x70CB14480EC62200, 0x246227A4A55EE063,0x7AF69EB03F5EA747,0x39FA87659196B7F3, 0x81ECEEFE543BB263,0x041009D0CF373731,0x62836B24EEC15E94, 0xB498922DBAB7E562,0xB8A4FCA94750926A,0x880C34678827F078, 0xD9ADAD0A8D1D0854,0x6F3054702D3DE155,0xFFF92A2DA11FD9B0, 0x6B012A4C96009615,0x95BD42D4CA1FF867,0xB1B1B706A1B652C4, 0x606C1C06836140CC,0x687393E9571F598B,0x7FB3189C01008403, 0x196DC6E309DD3F96,0x2EE2504E4FA033AF,0x656EDD9C1C2898DA, 0x1CF705B8EBE7ED56,0xA335F9DE920E0456,0x176E632D59157144, 0x37B8036FBDE47E04,0x8DB69C255B58351D,0x75E3AD18FA15C435, 0xB88F8FA79E7ACD2E,0xF4F1ADB22C44430A,0xA6F667B7787DE551, 0x7F5A7205AAB32994,0x415894996FFDADD7,0x0066BB6CDDC58D69, 0x73355DBCC89631CF,0x4431FD499E8875DB,0x497D7F92A785C0A1, 0x9E1259957CD82824,0x06AA4F3FE70CA2A2,0x2089374C701AD9E5, 0x9232A152F12FA6F5,0x8642D5B1E978751D,0xB983D466746FC062, 0xB927B4CDD4A40163,0xD318EFA72D4E8E2C,0x0739C2B135066E85, 0x288D2F5EC554BB59,0xE932090E1594B11D,0x99AAE93439757411, 0xB6355EBE7352D0D5,0xC55036D033D4CE1A,0xCF62E455765770ED, 0xD35B32D0879CEC65,0x4A7F75A91E55A387,0xDBA77CCE6BBA86C5, 0xA5BD40453312CC34,0xC873CF4AD2B21BDA,0xFB57ACBBFFF82A86, 0x548532941E5C97F5,0xC66A0BF8E8A5EBA2,0x4263CE77F7EB6DE5, 0x2E8A6099FB9CB50C,0x1D45AB6111B0DCB0,0x7FE52FF300874786, 0x595B7D86EA04E95F,0x02670CBA727270DC,0xDA2647DCAC755BCC, 0x587200296A36C48A,0xDCB2C01C8B852F55,0x9437511867ECA888, 0xDA15A6EBE12F1ACA,0x6BB01516C79BA56C,0x59D5512650DA86FE, 0x2508641E00EFB3D8,0x1082864880F8737B,0xB353426A76C9620F, 0x1133CD70565B0C38,0x4758F74C3AE9A9C7,0x3C3158E934173FD8, 0x932EAB7FF21856F6,0xEE6E49FA9C5D22BB,0xF0D5647DA187773A, 0x12D8F8D9175D50B5,0xCC1D89F26CA5F76B,0xAD350118288382EF, 0x2E8209A98951707A,0x429AC0E06E896040,0x1FA39EAB38C767F8, 0x0DB3875C9089C512,0xD833C218B2296004,0x51D022375837CDA6, 0xB197EFD3310610EC,0x96D9426A03DD99F1,0xA668A96A49BD5595, 0x88B9C5A482DEF3CF,0xCE29AA1123CE0CCE,0xE8C5D1BEDFEB8F4C, 0x9FD5C941FA43F815,0x71403B035037F8D6,0xF96985771B6CAEF5, 0xB0CEAEF1407FA726,0xDAE80323BC5687EE,0xE766D91350438AB1, 0x83352D6317D820D4,0x471FAF84D19B9D6B,0xB68B6E05C551787A, 0x0D82CB9A2FD0ED0A,0x9C9FA69B835533CF,0x529708C8B631A586, 0xAE6E7D9A9A021C8D,0x3776E16D46423ABD,0xE26768F257FA285A, 0xD1064D1D8071EC0B,0x87DD00CA296EC314,0x55664BAA77126B71, 0x84923CEA48B80A5D,0xCEEF0FB7CDBE63E8,0xEE9CD1F8F1BA69D1, 0x630CB18DCEF9F6D6,0x9ACCCFEC1E5B0B8B,0xA7C603D6C1771990, 0x8D8CFCA125F0FC18,0x21B3040B45983A58,0x779277D37F6F40B7, 0xE00E05C70D0DD723,0x2E06042A483503D1,0x11E6C7594E2D37BC, 0xB05774BB3125D878,0xF2F37B26D9686660,0xEC467268C4B86304, 0xBCB60695B6C2FE57,0xBD0F1F36040BE959,0x3717E742E40C6ACB, 0x3CC4804C944F7A20,0x460408E2E1B06095,0xA670D0945BE59F3A, 0x302057B370FF72B1,0xDA167250DCC3541C,0x05640270451078B4, 0xB76AA32013FC0D9A,0x46AEEECD80943D79,0x40ECDF130731B4A1, 0x97AD3D679928A042,0x504F5C189FA51C84,0x4E87AFD137482693, 0xA2BADFB0FAFEA200,0x1F87EA7EC1EC7232,0x5AE7467498550A62, 0x46078EAF639D8B94,0xFCD6039345449DC5,0xF1D0921E12BBF3E1, 0xA8278D27BF1494D9,0x3AAB6E1FDAA2078C,0xA7056D8748FE8393, 0xEDE587F7AA7F0D10,0x7CC2F685085F2B73,0xAB013AA88CD2F44F, 0xE728EE7494DB1A90,0x91E7AD1C7A9DC3A0,0x0B50F837CCCA0AB9, 0x6F4FAF4B3591C776,0x8ECEF7BB5EB62F62,0x38B856766C7E761F, 0xA804C793B28B69D6,0xE1ED19F49068CDB7,0x49104B4C4DD93914, 0xD5EAB4E714DBDCCE,0xC5CC85B5C060507F,0xDB32425C0D97E0AA, 0x40982C04911C28C2,0x2CC09E5BBEB228EB,0x12D0EE550AE54C7F, 0xCDA4DBE4290E1192}, { 0xC8E7EE2A6D35A85D,0xE65C4BA2BDB172A3,0x24E778560394EA96, 0xC2B27A43E3B8DE3A,0x68851CA62A4E9602,0x5C55530FE3B65709, 0x879085274307A299,0x55EF07A5128D13E4,0x9D725027DBFCE0D1, 0x1F0A36B7042A8604,0xC0B998CFE7483209,0x68C3492A53196622, 0x74AB18A58026E986,0xB2A80581C9BB8E61,0xF6BEA5D51868B77E, 0xFB9EEF919206448B,0xD994BE0A28AB72B3,0x9E4F201F17E3A924, 0xE417494C2B40948B,0xF181F1AD48176EC8,0x4E6DFACE8A54167E, 0x03EAE7EBCCD76504,0xADB580CF9AEFD7EC,0xC95F10516FC1822C, 0x16B4DBCA7E2AF7B6,0x4C2C1E92A3FD8B1E,0x2C47E98AF402DB8F, 0x41B35ECC6648A3F4,0x3E6304DBBAB7D72F,0x7FC1AAEAF908800E, 0x221D7A4945772D5B,0x2C2E0622FC7D0EBA,0x9642246B05B23630, 0x0A7B0F45486B606D,0x13177F6FCE892312,0xD1CB0F1F6DFCC606, 0xAA78E533377B4884,0xD6B52F4A8C9E2A60,0x99B73FD0ACE073AC, 0x6C15A0193AB9C716,0xDFC2B9DAB731F594,0x346570BDBEEFF775, 0x72C4AA3D7F315855,0x33A724C96D575675,0x048D4945B24864EB, 0x4A133231D8592CC0,0xD5C73DB05E524096,0x37FF9F3C0083DDB2, 0x62CF329FB4CA2C7A,0xFA32EB7340C80018,0x44A0BEBCC3FF0AF4, 0xE69FDA32090494F2,0x5BC6B8759CD4735D,0xEBD794C34F999AC3, 0x15EC4AB381966658,0x04227560AAD6E119,0x666F53B1C2D0E5CF, 0xFDA528678C635D9A,0xA95E2B06AF981F38,0xAC8D213BAF14763E, 0x618980C706184FD8,0x065FB48BFBED58F2,0x3530BF7072F45B25, 0x63496CF13DA894A7,0x10B0AAB9B53D00D5,0xC94D06690A504E9F, 0xB0188F98A1416C8F,0xD617690189DB2B89,0xD6C5973072B0D296, 0x41C5AF732550CA99,0x1F14A4CD472685D4,0x7FF0EB3059940A8F, 0x6AD4BB06B2CFC19A,0x26CAAFF27D31965B,0x24BAC753CA8C7495, 0x0BD00E001AD03531,0xC85A61F41B4F63BF,0xC069E56EA641FC8B, 0x58F03B9F82249453,0x3845C8E628849C2C,0x35A07EAA2B311D24, 0xBD87A6CAA8808EE4,0x6132969AF471FEEE,0xAD3CA83EFFC050F2, 0x92F28FADFE9548EE,0x4A445E95E2B96A7F,0x0CD740D338AC4E9E, 0x22CBDBA02CACEE06,0x2EF0B47ED4A26551,0x95162DFE6F77218E, 0x949BBE6E2C5E18CB,0xD858457AE86AEB8F,0x70160C4C32FCC035, 0xDA1B117537022CC1,0x4155B446242E9516,0x0EBB3A91C05F6DC1, 0x72CE4A139155F85E,0x968D1D2BE2202DAA,0x0DD112E69A43590B, 0x54571D7106AA1177,0x8185CF7C873A83D2,0xB60E081435FC7665, 0x1119443E61477BCD,0xBE341A447FBF3154,0x207BB1320C48C47F, 0x4ABDA6DE378E0293,0x6107CEF20273CE94,0xDB975B82DE2E74B7, 0xB5C328A45210420A,0xFD5DB064FF0CE588,0xA13D0310EA1451F2, 0x43B7383D053E52AE,0x0E8EF259EB10920A,0xAD3AD1E9745478B4, 0x6205B40C776A6AF2,0x555382797179A5A3,0x2FFE1524EFCC58F9, 0x7CF888C7BC0799F2,0xCDA43BA405DDBB75,0xB5477636677732F6, 0x01319EC2188D7305,0xC304C3C9C905CE9C,0xF1FE7A84086D9818, 0x33FFC90248AFEFEC,0x5F936E7E0B73F2A5,0x997533FE57D3D2BC, 0xA8727C21D3025478,0xB9A5ECB6D2B53213,0xA719EC619141CF64, 0x575191E04E65313A,0xE939E987FCC67DC8,0xE311DC20B4BF98CA, 0x83B18F3FE3C6B19A,0x45A3F7DBE43309F2,0x29C88527BB7E1798, 0x9BD9065395ED5092,0x3AFA47133CB87F2F,0x79D33156F2A0AEB5, 0x4E391928829ED724,0x45976E853A57156C,0x274ECB26774225DC, 0xF01D518D64D90A76,0xB7AA9CD93BDF7DFC,0x675187C1DDE860D2, 0x5B27441797399AA3,0x34A484AE25A7D8CC,0x3313743EEA047C38, 0x6642F851A39F0FE0,0x7E784F26458566B6,0x1667EB5A365039B7, 0x320CD5C287747C42,0xC500626988237C54,0x1900CD551BEA8F06, 0x1CB2EB6D1009C5F8,0xFE4467CE9DE6B84C,0x474907E7E930D4DE, 0x9A03748021094135,0x1D01A2CD1671E5E7,0xEA36E4D4BAEE3186, 0xFDC80A189B81415B,0xF05E5C2CEAD51307,0xB10BF4AB1BF091DD, 0x9A360064E7EFF780,0x002D8FD679033659,0x2CB6755A67B7F1A9, 0x74289C32DAC31036,0x8B43C5F7E46D7626,0xA5824FF7A1C04253, 0xBE299B6E486689D6,0xA6A36640B0E7ED10,0xEFCE1B3B69319579, 0xA4C7511EEF2E25D6,0xE734535A0A39E4D7,0x0D4058B97CBA88FF, 0x3FA7B14B24CDC6CD,0x97B32577F69EE7D2,0xF456EADE82A767FB, 0x0010AE7A6C3454D4,0x35A647CF2DFE414F,0x5F939DE1E6B3A564, 0x761CD4B5F4B8F9DE,0x32701D9F38859564,0x927008126BC94ED2, 0x04CA39A82D3EE4A0,0x26FF262BE4C1CD83,0xD8171EDC5EAF11B2, 0xE67378C44FB8DBBE,0x43821B229ED5B95D,0xF7049AAC3635CBE4, 0x1C4DDDB37B9AFD05,0xF0CBF5B4691CD3D3,0x6976C062ED0FFE99, 0xD936DB478E654D9B,0x22F34DBE8B13F2E7,0xCCB7DC2DE2731B06, 0x85F8BD4FCBDF97FA,0x02FAB7045B1C055F,0x97A94E31DB778B87, 0x2882DF5FC805577D,0xB695D74F9A30DE4A,0x0CF049C0A7345FA5, 0x96B9509F55F63483,0x3084D0AFBE224AAD,0x84CA453BC82105E9, 0x9B4D589D4A02FECF,0x3136FBBA8192321A,0xBD97D146DF9F4E2B, 0xB9F8040962D96DA1,0xEDCF51D37D9621F7,0x8DECA39042A16FFD, 0x9441F853C1504B57,0x9D1024FD82563051,0xD34746588B2CE81A, 0x6BEA6D58DF62C819,0x31029351D2E7904E,0xDDB03A88345FCBDB, 0xE62307DB8BADD207,0x32E5BB8925D326F4,0x290DDC6CF8B1C598, 0x0B7248827F06A000,0x7679EE16865E48EB,0x1F3BAB764D8FE8CF, 0x3CB0E848F54B3538,0x956D9C6EECEC3965,0x73EC71CE0828103A, 0x86FBEE17D8845ADD,0xE60D3AFF0F007CBE,0x89D3033A550F2A11, 0x2E081952F84293A0,0x974F0F245BD0A5E7,0xFE79914859C60354, 0x8982ACEAFD60F579,0xE1233F40905919BE,0xFAB1DFF38F021851, 0xC430D68AFFB03AA2,0x2BB72E416FAA9D5E,0xAD3A44FE8079644A, 0x2E9561FB8B801944,0x3300A1E2C054CCF4,0xD8084D497FFF7A10, 0xC33E8B2B8828E728,0xD1B3DEB329DD52C0,0x31B88B43F606C5FE, 0xB4212E76E6DC6095,0x93324E6411A911AA,0x5138BEA009DEBCCC, 0x5BBA38F1987EECB8,0xA2FCFCA27891EFB9,0xFB0C2EF580179636, 0x0625A4AE64B186C9,0xF3CF2FCBC3C58C0F,0xF5EA740F98982795, 0x2564A9C150FFBA8C,0xE62645E8043D11BF,0xBF3FCCC3619B3C35, 0x73D10F6B60D11815}, { 0xA8E12082D7624114,0x9245F1A7A0997271,0xAD40A4311D954016, 0xC18B37D3FFBEA3CA,0x9F75CB789BDCC8D1,0x543457A71981F784, 0x7940B92E57823865,0xEE91834176D1A1CF,0x265FF2A579D6FAED, 0xB66BF86CB191E358,0xB0E5C8A0964F04AE,0x407D0DC8595D3934, 0x5DFF91E9D6352EC1,0xB9D495DD6FE7EBD8,0x815BCF0EDFEDB01F, 0xC02BF2BB2A2A6FA7,0xCD2F1CEA53958F27,0x0683592403762063, 0x0F26652B5091303B,0xE43FFB8885812210,0x3205ADA9F0D3640A, 0x22807158D37A7403,0x8B17A7AAA8121956,0xE5B239C95AE32EF1, 0xA14B442A7EF8C780,0xE1449CA4F16ADD48,0xE6079B9D7714A475, 0x9A9F36ADB6FCE01C,0x053444FDEF512622,0x9E1C5A27A97414F3, 0x97158027964BBA33,0x3577193E76F39380,0x503C38D0899EE5A7, 0x56F8A8386D84D297,0x46301A01246C0F8A,0x5340554DD1C86B9A, 0x5C02E7A5A846AEAD,0x94AF414D21FFE6CE,0x7AB72F4275B1701D, 0x37800AA8B54E391C,0x796EC8A820644CDB,0x3257B2C90337228A, 0x36FA9CEEE74E624B,0x8715D5B910D11736,0xF450DFB3840B3808, 0x877336D0A96226C1,0xF1B1D7EAF1EF9164,0xA234ABEB1CC6D6F5, 0x5C9378781B51529B,0x851E350D710845C6,0x5DD5164748FED079, 0x9327398D83D5CD98,0xB3721C8D87BDA627,0x21F6D79FC003D794, 0x3375B31563AB92B8,0x83BC7E579D936ECC,0x3DA3D1EB726E0F38, 0x21AEDA1E95BDA637,0x877FFA5529B29937,0x432303F07D4DD09E, 0xF4970D01770AD733,0xD9A755DAD173E41F,0xC8CE6C2632B896E0, 0x9C20F5D8623E9196,0x5B90DCC953048D23,0xAF339F2A14763FD0, 0x4BB23C18895CD2BA,0x8F9F3E95F22CEA61,0x374B5A39DB49BB9D, 0xE8D0649554DD3240,0x3686F79BD4AA41F0,0x92345E7B3F4B9805, 0xB9210C91B1B72896,0x909B40770A717BD4,0x7165196685C3BA29, 0x819E949DC1F68FF5,0x35981A79BDC9B23D,0xA8ABA317D6362F42, 0x4395E8D918C5D29E,0x24A9AF953ED557DC,0x1E8B609F9289CF48, 0xCF94872A5E21CC20,0x88F2A9DFFF3D5B30,0xF82694A79A525209, 0xA6730AD7996CB74D,0x5960CA440F7B3D2D,0x10272FCB8474D797, 0x11B5C7975713E5C5,0x881D6984156E7F67,0x4265E61A40384B34, 0x658F30B6F57BFE38,0x2D30CEC9B7D2141F,0xB4DE84C92F235B18, 0xF6C84891BBD361B1,0x09AC2B3F99A4DF60,0x139D9360FEE621FA, 0x35E1ACEFD867644F,0x95D6FE63E2C3ED5B,0x4127228476DAD854, 0x9A030F1D35D0610A,0xEF67FCA008316188,0x1AE36D97427BFC2B, 0xAA0A541207EBCDD1,0xF21A86A982BA0A5B,0xA158626CC13DA4F2, 0x8454855F71F362B5,0xA4A02DA6CD956970,0x3A1933A20A413562, 0x7FB08FD190C1750D,0x95C9D6D8F0A5597F,0x905F7A12F8B9F05F, 0x14F063982721D6C8,0xE1C81055EAF345E4,0x8B02B1F9A7B91569, 0x907307319BB4D3A2,0x22FC429A762E202B,0x4C8298D584C50557, 0x4EE680F9D55E8E1C,0xA59AADB37A64D4AB,0x777AEF54255C6BAF, 0xB9E9CD12C9F6D03F,0x0486405D89E12012,0xA8F32195AD9B848A, 0x24536A63053F1662,0xB8ABDF34B4352046,0x008E066DDF7B1BF0, 0x0937FA7D9D183D1A,0x1A5396EF432972AF,0xB07471DD5EA1912A, 0xFA5DFDA5DB809F3B,0x151E0E66B664D54F,0x1BBC2143B288B9AB, 0xABC02F7631CC1927,0xF9A4AE96F9834DB0,0xF8193501A12927BA, 0x650FCD815770113E,0xE0CE618E5B52DA6D,0xB5B152BE30A8B07C, 0xDAD8F353972ECC52,0x99D4AEBC060A6A0F,0x08E62828868BB696, 0x5167F893396D2F36,0x1F2E9E73C80E8F85,0xE0AB823094E08AB3, 0xDC0BEABAACC05EDD,0xB6753A97DA5A8058,0xCFDB118A67D4916F, 0x51D9C89214F493F4,0xC26167305289B384,0x97160AB71A7E4CEF, 0x973179255169012B,0x7771F3EF6E0C219E,0x5E09D8BBE3A6AE29, 0xA711508CEC25DD3E,0x04279E53EFF42D64,0x9B8A1B3518BB56E9, 0x221111F31D86B8D4,0xE97D5EE7ABDE1FB8,0xBC734F44DF744FAC, 0xDFC032C98833DA84,0xF7A162F11B585ECC,0xA6D1166246CE8EEA, 0x0C6BD217156F8815,0x439D1F080BA22869,0x652E7C122E040C21, 0x1747E6D3B2983347,0x16B5B9143BDB4F64,0x0E17A5C775C2EE40, 0x53F23FAD5AC19C45,0x937348E6DECA163C,0x26D8F5211D908278, 0x2CA9D3196906EBAA,0x64D9C221B876DBE8,0xF5BD98B39765093A, 0xF2EFCBB39AC97411,0xA01C2699CADA8BBF,0x6ABC75F617DBEC7C, 0x23A862F326261E25,0x7DEF17B30E43CCF9,0xE454CB7EC51A1D90, 0x8D441891ABA6BEBE,0x2F2DA70DCC76EF77,0x439676424FA5A358, 0x49BBDCEE76067631,0xF63A6BD29775D777,0x5DFDDB9B12E8FCA9, 0x09A674E06451281A,0xE418486E062AC31D,0x3B180BBE4A1E515A, 0xD0CB5C961B63E731,0x9E8149929AD99C72,0xEC51E0A5193CA3EB, 0xFA21CE56A89D7E17,0xB08547231034F2EB,0xB0EEFD1E2BC1FBAA, 0x0A8AD2D2753F3F42,0xE283BEFA009FF8EC,0xE1D4FC1FF2132D83, 0x9DAE527A8DE56FF6,0x336F47D657E3EFB0,0x660AAEC7B4DA8111, 0xA6DCB60F391303AC,0xF85A3D5BF5D59398,0x900E22F664D6875E, 0xFA4C029F198DBAAD,0x4D773F305C40752E,0xEC2386ABD852D287, 0x7B1A582851235AEF,0x207FF1EA50D9D7E1,0xE969BE8B38C1865C, 0x99FA2391FD44F7B7,0x910EF30F8F61DACE,0x7E313EAFA58D460E, 0xCF3AC88D24E28A32,0x61B92C3C1990400C,0x940CE033C5F94165, 0xD035E3678AD93195,0x35CF0C9BA37347E2,0x7798C3C39EDF6978, 0x7FBFD530B558D69B,0xA6CF9EA4C6FD06A8,0x56E996F2C3C1629F, 0x0E1DC63B951C705C,0xCC124FBCD97D41DC,0x400342714ACDD337, 0x1365793B1B5E6497,0x869266F1299C7352,0xD74CEA89E67B7194, 0xC47E30EE84EF357F,0x0DB3483C5653CD54,0x8C9A962EB061CFE0, 0xBB242F2B4B07D64A,0x25814925B674FFAD,0x2ADFEB635DD35CC9, 0xAF510E642C60DA37,0x169475C9F7DC6F53,0xD4D553F641A01782, 0xE9FAEAEC2FFE94CE,0x4936FA1BBBD9097E,0x7B8A614E856107AB, 0xD21A345A686A03B4,0x50C20AC660123213,0x6997AFA323E3573D, 0x430C76E287C5D8F5,0x4BFE61429794D597,0xEDA7F3F70FF8F1A1, 0x0A137800E0F0F7E7,0x9C376D1E98B7BE7C,0x10F892DF487C4C27, 0x812AB00AB6486D79,0x24C3C23FA0CB549B,0x5F20AAC86BB637D8, 0xBF2FAD7CDA8F11B8,0x9B14B76D08EF72BE,0x8A0E0EEC190EBEBA, 0x8CF97F6ECE339C68} }; static uint64_t F(BLOWFISH_CTX *ctx, uint64_t x) { unsigned int a, b, c, d, e, f, g, h; uint64_t y; h = (unsigned int)(x & 0xFF); x >>= 8; g = (unsigned int)(x & 0xFF); x >>= 8; f = (unsigned int)(x & 0xFF); x >>= 8; e = (unsigned int)(x & 0xFF); x >>= 8; d = (unsigned int)(x & 0xFF); x >>= 8; c = (unsigned int)(x & 0xFF); x >>= 8; b = (unsigned int)(x & 0xFF); x >>= 8; a = (unsigned int)(x & 0xFF); y = ctx->S[0][a] + ctx->S[1][b]; y = y ^ ctx->S[2][c]; y = y + ctx->S[3][d]; y = y ^ ctx->S[4][e]; y = y + ctx->S[5][f]; y = y ^ ctx->S[6][g]; y = y + ctx->S[7][h]; return y; } void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uint64_t *xl, uint64_t *xr){ uint64_t Xl; uint64_t Xr; uint64_t temp; short i; Xl = *xl; Xr = *xr; for (i = 0; i < N; ++i) { Xl = Xl ^ ctx->P[i]; Xr = F(ctx, Xl) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[N]; Xl = Xl ^ ctx->P[N + 1]; *xl = Xl; *xr = Xr; } void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uint64_t *xl, uint64_t *xr){ uint64_t Xl; uint64_t Xr; uint64_t temp; short i; Xl = *xl; Xr = *xr; for (i = N + 1; i > 1; --i) { Xl = Xl ^ ctx->P[i]; Xr = F(ctx, Xl) ^ Xr; /* Exchange Xl and Xr */ temp = Xl; Xl = Xr; Xr = temp; } /* Exchange Xl and Xr */ temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[1]; Xl = Xl ^ ctx->P[0]; *xl = Xl; *xr = Xr; } void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) { int i, j, k; uint64_t data, datal, datar; for (i = 0; i < 8; i++) { for (j = 0; j < 256; j++) ctx->S[i][j] = ORIG_S[i][j]; } j = 0; for (i = 0; i < N + 2; ++i) { data = 0x0000000000000000; for (k = 0; k < 8; ++k) { data = (data << 8) | key[j]; j = j + 1; if (j >= keyLen) j = 0; } ctx->P[i] = ORIG_P[i] ^ data; } datal = 0x0000000000000000; datar = 0x0000000000000000; for (i = 0; i < N + 2; i += 2) { Blowfish_Encrypt(ctx, &datal, &datar); ctx->P[i] = datal; ctx->P[i + 1] = datar; } for (i = 0; i < 8; ++i) { for (j = 0; j < 256; j += 2) { Blowfish_Encrypt(ctx, &datal, &datar); ctx->S[i][j] = datal; ctx->S[i][j + 1] = datar; } } } void main(void) { printf("BLOWFISH II by Alexander PUKALL 2005\n 128-bit block 64 rounds\n key up to 4224 bits\n"); printf("Code can be freely use even for commercial software\n"); printf("Based on Blowfish 1997 by Paul Kocher\n"); uint64_t L,R; BLOWFISH_CTX ctx; /* Plaintext 128-bit block :0x00000000000000010000000000000002 */ L = 0x0000000000000001, R = 0x0000000000000002; // 64 bits L + 64 bits R = 128-bit block printf("Plaintext 128-bit block: %0.16llX %0.16llX\n",L, R); printf("Key: TESTKEY\n"); Blowfish_Init (&ctx, (unsigned char*)"TESTKEY", 7); Blowfish_Encrypt(&ctx, &L, &R); printf("Ciphertext 128-bit block: "); printf("%0.16llX %0.16llX\n",L, R); if (L == 0x7B2B9DE71D1B1C62 && R == 0x91C230351177BEE8) printf("Test encryption OK.\n"); else printf("Test encryption failed.\n"); Blowfish_Decrypt(&ctx, &L, &R); if (L == 1 && R == 2) printf("Test decryption OK.\n"); else printf("Test decryption failed.\n"); /* Plaintext 128-bit block :0x01020304050607080910111213141516 */ L=0x0102030405060708; R=0x0910111213141516; printf("\nPlaintext 128-bit block : %0.16llX %0.16llX\n",L, R); printf("Key: A\n"); Blowfish_Init (&ctx, (unsigned char*)"A", 1); Blowfish_Encrypt(&ctx, &L, &R); printf("Ciphertext 128-bit block: "); printf("%0.16llX %0.16llX\n", L, R); if (L == 0xCA38165603F9915C && R == 0x61F0776A0F55E807) printf("Test encryption OK.\n"); else printf("Test encryption failed.\n"); Blowfish_Decrypt(&ctx, &L, &R); if (L == 0x0102030405060708 && R == 0x0910111213141516) printf("Test decryption OK.\n"); else printf("Test decryption failed.\n"); /* Plaintext 128-bit block :0x01020304050607080910111213141516 */ L=0x0102030405060708; R=0x0910111213141516; printf("\nPlaintext 128-bit block: %0.16llX %0.16llX\n",L, R); printf("Key: B\n"); Blowfish_Init (&ctx, (unsigned char*)"B", 1); Blowfish_Encrypt(&ctx, &L, &R); printf("Ciphertext 128-bit block: "); printf("%0.16llX %0.16llX\n", L, R); if (L == 0xD07690A78B109983 && R == 0x8DDF85826F2366C2) printf("Test encryption OK.\n"); else printf("Test encryption failed.\n"); Blowfish_Decrypt(&ctx, &L, &R); if (L == 0x0102030405060708 && R == 0x0910111213141516) printf("Test decryption OK.\n"); else printf("Test decryption failed.\n"); }