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