3 * E-mail : pck@netcom.com
5 * Description: C implementation of the Blowfish algorithm.
10 #include "stg/const.h"
16 #define endianBig ((unsigned char) 0x45)
17 #define endianLittle ((unsigned char) 0x54)
19 #ifdef WIN32 /* Win32 doesn't have random() or lstat */
20 #define random() rand()
21 #define initstate(x,y,z) srand(x)
22 #define lstat(x,y) stat(x,y)
26 #define S_ISREG(x) ( ((x)&S_IFMT)==S_IFREG )
32 static uint32_t F(BLOWFISH_CTX *ctx, uint32_t x);
33 static const uint32_t ORIG_P[16 + 2] = {
34 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
35 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
36 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
37 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
38 0x9216D5D9L, 0x8979FB1BL
41 static const uint32_t ORIG_S[4][256] = {
42 { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
43 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
44 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
45 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
46 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
47 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
48 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
49 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
50 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
51 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
52 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
53 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
54 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
55 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
56 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
57 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
58 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
59 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
60 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
61 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
62 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
63 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
64 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
65 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
66 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
67 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
68 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
69 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
70 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
71 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
72 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
73 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
74 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
75 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
76 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
77 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
78 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
79 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
80 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
81 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
82 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
83 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
84 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
85 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
86 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
87 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
88 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
89 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
90 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
91 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
92 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
93 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
94 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
95 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
96 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
97 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
98 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
99 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
100 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
101 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
102 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
103 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
104 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
105 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL},
107 { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
108 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
109 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
110 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
111 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
112 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
113 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
114 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
115 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
116 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
117 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
118 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
119 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
120 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
121 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
122 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
123 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
124 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
125 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
126 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
127 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
128 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
129 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
130 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
131 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
132 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
133 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
134 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
135 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
136 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
137 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
138 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
139 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
140 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
141 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
142 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
143 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
144 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
145 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
146 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
147 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
148 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
149 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
150 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
151 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
152 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
153 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
154 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
155 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
156 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
157 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
158 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
159 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
160 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
161 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
162 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
163 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
164 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
165 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
166 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
167 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
168 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
169 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
170 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L},
172 { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
173 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
174 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
175 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
176 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
177 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
178 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
179 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
180 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
181 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
182 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
183 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
184 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
185 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
186 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
187 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
188 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
189 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
190 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
191 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
192 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
193 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
194 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
195 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
196 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
197 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
198 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
199 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
200 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
201 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
202 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
203 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
204 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
205 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
206 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
207 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
208 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
209 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
210 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
211 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
212 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
213 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
214 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
215 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
216 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
217 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
218 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
219 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
220 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
221 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
222 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
223 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
224 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
225 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
226 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
227 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
228 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
229 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
230 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
231 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
232 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
233 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
234 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
235 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L},
237 { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
238 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
239 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
240 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
241 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
242 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
243 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
244 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
245 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
246 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
247 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
248 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
249 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
250 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
251 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
252 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
253 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
254 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
255 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
256 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
257 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
258 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
259 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
260 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
261 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
262 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
263 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
264 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
265 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
266 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
267 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
268 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
269 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
270 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
271 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
272 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
273 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
274 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
275 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
276 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
277 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
278 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
279 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
280 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
281 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
282 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
283 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
284 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
285 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
286 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
287 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
288 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
289 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
290 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
291 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
292 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
293 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
294 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
295 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
296 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
297 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
298 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
299 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
300 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L}
302 //-----------------------------------------------------------------------------
303 uint32_t F(BLOWFISH_CTX *ctx, uint32_t x)
305 unsigned short a, b, c, d;
321 y = ctx->S[0][a] + ctx->S[1][b];
322 y = y ^ ctx->S[2][c];
323 y = y + ctx->S[3][d];
326 //-----------------------------------------------------------------------------
327 void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uint32_t *xl, uint32_t *xr)
337 for (i = 0; i < N; ++i)
340 Xr = F(ctx, Xl) ^ Xr;
350 Xl = Xl ^ ctx->P[N + 1];
354 //-----------------------------------------------------------------------------
355 void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uint32_t *xl, uint32_t *xr)
365 for (i = N + 1; i > 1; --i)
368 Xr = F(ctx, Xl) ^ Xr;
369 /* Exchange Xl and Xr */
375 /* Exchange Xl and Xr */
384 //-----------------------------------------------------------------------------
385 void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen)
388 uint32_t data, datal, datar;
390 memset(ctx->S, 0, sizeof(ctx->S));
392 for (i = 0; i < 4; i++)
395 for (j = 0; j < 256; j++)
396 ctx->S[i][j] = ORIG_S[i][j];
401 for (i = 0; i < N + 2; ++i)
405 for (k = 0; k < 4; ++k)
407 data = (data << 8) | key[j];
413 ctx->P[i] = ORIG_P[i] ^ data;
419 for (i = 0; i < N + 2; i += 2)
421 Blowfish_Encrypt(ctx, &datal, &datar);
423 ctx->P[i + 1] = datar;
426 for (i = 0; i < 4; ++i)
429 for (j = 0; j < 256; j += 2)
431 Blowfish_Encrypt(ctx, &datal, &datar);
432 ctx->S[i][j] = datal;
433 ctx->S[i][j + 1] = datar;
437 //-----------------------------------------------------------------------------
438 void EnDecodeInit(const char * passwd, int length, BLOWFISH_CTX *ctx)
440 unsigned char keyL[PASSWD_LEN];
442 memset(keyL, 0, PASSWD_LEN);
444 strncpy((char *)keyL, passwd, PASSWD_LEN);
446 Blowfish_Init(ctx, keyL, PASSWD_LEN);
448 //-----------------------------------------------------------------------------
449 // Note: swap bytes order for compatibility with OpenSSL
450 uint32_t bytes2block(const char * c)
452 uint32_t t = (unsigned char)(*c++);
453 t += (unsigned char)(*c++) << 8;
454 t += (unsigned char)(*c++) << 16;
455 t += (unsigned char)(*c) << 24;
458 //-----------------------------------------------------------------------------
459 // Note: swap bytes order for compatibility with OpenSSL
460 void block2bytes(uint32_t t, char * c)
462 *c++ = t & 0x000000FF;
463 *c++ = t >> 8 & 0x000000FF;
464 *c++ = t >> 16 & 0x000000FF;
465 *c = t >> 24 & 0x000000FF;
467 //-----------------------------------------------------------------------------
468 void DecodeString(char * d, const char * s, BLOWFISH_CTX *ctx)
470 uint32_t a = bytes2block(s);
471 uint32_t b = bytes2block(s + 4);
473 Blowfish_Decrypt(ctx, &a, &b);
476 block2bytes(b, d + 4);
478 //-----------------------------------------------------------------------------
479 void EncodeString(char * d, const char * s, BLOWFISH_CTX *ctx)
481 uint32_t a = bytes2block(s);
482 uint32_t b = bytes2block(s + 4);
484 Blowfish_Encrypt(ctx, &a, &b);
487 block2bytes(b, d + 4);
489 //-----------------------------------------------------------------------------