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