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