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