]> git.stg.codes - stg.git/blob - stglibs/crypto.lib/blowfish.c
crypto.lib is now a plain C library
[stg.git] / stglibs / crypto.lib / blowfish.c
1 /*
2  * Author     :  Paul Kocher
3  * E-mail     :  pck@netcom.com
4  * Date       :  1997
5  * Description:  C implementation of the Blowfish algorithm.
6  */
7
8 #include <string.h>
9
10 #include "stg/const.h"
11 #include "blowfish.h"
12
13 #define ENCRYPT 0
14 #define DECRYPT 1
15
16 #define endianBig ((unsigned char) 0x45)
17 #define endianLittle ((unsigned char) 0x54)
18
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)
23 #endif
24
25 #ifndef S_ISREG
26     #define S_ISREG(x) ( ((x)&S_IFMT)==S_IFREG )
27 #endif
28
29
30 #define N               16
31
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
39 };
40
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},
106
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},
171
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},
236
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}
301 };
302 //-----------------------------------------------------------------------------
303 uint32_t F(BLOWFISH_CTX *ctx, uint32_t x) 
304 {
305 unsigned short a, b, c, d;
306 uint32_t  y = 0;
307 //uint32_t  y1, y2;
308
309 d = x & 0x00FF;
310 x >>= 8;
311 c = x & 0x00FF;
312 x >>= 8;
313 b = x & 0x00FF;
314 x >>= 8;
315 a = x & 0x00FF;
316
317 /*y1 = ctx->S[0][a];
318 y2 = ctx->S[1][b];
319 y = y1+y2;*/
320
321 y = ctx->S[0][a] + ctx->S[1][b];
322 y = y ^ ctx->S[2][c];
323 y = y + ctx->S[3][d];
324 return y;
325 }
326 //-----------------------------------------------------------------------------
327 void Blowfish_Encrypt(BLOWFISH_CTX *ctx, uint32_t *xl, uint32_t *xr)
328 {
329 uint32_t  Xl;
330 uint32_t  Xr;
331 uint32_t  temp;
332 short   i;
333
334 Xl = *xl;
335 Xr = *xr;
336
337 for (i = 0; i < N; ++i)
338     {
339     Xl = Xl ^ ctx->P[i];
340     Xr = F(ctx, Xl) ^ Xr;
341     temp = Xl;
342     Xl = Xr;
343     Xr = temp;
344     }
345
346 temp = Xl;
347 Xl = Xr;
348 Xr = temp;
349 Xr = Xr ^ ctx->P[N];
350 Xl = Xl ^ ctx->P[N + 1];
351 *xl = Xl;
352 *xr = Xr;
353 }
354 //-----------------------------------------------------------------------------
355 void Blowfish_Decrypt(BLOWFISH_CTX *ctx, uint32_t *xl, uint32_t *xr)
356 {
357 uint32_t  Xl;
358 uint32_t  Xr;
359 uint32_t  temp;
360 short       i;
361
362 Xl = *xl;
363 Xr = *xr;
364
365 for (i = N + 1; i > 1; --i)
366     {
367     Xl = Xl ^ ctx->P[i];
368     Xr = F(ctx, Xl) ^ Xr;
369     /* Exchange Xl and Xr */
370     temp = Xl;
371     Xl = Xr;
372     Xr = temp;
373     }
374
375 /* Exchange Xl and Xr */
376 temp = Xl;
377 Xl = Xr;
378 Xr = temp;
379 Xr = Xr ^ ctx->P[1];
380 Xl = Xl ^ ctx->P[0];
381 *xl = Xl;
382 *xr = Xr;
383 }
384 //-----------------------------------------------------------------------------
385 void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen)
386 {
387 int i, j, k;
388 uint32_t data, datal, datar;
389
390 memset(ctx->S, 0, sizeof(ctx->S));
391
392 for (i = 0; i < 4; i++)
393     {
394
395     for (j = 0; j < 256; j++)
396         ctx->S[i][j] = ORIG_S[i][j];
397     }
398
399 j = 0;
400
401 for (i = 0; i < N + 2; ++i)
402     {
403     data = 0x00000000;
404
405     for (k = 0; k < 4; ++k)
406         {
407         data = (data << 8) | key[j];
408         j = j + 1;
409         if (j >= keyLen)
410             j = 0;
411         }
412
413     ctx->P[i] = ORIG_P[i] ^ data;
414     }
415
416 datal = 0x00000000;
417 datar = 0x00000000;
418
419 for (i = 0; i < N + 2; i += 2)
420     {
421     Blowfish_Encrypt(ctx, &datal, &datar);
422     ctx->P[i] = datal;
423     ctx->P[i + 1] = datar;
424     }
425
426 for (i = 0; i < 4; ++i)
427     {
428
429     for (j = 0; j < 256; j += 2)
430         {
431         Blowfish_Encrypt(ctx, &datal, &datar);
432         ctx->S[i][j] = datal;
433         ctx->S[i][j + 1] = datar;
434         }
435     }
436 }
437 //-----------------------------------------------------------------------------
438 void EnDecodeInit(const char * passwd, int length, BLOWFISH_CTX *ctx)
439 {
440 unsigned char keyL[PASSWD_LEN];
441
442 memset(keyL, 0, PASSWD_LEN);
443
444 strncpy((char *)keyL, passwd, PASSWD_LEN);
445
446 Blowfish_Init(ctx, keyL, PASSWD_LEN);
447 }
448 //-----------------------------------------------------------------------------
449 // Note: swap bytes order for compatibility with OpenSSL
450 uint32_t bytes2block(const char * c)
451 {
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;
456     return t;
457 }
458 //-----------------------------------------------------------------------------
459 // Note: swap bytes order for compatibility with OpenSSL
460 void block2bytes(uint32_t t, char * c)
461 {
462     *c++ = t & 0x000000FF;
463     *c++ = t >> 8 & 0x000000FF;
464     *c++ = t >> 16 & 0x000000FF;
465     *c = t >> 24 & 0x000000FF;
466 }
467 //-----------------------------------------------------------------------------
468 void DecodeString(char * d, const char * s, BLOWFISH_CTX *ctx)
469 {
470 uint32_t a = bytes2block(s);
471 uint32_t b = bytes2block(s + 4);
472
473 Blowfish_Decrypt(ctx, &a, &b);
474
475 block2bytes(a, d);
476 block2bytes(b, d + 4);
477 }
478 //-----------------------------------------------------------------------------
479 void EncodeString(char * d, const char * s, BLOWFISH_CTX *ctx)
480 {
481 uint32_t a = bytes2block(s);
482 uint32_t b = bytes2block(s + 4);
483
484 Blowfish_Encrypt(ctx, &a, &b);
485
486 block2bytes(a, d);
487 block2bytes(b, d + 4);
488 }
489 //-----------------------------------------------------------------------------