// PureNoise CryptoLib (c) 1997-2004, PureNoise Ltd Vaduz // Ruptor's Twofish implementation, optimized and fixed on 256-bit keys (recommended over Rijndael) in pure C #include #include "aes.h" // Finite field arithmetic for GF(2**8) with the modular // polynomial x**8 + x**6 + x**5 + x**3 + 1 (0x169) #define G_M 0x0169 #define q(n, x) q_tab[n][x] #define g0_fun(x) ks->twofish.mk_tab[0][byte4 (x, 0)] ^ ks->twofish.mk_tab[1][byte4 (x, 1)] ^ ks->twofish.mk_tab[2][byte4 (x, 2)] ^ ks->twofish.mk_tab[3][byte4 (x, 3)] #define g1_fun(x) ks->twofish.mk_tab[0][byte4 (x, 3)] ^ ks->twofish.mk_tab[1][byte4 (x, 0)] ^ ks->twofish.mk_tab[2][byte4 (x, 1)] ^ ks->twofish.mk_tab[3][byte4 (x, 2)] #define G_MOD 0x0000014d #define f_rnd(i) (t0 = g0_fun (blk[0]), t1 = g1_fun (blk[1]), blk[2] = rotr32 (blk[2] ^ (t0 + t1 + ks->twofish.key[4 * (i) + 8]), 1), blk[3] = rotl32 (blk[3], 1) ^ (t0 + 2 * t1 + ks->twofish.key[4 * (i) + 9]), t0 = g0_fun (blk[2]), t1 = g1_fun (blk[3]), blk[0] = rotr32 (blk[0] ^ (t0 + t1 + ks->twofish.key[4 * (i) + 10]), 1), blk[1] = rotl32 (blk[1], 1) ^ (t0 + 2 * t1 + ks->twofish.key[4 * (i) + 11])) #define i_rnd(i) (t0 = g0_fun (blk[0]), t1 = g1_fun (blk[1]), blk[2] = rotl32 (blk[2], 1) ^ (t0 + t1 + ks->twofish.key[4 * (i) + 10]), blk[3] = rotr32 (blk[3] ^ (t0 + 2 * t1 + ks->twofish.key[4 * (i) + 11]), 1), t0 = g0_fun (blk[2]), t1 = g1_fun (blk[3]), blk[0] = rotl32 (blk[0], 1) ^ (t0 + t1 + ks->twofish.key[4 * (i) + 8]), blk[1] = rotr32 (blk[1] ^ (t0 + 2 * t1 + ks->twofish.key[4 * (i) + 9]), 1)) static unsigned char q_tab[2][256] = { "\xA9\x67\xB3\xE8\x04\xFD\xA3\x76\x9A\x92\x80\x78\xE4\xDD\xD1\x38\x0D\xC6\x35\x98\x18\xF7\xEC\x6C\x43\x75\x37\x26\xFA\x13\x94\x48\xF2\xD0\x8B\x30\x84\x54\xDF\x23\x19\x5B\x3D\x59\xF3\xAE\xA2\x82\x63\x01\x83\x2E\xD9\x51\x9B\x7C\xA6\xEB\xA5\xBE\x16\x0C\xE3\x61" "\xC0\x8C\x3A\xF5\x73\x2C\x25\x0B\xBB\x4E\x89\x6B\x53\x6A\xB4\xF1\xE1\xE6\xBD\x45\xE2\xF4\xB6\x66\xCC\x95\x03\x56\xD4\x1C\x1E\xD7\xFB\xC3\x8E\xB5\xE9\xCF\xBF\xBA\xEA\x77\x39\xAF\x33\xC9\x62\x71\x81\x79\x09\xAD\x24\xCD\xF9\xD8\xE5\xC5\xB9\x4D\x44\x08\x86\xE7" "\xA1\x1D\xAA\xED\x06\x70\xB2\xD2\x41\x7B\xA0\x11\x31\xC2\x27\x90\x20\xF6\x60\xFF\x96\x5C\xB1\xAB\x9E\x9C\x52\x1B\x5F\x93\x0A\xEF\x91\x85\x49\xEE\x2D\x4F\x8F\x3B\x47\x87\x6D\x46\xD6\x3E\x69\x64\x2A\xCE\xCB\x2F\xFC\x97\x05\x7A\xAC\x7F\xD5\x1A\x4B\x0E\xA7\x5A" "\x28\x14\x3F\x29\x88\x3C\x4C\x02\xB8\xDA\xB0\x17\x55\x1F\x8A\x7D\x57\xC7\x8D\x74\xB7\xC4\x9F\x72\x7E\x15\x22\x12\x58\x07\x99\x34\x6E\x50\xDE\x68\x65\xBC\xDB\xF8\xC8\xA8\x2B\x40\xDC\xFE\x32\xA4\xCA\x10\x21\xF0\xD3\x5D\x0F\x00\x6F\x9D\x36\x42\x4A\x5E\xC1\xE0", "\x75\xF3\xC6\xF4\xDB\x7B\xFB\xC8\x4A\xD3\xE6\x6B\x45\x7D\xE8\x4B\xD6\x32\xD8\xFD\x37\x71\xF1\xE1\x30\x0F\xF8\x1B\x87\xFA\x06\x3F\x5E\xBA\xAE\x5B\x8A\x00\xBC\x9D\x6D\xC1\xB1\x0E\x80\x5D\xD2\xD5\xA0\x84\x07\x14\xB5\x90\x2C\xA3\xB2\x73\x4C\x54\x92\x74\x36\x51" "\x38\xB0\xBD\x5A\xFC\x60\x62\x96\x6C\x42\xF7\x10\x7C\x28\x27\x8C\x13\x95\x9C\xC7\x24\x46\x3B\x70\xCA\xE3\x85\xCB\x11\xD0\x93\xB8\xA6\x83\x20\xFF\x9F\x77\xC3\xCC\x03\x6F\x08\xBF\x40\xE7\x2B\xE2\x79\x0C\xAA\x82\x41\x3A\xEA\xB9\xE4\x9A\xA4\x97\x7E\xDA\x7A\x17" "\x66\x94\xA1\x1D\x3D\xF0\xDE\xB3\x0B\x72\xA7\x1C\xEF\xD1\x53\x3E\x8F\x33\x26\x5F\xEC\x76\x2A\x49\x81\x88\xEE\x21\xC4\x1A\xEB\xD9\xC5\x39\x99\xCD\xAD\x31\x8B\x01\x18\x23\xDD\x1F\x4E\x2D\xF9\x48\x4F\xF2\x65\x8E\x78\x5C\x58\x19\x8D\xE5\x98\x57\x67\x7F\x05\x64" "\xAF\x63\xB6\xFE\xF5\xB7\x3C\xA5\xCE\xE9\x68\x44\xE0\x4D\x43\x69\x29\x2E\xAC\x15\x59\xA8\x0A\x9E\x6E\x47\xDF\x34\x35\x6A\xCF\xDC\x22\xC9\xC0\x9B\x89\xD4\xED\xAB\x12\xA2\x0D\x52\xBB\x02\x2F\xA9\xD7\x61\x1E\xB4\x50\x04\xF6\xC2\x16\x25\x86\x56\x55\x09\xBE\x91" }; static unsigned long m_tab[4][256] = { { 0xBCBC3275U, 0xECEC21F3U, 0x202043C6U, 0xB3B3C9F4U, 0xDADA03DBU, 0x02028B7BU, 0xE2E22BFBU, 0x9E9EFAC8U, 0xC9C9EC4AU, 0xD4D409D3U, 0x18186BE6U, 0x1E1E9F6BU, 0x98980E45U, 0xB2B2387DU, 0xA6A6D2E8U, 0x2626B74BU, 0x3C3C57D6U, 0x93938A32U, 0x8282EED8U, 0x525298FDU, 0x7B7BD437U, 0xBBBB3771U, 0x5B5B97F1U, 0x474783E1U, 0x24243C30U, 0x5151E20FU, 0xBABAC6F8U, 0x4A4AF31BU, 0xBFBF4887U, 0x0D0D70FAU, 0xB0B0B306U, 0x7575DE3FU, 0xD2D2FD5EU, 0x7D7D20BAU, 0x666631AEU, 0x3A3AA35BU, 0x59591C8AU, 0x00000000U, 0xCDCD93BCU, 0x1A1AE09DU, 0xAEAE2C6DU, 0x7F7FABC1U, 0x2B2BC7B1U, 0xBEBEB90EU, 0xE0E0A080U, 0x8A8A105DU, 0x3B3B52D2U, 0x6464BAD5U, 0xD8D888A0U, 0xE7E7A584U, 0x5F5FE807U, 0x1B1B1114U, 0x2C2CC2B5U, 0xFCFCB490U, 0x3131272CU, 0x808065A3U, 0x73732AB2U, 0x0C0C8173U, 0x79795F4CU, 0x6B6B4154U, 0x4B4B0292U, 0x53536974U, 0x94948F36U, 0x83831F51U, 0x2A2A3638U, 0xC4C49CB0U, 0x2222C8BDU, 0xD5D5F85AU, 0xBDBDC3FCU, 0x48487860U, 0xFFFFCE62U, 0x4C4C0796U, 0x4141776CU, 0xC7C7E642U, 0xEBEB24F7U, 0x1C1C1410U, 0x5D5D637CU, 0x36362228U, 0x6767C027U, 0xE9E9AF8CU, 0x4444F913U, 0x1414EA95U, 0xF5F5BB9CU, 0xCFCF18C7U, 0x3F3F2D24U, 0xC0C0E346U, 0x7272DB3BU, 0x54546C70U, 0x29294CCAU, 0xF0F035E3U, 0x0808FE85U, 0xC6C617CBU, 0xF3F34F11U, 0x8C8CE4D0U, 0xA4A45993U, 0xCACA96B8U, 0x68683BA6U, 0xB8B84D83U, 0x38382820U, 0xE5E52EFFU, 0xADAD569FU, 0x0B0B8477U, 0xC8C81DC3U, 0x9999FFCCU, 0x5858ED03U, 0x19199A6FU, 0x0E0E0A08U, 0x95957EBFU, 0x70705040U, 0xF7F730E7U, 0x6E6ECF2BU, 0x1F1F6EE2U, 0xB5B53D79U, 0x09090F0CU, 0x616134AAU, 0x57571682U, 0x9F9F0B41U, 0x9D9D803AU, 0x111164EAU, 0x2525CDB9U, 0xAFAFDDE4U, 0x4545089AU, 0xDFDF8DA4U, 0xA3A35C97U, 0xEAEAD57EU, 0x353558DAU, 0xEDEDD07AU, 0x4343FC17U, 0xF8F8CB66U, 0xFBFBB194U, 0x3737D3A1U, 0xFAFA401DU, 0xC2C2683DU, 0xB4B4CCF0U, 0x32325DDEU, 0x9C9C71B3U, 0x5656E70BU, 0xE3E3DA72U, 0x878760A7U, 0x15151B1CU, 0xF9F93AEFU, 0x6363BFD1U, 0x3434A953U, 0x9A9A853EU, 0xB1B1428FU, 0x7C7CD133U, 0x88889B26U, 0x3D3DA65FU, 0xA1A1D7ECU, 0xE4E4DF76U, 0x8181942AU, 0x91910149U, 0x0F0FFB81U, 0xEEEEAA88U, 0x161661EEU, 0xD7D77321U, 0x9797F5C4U, 0xA5A5A81AU, 0xFEFE3FEBU, 0x6D6DB5D9U, 0x7878AEC5U, 0xC5C56D39U, 0x1D1DE599U, 0x7676A4CDU, 0x3E3EDCADU, 0xCBCB6731U, 0xB6B6478BU, 0xEFEF5B01U, 0x12121E18U, 0x6060C523U, 0x6A6AB0DDU, 0x4D4DF61FU, 0xCECEE94EU, 0xDEDE7C2DU, 0x55559DF9U, 0x7E7E5A48U, 0x2121B24FU, 0x03037AF2U, 0xA0A02665U, 0x5E5E198EU, 0x5A5A6678U, 0x65654B5CU, 0x62624E58U, 0xFDFD4519U, 0x0606F48DU, 0x404086E5U, 0xF2F2BE98U, 0x3333AC57U, 0x17179067U, 0x05058E7FU, 0xE8E85E05U, 0x4F4F7D64U, 0x89896AAFU, 0x10109563U, 0x74742FB6U, 0x0A0A75FEU, 0x5C5C92F5U, 0x9B9B74B7U, 0x2D2D333CU, 0x3030D6A5U, 0x2E2E49CEU, 0x494989E9U, 0x46467268U, 0x77775544U, 0xA8A8D8E0U, 0x9696044DU, 0x2828BD43U, 0xA9A92969U, 0xD9D97929U, 0x8686912EU, 0xD1D187ACU, 0xF4F44A15U, 0x8D8D1559U, 0xD6D682A8U, 0xB9B9BC0AU, 0x42420D9EU, 0xF6F6C16EU, 0x2F2FB847U, 0xDDDD06DFU, 0x23233934U, 0xCCCC6235U, 0xF1F1C46AU, 0xC1C112CFU, 0x8585EBDCU, 0x8F8F9E22U, 0x7171A1C9U, 0x9090F0C0U, 0xAAAA539BU, 0x0101F189U, 0x8B8BE1D4U, 0x4E4E8CEDU, 0x8E8E6FABU, 0xABABA212U, 0x6F6F3EA2U, 0xE6E6540DU, 0xDBDBF252U, 0x92927BBBU, 0xB7B7B602U, 0x6969CA2FU, 0x3939D9A9U, 0xD3D30CD7U, 0xA7A72361U, 0xA2A2AD1EU, 0xC3C399B4U, 0x6C6C4450U, 0x07070504U, 0x04047FF6U, 0x272746C2U, 0xACACA716U, 0xD0D07625U, 0x50501386U, 0xDCDCF756U, 0x84841A55U, 0xE1E15109U, 0x7A7A25BEU, 0x1313EF91U },{ 0xA9D93939U, 0x67901717U, 0xB3719C9CU, 0xE8D2A6A6U, 0x04050707U, 0xFD985252U, 0xA3658080U, 0x76DFE4E4U, 0x9A084545U, 0x92024B4BU, 0x80A0E0E0U, 0x78665A5AU, 0xE4DDAFAFU, 0xDDB06A6AU, 0xD1BF6363U, 0x38362A2AU, 0x0D54E6E6U, 0xC6432020U, 0x3562CCCCU, 0x98BEF2F2U, 0x181E1212U, 0xF724EBEBU, 0xECD7A1A1U, 0x6C774141U, 0x43BD2828U, 0x7532BCBCU, 0x37D47B7BU, 0x269B8888U, 0xFA700D0DU, 0x13F94444U, 0x94B1FBFBU, 0x485A7E7EU, 0xF27A0303U, 0xD0E48C8CU, 0x8B47B6B6U, 0x303C2424U, 0x84A5E7E7U, 0x54416B6BU, 0xDF06DDDDU, 0x23C56060U, 0x1945FDFDU, 0x5BA33A3AU, 0x3D68C2C2U, 0x59158D8DU, 0xF321ECECU, 0xAE316666U, 0xA23E6F6FU, 0x82165757U, 0x63951010U, 0x015BEFEFU, 0x834DB8B8U, 0x2E918686U, 0xD9B56D6DU, 0x511F8383U, 0x9B53AAAAU, 0x7C635D5DU, 0xA63B6868U, 0xEB3FFEFEU, 0xA5D63030U, 0xBE257A7AU, 0x16A7ACACU, 0x0C0F0909U, 0xE335F0F0U, 0x6123A7A7U, 0xC0F09090U, 0x8CAFE9E9U, 0x3A809D9DU, 0xF5925C5CU, 0x73810C0CU, 0x2C273131U, 0x2576D0D0U, 0x0BE75656U, 0xBB7B9292U, 0x4EE9CECEU, 0x89F10101U, 0x6B9F1E1EU, 0x53A93434U, 0x6AC4F1F1U, 0xB499C3C3U, 0xF1975B5BU, 0xE1834747U, 0xE66B1818U, 0xBDC82222U, 0x450E9898U, 0xE26E1F1FU, 0xF4C9B3B3U, 0xB62F7474U, 0x66CBF8F8U, 0xCCFF9999U, 0x95EA1414U, 0x03ED5858U, 0x56F7DCDCU, 0xD4E18B8BU, 0x1C1B1515U, 0x1EADA2A2U, 0xD70CD3D3U, 0xFB2BE2E2U, 0xC31DC8C8U, 0x8E195E5EU, 0xB5C22C2CU, 0xE9894949U, 0xCF12C1C1U, 0xBF7E9595U, 0xBA207D7DU, 0xEA641111U, 0x77840B0BU, 0x396DC5C5U, 0xAF6A8989U, 0x33D17C7CU, 0xC9A17171U, 0x62CEFFFFU, 0x7137BBBBU, 0x81FB0F0FU, 0x793DB5B5U, 0x0951E1E1U, 0xADDC3E3EU, 0x242D3F3FU, 0xCDA47676U, 0xF99D5555U, 0xD8EE8282U, 0xE5864040U, 0xC5AE7878U, 0xB9CD2525U, 0x4D049696U, 0x44557777U, 0x080A0E0EU, 0x86135050U, 0xE730F7F7U, 0xA1D33737U, 0x1D40FAFAU, 0xAA346161U, 0xED8C4E4EU, 0x06B3B0B0U, 0x706C5454U, 0xB22A7373U, 0xD2523B3BU, 0x410B9F9FU, 0x7B8B0202U, 0xA088D8D8U, 0x114FF3F3U, 0x3167CBCBU, 0xC2462727U, 0x27C06767U, 0x90B4FCFCU, 0x20283838U, 0xF67F0404U, 0x60784848U, 0xFF2EE5E5U, 0x96074C4CU, 0x5C4B6565U, 0xB1C72B2BU, 0xAB6F8E8EU, 0x9E0D4242U, 0x9CBBF5F5U, 0x52F2DBDBU, 0x1BF34A4AU, 0x5FA63D3DU, 0x9359A4A4U, 0x0ABCB9B9U, 0xEF3AF9F9U, 0x91EF1313U, 0x85FE0808U, 0x49019191U, 0xEE611616U, 0x2D7CDEDEU, 0x4FB22121U, 0x8F42B1B1U, 0x3BDB7272U, 0x47B82F2FU, 0x8748BFBFU, 0x6D2CAEAEU, 0x46E3C0C0U, 0xD6573C3CU, 0x3E859A9AU, 0x6929A9A9U, 0x647D4F4FU, 0x2A948181U, 0xCE492E2EU, 0xCB17C6C6U, 0x2FCA6969U, 0xFCC3BDBDU, 0x975CA3A3U, 0x055EE8E8U, 0x7AD0EDEDU, 0xAC87D1D1U, 0x7F8E0505U, 0xD5BA6464U, 0x1AA8A5A5U, 0x4BB72626U, 0x0EB9BEBEU, 0xA7608787U, 0x5AF8D5D5U, 0x28223636U, 0x14111B1BU, 0x3FDE7575U, 0x2979D9D9U, 0x88AAEEEEU, 0x3C332D2DU, 0x4C5F7979U, 0x02B6B7B7U, 0xB896CACAU, 0xDA583535U, 0xB09CC4C4U, 0x17FC4343U, 0x551A8484U, 0x1FF64D4DU, 0x8A1C5959U, 0x7D38B2B2U, 0x57AC3333U, 0xC718CFCFU, 0x8DF40606U, 0x74695353U, 0xB7749B9BU, 0xC4F59797U, 0x9F56ADADU, 0x72DAE3E3U, 0x7ED5EAEAU, 0x154AF4F4U, 0x229E8F8FU, 0x12A2ABABU, 0x584E6262U, 0x07E85F5FU, 0x99E51D1DU, 0x34392323U, 0x6EC1F6F6U, 0x50446C6CU, 0xDE5D3232U, 0x68724646U, 0x6526A0A0U, 0xBC93CDCDU, 0xDB03DADAU, 0xF8C6BABAU, 0xC8FA9E9EU, 0xA882D6D6U, 0x2BCF6E6EU, 0x40507070U, 0xDCEB8585U, 0xFE750A0AU, 0x328A9393U, 0xA48DDFDFU, 0xCA4C2929U, 0x10141C1CU, 0x2173D7D7U, 0xF0CCB4B4U, 0xD309D4D4U, 0x5D108A8AU, 0x0FE25151U, 0x00000000U, 0x6F9A1919U, 0x9DE01A1AU, 0x368F9494U, 0x42E6C7C7U, 0x4AECC9C9U, 0x5EFDD2D2U, 0xC1AB7F7FU, 0xE0D8A8A8U },{ 0xBC75BC32U, 0xECF3EC21U, 0x20C62043U, 0xB3F4B3C9U, 0xDADBDA03U, 0x027B028BU, 0xE2FBE22BU, 0x9EC89EFAU, 0xC94AC9ECU, 0xD4D3D409U, 0x18E6186BU, 0x1E6B1E9FU, 0x9845980EU, 0xB27DB238U, 0xA6E8A6D2U, 0x264B26B7U, 0x3CD63C57U, 0x9332938AU, 0x82D882EEU, 0x52FD5298U, 0x7B377BD4U, 0xBB71BB37U, 0x5BF15B97U, 0x47E14783U, 0x2430243CU, 0x510F51E2U, 0xBAF8BAC6U, 0x4A1B4AF3U, 0xBF87BF48U, 0x0DFA0D70U, 0xB006B0B3U, 0x753F75DEU, 0xD25ED2FDU, 0x7DBA7D20U, 0x66AE6631U, 0x3A5B3AA3U, 0x598A591CU, 0x00000000U, 0xCDBCCD93U, 0x1A9D1AE0U, 0xAE6DAE2CU, 0x7FC17FABU, 0x2BB12BC7U, 0xBE0EBEB9U, 0xE080E0A0U, 0x8A5D8A10U, 0x3BD23B52U, 0x64D564BAU, 0xD8A0D888U, 0xE784E7A5U, 0x5F075FE8U, 0x1B141B11U, 0x2CB52CC2U, 0xFC90FCB4U, 0x312C3127U, 0x80A38065U, 0x73B2732AU, 0x0C730C81U, 0x794C795FU, 0x6B546B41U, 0x4B924B02U, 0x53745369U, 0x9436948FU, 0x8351831FU, 0x2A382A36U, 0xC4B0C49CU, 0x22BD22C8U, 0xD55AD5F8U, 0xBDFCBDC3U, 0x48604878U, 0xFF62FFCEU, 0x4C964C07U, 0x416C4177U, 0xC742C7E6U, 0xEBF7EB24U, 0x1C101C14U, 0x5D7C5D63U, 0x36283622U, 0x672767C0U, 0xE98CE9AFU, 0x441344F9U, 0x149514EAU, 0xF59CF5BBU, 0xCFC7CF18U, 0x3F243F2DU, 0xC046C0E3U, 0x723B72DBU, 0x5470546CU, 0x29CA294CU, 0xF0E3F035U, 0x088508FEU, 0xC6CBC617U, 0xF311F34FU, 0x8CD08CE4U, 0xA493A459U, 0xCAB8CA96U, 0x68A6683BU, 0xB883B84DU, 0x38203828U, 0xE5FFE52EU, 0xAD9FAD56U, 0x0B770B84U, 0xC8C3C81DU, 0x99CC99FFU, 0x580358EDU, 0x196F199AU, 0x0E080E0AU, 0x95BF957EU, 0x70407050U, 0xF7E7F730U, 0x6E2B6ECFU, 0x1FE21F6EU, 0xB579B53DU, 0x090C090FU, 0x61AA6134U, 0x57825716U, 0x9F419F0BU, 0x9D3A9D80U, 0x11EA1164U, 0x25B925CDU, 0xAFE4AFDDU, 0x459A4508U, 0xDFA4DF8DU, 0xA397A35CU, 0xEA7EEAD5U, 0x35DA3558U, 0xED7AEDD0U, 0x431743FCU, 0xF866F8CBU, 0xFB94FBB1U, 0x37A137D3U, 0xFA1DFA40U, 0xC23DC268U, 0xB4F0B4CCU, 0x32DE325DU, 0x9CB39C71U, 0x560B56E7U, 0xE372E3DAU, 0x87A78760U, 0x151C151BU, 0xF9EFF93AU, 0x63D163BFU, 0x345334A9U, 0x9A3E9A85U, 0xB18FB142U, 0x7C337CD1U, 0x8826889BU, 0x3D5F3DA6U, 0xA1ECA1D7U, 0xE476E4DFU, 0x812A8194U, 0x91499101U, 0x0F810FFBU, 0xEE88EEAAU, 0x16EE1661U, 0xD721D773U, 0x97C497F5U, 0xA51AA5A8U, 0xFEEBFE3FU, 0x6DD96DB5U, 0x78C578AEU, 0xC539C56DU, 0x1D991DE5U, 0x76CD76A4U, 0x3EAD3EDCU, 0xCB31CB67U, 0xB68BB647U, 0xEF01EF5BU, 0x1218121EU, 0x602360C5U, 0x6ADD6AB0U, 0x4D1F4DF6U, 0xCE4ECEE9U, 0xDE2DDE7CU, 0x55F9559DU, 0x7E487E5AU, 0x214F21B2U, 0x03F2037AU, 0xA065A026U, 0x5E8E5E19U, 0x5A785A66U, 0x655C654BU, 0x6258624EU, 0xFD19FD45U, 0x068D06F4U, 0x40E54086U, 0xF298F2BEU, 0x335733ACU, 0x17671790U, 0x057F058EU, 0xE805E85EU, 0x4F644F7DU, 0x89AF896AU, 0x10631095U, 0x74B6742FU, 0x0AFE0A75U, 0x5CF55C92U, 0x9BB79B74U, 0x2D3C2D33U, 0x30A530D6U, 0x2ECE2E49U, 0x49E94989U, 0x46684672U, 0x77447755U, 0xA8E0A8D8U, 0x964D9604U, 0x284328BDU, 0xA969A929U, 0xD929D979U, 0x862E8691U, 0xD1ACD187U, 0xF415F44AU, 0x8D598D15U, 0xD6A8D682U, 0xB90AB9BCU, 0x429E420DU, 0xF66EF6C1U, 0x2F472FB8U, 0xDDDFDD06U, 0x23342339U, 0xCC35CC62U, 0xF16AF1C4U, 0xC1CFC112U, 0x85DC85EBU, 0x8F228F9EU, 0x71C971A1U, 0x90C090F0U, 0xAA9BAA53U, 0x018901F1U, 0x8BD48BE1U, 0x4EED4E8CU, 0x8EAB8E6FU, 0xAB12ABA2U, 0x6FA26F3EU, 0xE60DE654U, 0xDB52DBF2U, 0x92BB927BU, 0xB702B7B6U, 0x692F69CAU, 0x39A939D9U, 0xD3D7D30CU, 0xA761A723U, 0xA21EA2ADU, 0xC3B4C399U, 0x6C506C44U, 0x07040705U, 0x04F6047FU, 0x27C22746U, 0xAC16ACA7U, 0xD025D076U, 0x50865013U, 0xDC56DCF7U, 0x8455841AU, 0xE109E151U, 0x7ABE7A25U, 0x139113EFU },{ 0xD939A9D9U, 0x90176790U, 0x719CB371U, 0xD2A6E8D2U, 0x05070405U, 0x9852FD98U, 0x6580A365U, 0xDFE476DFU, 0x08459A08U, 0x024B9202U, 0xA0E080A0U, 0x665A7866U, 0xDDAFE4DDU, 0xB06ADDB0U, 0xBF63D1BFU, 0x362A3836U, 0x54E60D54U, 0x4320C643U, 0x62CC3562U, 0xBEF298BEU, 0x1E12181EU, 0x24EBF724U, 0xD7A1ECD7U, 0x77416C77U, 0xBD2843BDU, 0x32BC7532U, 0xD47B37D4U, 0x9B88269BU, 0x700DFA70U, 0xF94413F9U, 0xB1FB94B1U, 0x5A7E485AU, 0x7A03F27AU, 0xE48CD0E4U, 0x47B68B47U, 0x3C24303CU, 0xA5E784A5U, 0x416B5441U, 0x06DDDF06U, 0xC56023C5U, 0x45FD1945U, 0xA33A5BA3U, 0x68C23D68U, 0x158D5915U, 0x21ECF321U, 0x3166AE31U, 0x3E6FA23EU, 0x16578216U, 0x95106395U, 0x5BEF015BU, 0x4DB8834DU, 0x91862E91U, 0xB56DD9B5U, 0x1F83511FU, 0x53AA9B53U, 0x635D7C63U, 0x3B68A63BU, 0x3FFEEB3FU, 0xD630A5D6U, 0x257ABE25U, 0xA7AC16A7U, 0x0F090C0FU, 0x35F0E335U, 0x23A76123U, 0xF090C0F0U, 0xAFE98CAFU, 0x809D3A80U, 0x925CF592U, 0x810C7381U, 0x27312C27U, 0x76D02576U, 0xE7560BE7U, 0x7B92BB7BU, 0xE9CE4EE9U, 0xF10189F1U, 0x9F1E6B9FU, 0xA93453A9U, 0xC4F16AC4U, 0x99C3B499U, 0x975BF197U, 0x8347E183U, 0x6B18E66BU, 0xC822BDC8U, 0x0E98450EU, 0x6E1FE26EU, 0xC9B3F4C9U, 0x2F74B62FU, 0xCBF866CBU, 0xFF99CCFFU, 0xEA1495EAU, 0xED5803EDU, 0xF7DC56F7U, 0xE18BD4E1U, 0x1B151C1BU, 0xADA21EADU, 0x0CD3D70CU, 0x2BE2FB2BU, 0x1DC8C31DU, 0x195E8E19U, 0xC22CB5C2U, 0x8949E989U, 0x12C1CF12U, 0x7E95BF7EU, 0x207DBA20U, 0x6411EA64U, 0x840B7784U, 0x6DC5396DU, 0x6A89AF6AU, 0xD17C33D1U, 0xA171C9A1U, 0xCEFF62CEU, 0x37BB7137U, 0xFB0F81FBU, 0x3DB5793DU, 0x51E10951U, 0xDC3EADDCU, 0x2D3F242DU, 0xA476CDA4U, 0x9D55F99DU, 0xEE82D8EEU, 0x8640E586U, 0xAE78C5AEU, 0xCD25B9CDU, 0x04964D04U, 0x55774455U, 0x0A0E080AU, 0x13508613U, 0x30F7E730U, 0xD337A1D3U, 0x40FA1D40U, 0x3461AA34U, 0x8C4EED8CU, 0xB3B006B3U, 0x6C54706CU, 0x2A73B22AU, 0x523BD252U, 0x0B9F410BU, 0x8B027B8BU, 0x88D8A088U, 0x4FF3114FU, 0x67CB3167U, 0x4627C246U, 0xC06727C0U, 0xB4FC90B4U, 0x28382028U, 0x7F04F67FU, 0x78486078U, 0x2EE5FF2EU, 0x074C9607U, 0x4B655C4BU, 0xC72BB1C7U, 0x6F8EAB6FU, 0x0D429E0DU, 0xBBF59CBBU, 0xF2DB52F2U, 0xF34A1BF3U, 0xA63D5FA6U, 0x59A49359U, 0xBCB90ABCU, 0x3AF9EF3AU, 0xEF1391EFU, 0xFE0885FEU, 0x01914901U, 0x6116EE61U, 0x7CDE2D7CU, 0xB2214FB2U, 0x42B18F42U, 0xDB723BDBU, 0xB82F47B8U, 0x48BF8748U, 0x2CAE6D2CU, 0xE3C046E3U, 0x573CD657U, 0x859A3E85U, 0x29A96929U, 0x7D4F647DU, 0x94812A94U, 0x492ECE49U, 0x17C6CB17U, 0xCA692FCAU, 0xC3BDFCC3U, 0x5CA3975CU, 0x5EE8055EU, 0xD0ED7AD0U, 0x87D1AC87U, 0x8E057F8EU, 0xBA64D5BAU, 0xA8A51AA8U, 0xB7264BB7U, 0xB9BE0EB9U, 0x6087A760U, 0xF8D55AF8U, 0x22362822U, 0x111B1411U, 0xDE753FDEU, 0x79D92979U, 0xAAEE88AAU, 0x332D3C33U, 0x5F794C5FU, 0xB6B702B6U, 0x96CAB896U, 0x5835DA58U, 0x9CC4B09CU, 0xFC4317FCU, 0x1A84551AU, 0xF64D1FF6U, 0x1C598A1CU, 0x38B27D38U, 0xAC3357ACU, 0x18CFC718U, 0xF4068DF4U, 0x69537469U, 0x749BB774U, 0xF597C4F5U, 0x56AD9F56U, 0xDAE372DAU, 0xD5EA7ED5U, 0x4AF4154AU, 0x9E8F229EU, 0xA2AB12A2U, 0x4E62584EU, 0xE85F07E8U, 0xE51D99E5U, 0x39233439U, 0xC1F66EC1U, 0x446C5044U, 0x5D32DE5DU, 0x72466872U, 0x26A06526U, 0x93CDBC93U, 0x03DADB03U, 0xC6BAF8C6U, 0xFA9EC8FAU, 0x82D6A882U, 0xCF6E2BCFU, 0x50704050U, 0xEB85DCEBU, 0x750AFE75U, 0x8A93328AU, 0x8DDFA48DU, 0x4C29CA4CU, 0x141C1014U, 0x73D72173U, 0xCCB4F0CCU, 0x09D4D309U, 0x108A5D10U, 0xE2510FE2U, 0x00000000U, 0x9A196F9AU, 0xE01A9DE0U, 0x8F94368FU, 0xE6C742E6U, 0xECC94AECU, 0xFDD25EFDU, 0xAB7FC1ABU, 0xD8A8E0D8U } }; static unsigned long __forceinline h_fun (const unsigned long x, const unsigned char *key) { return m_tab[0][q(0,q(0,q(1,q(1,byte4ord(x,0))^key[ord4(12)])^key[ord4( 8)])^key[ord4(4)])^key[ord4(0)]] ^ m_tab[1][q(0,q(1,q(1,q(0,byte4ord(x,1))^key[ord4(13)])^key[ord4( 9)])^key[ord4(5)])^key[ord4(1)]] ^ m_tab[2][q(1,q(0,q(0,q(0,byte4ord(x,2))^key[ord4(14)])^key[ord4(10)])^key[ord4(6)])^key[ord4(2)]] ^ m_tab[3][q(1,q(1,q(0,q(1,byte4ord(x,3))^key[ord4(15)])^key[ord4(11)])^key[ord4(7)])^key[ord4(3)]]; } /* The (12,8) Reed Soloman code has the generator polynomial g(x) = x**4 + (a + 1/a) * x**3 + a * x**2 + (a + 1/a) * x + 1 where the coefficients are in the finite field GF(2**8) with a modular polynomial a**8 + a**6 + a**3 + a**2 + 1. To generate the remainder we have to start with a 12th order polynomial with our eight input bytes as the coefficients of the 4th to 11th terms. That is: m[7] * x**11 + m[6] * x**10 ... + m[0] * x**4 + 0 * x**3 +... + 0 We then multiply the generator polynomial by m[7] * x**7 and subtract it - xor in GF(2**8) - from the above to eliminate the x**7 term (the artihmetic on the coefficients is done in GF(2**8). We then multiply the generator polynomial by x**6 * coeff(x**10) and use this to remove the x**10 term. We carry on in this way until the x**4 term is removed so that we are left with: r[3] * x**3 + r[2] * x**2 + r[1] * x**1 + r[0] which give the resulting 4 bytes of the remainder. This is equivalent to the matrix multiplication in the Twofish description but much faster to implement. */ static unsigned long mds_rem (unsigned long p0, unsigned long p1) { unsigned long i, t, u; for (i = 0; i < 8; ++i) { t = p1 >> 24; p1 = (p1 << 8) | (p0 >> 24); p0 <<= 8; u = (t << 1) ^ (t & 0x80 ? G_MOD : 0); p1 ^= t ^ (u << 16); u ^= (t >> 1) ^ (t & 0x01 ? G_MOD >> 1 : 0); p1 ^= (u << 8) | (u << 24); } return p1; } aes_keystream * twofish_setkey (const unsigned long *key, aes_keystream *ks) { unsigned long i, j, a, b, me_key[4], mo_key[4]; unsigned char b0, b1, b2, b3; OCTET z_key[2]; for (i = 0; i < 4; i++) { a = lsf32 (key[i + i]); b = lsf32 (key[i + i + 1]); me_key[i] = a; mo_key[i] = b; z_key->D[4 - i - 1] = mds_rem (a, b); } for (i = 0, j = 0; i < 40; i += 2) { a = j; j+= 0x01010101; b = j; j+= 0x01010101; a = h_fun (a, (unsigned char *) me_key); b = rotl32 (h_fun (b, (unsigned char *) mo_key), 8); ks->twofish.key[i] = a + b; ks->twofish.key[i + 1] = rotl32 (a + 2 * b, 9); } for (i = 0; i < 256; ++i) { b0 = q (1, i) ^ z_key->B[ord4 (12)]; b1 = q (0, i) ^ z_key->B[ord4 (13)]; b2 = q (0, i) ^ z_key->B[ord4 (14)]; b3 = q (1, i) ^ z_key->B[ord4 (15)]; b0 = q (1, b0) ^ z_key->B[ord4 ( 8)]; b1 = q (1, b1) ^ z_key->B[ord4 ( 9)]; b2 = q (0, b2) ^ z_key->B[ord4 (10)]; b3 = q (0, b3) ^ z_key->B[ord4 (11)]; b0 = q (0, q (0, b0) ^ z_key->B[ord4 (4)]) ^ z_key->B[ord4 (0)]; b1 = q (0, q (1, b1) ^ z_key->B[ord4 (5)]) ^ z_key->B[ord4 (1)]; b2 = q (1, q (0, b2) ^ z_key->B[ord4 (6)]) ^ z_key->B[ord4 (2)]; b3 = q (1, q (1, b3) ^ z_key->B[ord4 (7)]) ^ z_key->B[ord4 (3)]; ks->twofish.mk_tab[0][i] = m_tab[0][b0]; ks->twofish.mk_tab[1][i] = m_tab[1][b1]; ks->twofish.mk_tab[2][i] = m_tab[2][b2]; ks->twofish.mk_tab[3][i] = m_tab[3][b3]; } return ks; } OCTET * twofish_encrypt (OCTET one_block[2], const aes_keystream *ks) { unsigned long t0, t1, blk[4]; blk[0] = lsf32 (one_block->D[0]) ^ ks->twofish.key[0]; blk[1] = lsf32 (one_block->D[1]) ^ ks->twofish.key[1]; blk[2] = lsf32 (one_block->D[2]) ^ ks->twofish.key[2]; blk[3] = lsf32 (one_block->D[3]) ^ ks->twofish.key[3]; f_rnd(0); f_rnd(1); f_rnd(2); f_rnd(3); f_rnd(4); f_rnd(5); f_rnd(6); f_rnd(7); one_block->D[0] = lsf32 (blk[2] ^ ks->twofish.key[4]); one_block->D[1] = lsf32 (blk[3] ^ ks->twofish.key[5]); one_block->D[2] = lsf32 (blk[0] ^ ks->twofish.key[6]); one_block->D[3] = lsf32 (blk[1] ^ ks->twofish.key[7]); return one_block; } OCTET * twofish_decrypt (OCTET one_block[2], const aes_keystream *ks) { unsigned long t0, t1, blk[4]; blk[0] = lsf32 (one_block->D[0]) ^ ks->twofish.key[4]; blk[1] = lsf32 (one_block->D[1]) ^ ks->twofish.key[5]; blk[2] = lsf32 (one_block->D[2]) ^ ks->twofish.key[6]; blk[3] = lsf32 (one_block->D[3]) ^ ks->twofish.key[7]; i_rnd (7); i_rnd (6); i_rnd (5); i_rnd (4); i_rnd (3); i_rnd (2); i_rnd (1); i_rnd (0); one_block->D[0] = lsf32 (blk[2] ^ ks->twofish.key[0]); one_block->D[1] = lsf32 (blk[3] ^ ks->twofish.key[1]); one_block->D[2] = lsf32 (blk[0] ^ ks->twofish.key[2]); one_block->D[3] = lsf32 (blk[1] ^ ks->twofish.key[3]); return one_block; }