00001
00002
00003
00004
00005
00006
00007
00008 #include "blowfish.h"
00009 #define N 16
00010
00011 static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x);
00012 static const uInt32 ORIG_P[16 + 2] = {
00013 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
00014 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
00015 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
00016 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
00017 0x9216D5D9L, 0x8979FB1BL
00018 };
00019
00020 static const uInt32 ORIG_S[4][256] = {
00021 { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
00022 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
00023 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
00024 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
00025 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
00026 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
00027 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
00028 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
00029 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
00030 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
00031 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
00032 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
00033 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
00034 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
00035 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
00036 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
00037 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
00038 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
00039 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
00040 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
00041 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
00042 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
00043 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
00044 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
00045 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
00046 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
00047 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
00048 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
00049 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
00050 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
00051 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
00052 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
00053 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
00054 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
00055 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
00056 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
00057 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
00058 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
00059 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
00060 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
00061 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
00062 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
00063 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
00064 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
00065 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
00066 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
00067 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
00068 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
00069 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
00070 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
00071 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
00072 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
00073 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
00074 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
00075 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
00076 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
00077 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
00078 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
00079 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
00080 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
00081 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
00082 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
00083 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
00084 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
00085
00086 { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
00087 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
00088 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
00089 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
00090 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
00091 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
00092 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
00093 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
00094 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
00095 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
00096 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
00097 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
00098 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
00099 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
00100 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
00101 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
00102 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
00103 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
00104 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
00105 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
00106 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
00107 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
00108 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
00109 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
00110 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
00111 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
00112 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
00113 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
00114 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
00115 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
00116 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
00117 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
00118 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
00119 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
00120 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
00121 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
00122 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
00123 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
00124 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
00125 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
00126 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
00127 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
00128 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
00129 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
00130 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
00131 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
00132 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
00133 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
00134 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
00135 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
00136 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
00137 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
00138 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
00139 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
00140 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
00141 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
00142 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
00143 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
00144 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
00145 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
00146 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
00147 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
00148 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
00149 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
00150
00151 { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
00152 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
00153 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
00154 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
00155 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
00156 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
00157 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
00158 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
00159 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
00160 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
00161 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
00162 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
00163 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
00164 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
00165 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
00166 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
00167 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
00168 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
00169 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
00170 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
00171 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
00172 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
00173 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
00174 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
00175 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
00176 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
00177 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
00178 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
00179 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
00180 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
00181 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
00182 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
00183 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
00184 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
00185 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
00186 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
00187 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
00188 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
00189 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
00190 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
00191 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
00192 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
00193 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
00194 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
00195 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
00196 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
00197 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
00198 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
00199 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
00200 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
00201 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
00202 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
00203 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
00204 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
00205 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
00206 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
00207 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
00208 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
00209 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
00210 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
00211 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
00212 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
00213 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
00214 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
00215
00216 { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
00217 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
00218 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
00219 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
00220 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
00221 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
00222 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
00223 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
00224 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
00225 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
00226 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
00227 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
00228 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
00229 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
00230 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
00231 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
00232 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
00233 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
00234 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
00235 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
00236 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
00237 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
00238 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
00239 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
00240 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
00241 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
00242 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
00243 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
00244 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
00245 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
00246 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
00247 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
00248 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
00249 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
00250 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
00251 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
00252 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
00253 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
00254 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
00255 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
00256 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
00257 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
00258 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
00259 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
00260 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
00261 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
00262 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
00263 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
00264 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
00265 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
00266 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
00267 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
00268 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
00269 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
00270 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
00271 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
00272 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
00273 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
00274 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
00275 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
00276 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
00277 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
00278 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
00279 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
00280 };
00281 uInt32 F(BLOWFISH_CTX *ctx, uInt32 x) {
00282 unsigned short a, b, c, d;
00283 uInt32 y;
00284
00285 d = x & 0x00FF;
00286 x >>= 8;
00287 c = x & 0x00FF;
00288 x >>= 8;
00289 b = x & 0x00FF;
00290 x >>= 8;
00291 a = x & 0x00FF;
00292
00293 y = ctx->S[0][a] + ctx->S[1][b];
00294 y = y ^ ctx->S[2][c];
00295 y = y + ctx->S[3][d];
00296 return y;
00297 }
00298
00299 void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uInt32 *xl, uInt32
00300 *xr) {
00301 uInt32 Xl;
00302 uInt32 Xr;
00303 uInt32 temp;
00304 short i;
00305
00306 Xl = *xl;
00307 Xr = *xr;
00308
00309 for (i = 0; i < N; ++i) {
00310 Xl = Xl ^ ctx->P[i];
00311 Xr = F(ctx, Xl) ^ Xr;
00312 temp = Xl;
00313 Xl = Xr;
00314 Xr = temp;
00315 }
00316
00317 temp = Xl;
00318 Xl = Xr;
00319 Xr = temp;
00320 Xr = Xr ^ ctx->P[N];
00321 Xl = Xl ^ ctx->P[N + 1];
00322 *xl = Xl;
00323 *xr = Xr;
00324 }
00325
00326 void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uInt32 *xl, uInt32
00327 *xr) {
00328 uInt32 Xl;
00329 uInt32 Xr;
00330 uInt32 temp;
00331 short i;
00332
00333 Xl = *xl;
00334 Xr = *xr;
00335
00336 for (i = N + 1; i > 1; --i) {
00337 Xl = Xl ^ ctx->P[i];
00338 Xr = F(ctx, Xl) ^ Xr;
00339
00340 temp = Xl;
00341 Xl = Xr;
00342 Xr = temp;
00343 }
00344
00345
00346 temp = Xl;
00347 Xl = Xr;
00348 Xr = temp;
00349 Xr = Xr ^ ctx->P[1];
00350 Xl = Xl ^ ctx->P[0];
00351 *xl = Xl;
00352 *xr = Xr;
00353 }
00354
00355 void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) {
00356 int i, j, k;
00357 uInt32 data, datal, datar;
00358
00359 for (i = 0; i < 4; i++) {
00360
00361 for (j = 0; j < 256; j++)
00362 ctx->S[i][j] = ORIG_S[i][j];
00363 }
00364
00365 j = 0;
00366
00367 for (i = 0; i < N + 2; ++i) {
00368 data = 0x00000000;
00369
00370 for (k = 0; k < 4; ++k) {
00371 data = (data << 8) | key[j];
00372 j = j + 1;
00373 if (j >= keyLen)
00374 j = 0;
00375 }
00376
00377 ctx->P[i] = ORIG_P[i] ^ data;
00378 }
00379
00380 datal = 0x00000000;
00381 datar = 0x00000000;
00382
00383 for (i = 0; i < N + 2; i += 2) {
00384 Blowfish_Encrypt(ctx, &datal, &datar);
00385 ctx->P[i] = datal;
00386 ctx->P[i + 1] = datar;
00387 }
00388
00389 for (i = 0; i < 4; ++i) {
00390
00391 for (j = 0; j < 256; j += 2) {
00392 Blowfish_Encrypt(ctx, &datal, &datar);
00393 ctx->S[i][j] = datal;
00394 ctx->S[i][j + 1] = datar;
00395 }
00396 }
00397 }