Make duplicate script compatible with Python 3
[wdl/wdl-ol.git] / WDL / blowfish.c
blobeed9a8f8062e36aa08812d77fb4e476f5f1e2427
1 /*
2 * Author : Paul Kocher
3 * E-mail : pck@netcom.com
4 * Date : 1997
5 * Description: C implementation of the Blowfish algorithm.
7 */
9 #include "blowfish.h"
11 #define N 16
13 static const unsigned int ORIG_P[16 + 2] = {
14 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
15 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
16 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
17 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
18 0x9216D5D9L, 0x8979FB1BL
22 static const unsigned int 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 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
88 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
89 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
90 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
91 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
92 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
93 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
94 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
95 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
96 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
97 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
98 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
99 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
100 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
101 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
102 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
103 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
104 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
105 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
106 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
107 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
108 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
109 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
110 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
111 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
112 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
113 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
114 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
115 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
116 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
117 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
118 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
119 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
120 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
121 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
122 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
123 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
124 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
125 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
126 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
127 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
128 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
129 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
130 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
131 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
132 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
133 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
134 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
135 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
136 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
137 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
138 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
139 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
140 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
141 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
142 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
143 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
144 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
145 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
146 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
147 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
148 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
149 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
150 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L,
151 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
152 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
153 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
154 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
155 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
156 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
157 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
158 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
159 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
160 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
161 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
162 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
163 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
164 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
165 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
166 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
167 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
168 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
169 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
170 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
171 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
172 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
173 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
174 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
175 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
176 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
177 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
178 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
179 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
180 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
181 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
182 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
183 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
184 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
185 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
186 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
187 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
188 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
189 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
190 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
191 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
192 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
193 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
194 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
195 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
196 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
197 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
198 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
199 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
200 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
201 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
202 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
203 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
204 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
205 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
206 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
207 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
208 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
209 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
210 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
211 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
212 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
213 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
214 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L,
215 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
216 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
217 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
218 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
219 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
220 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
221 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
222 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
223 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
224 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
225 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
226 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
227 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
228 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
229 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
230 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
231 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
232 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
233 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
234 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
235 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
236 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
237 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
238 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
239 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
240 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
241 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
242 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
243 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
244 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
245 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
246 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
247 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
248 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
249 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
250 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
251 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
252 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
253 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
254 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
255 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
256 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
257 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
258 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
259 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
260 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
261 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
262 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
263 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
264 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
265 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
266 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
267 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
268 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
269 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
270 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
271 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
272 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
273 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
274 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
275 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
276 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
277 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
278 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L
282 #define F(x) (((s[(x>>24)&0xff] + s[256+((x>>16)&0xff)]) ^ s[512+((x>>8)&0xff)]) + s[768+(x&0xff)])
284 static char __bigE;
286 static void BSWAPONBIGE(unsigned int *a,unsigned int *a2)
288 if (__bigE>0)
290 unsigned char *b=(unsigned char *)a;
291 unsigned char c=b[0];
292 b[0]=b[3];
293 b[3]=c;
294 c=b[1];
295 b[1]=b[2];
296 b[2]=c;
298 b=(unsigned char *)a2;
299 c=b[0];
300 b[0]=b[3];
301 b[3]=c;
302 c=b[1];
303 b[1]=b[2];
304 b[2]=c;
309 void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr)
311 BSWAPONBIGE(xl,xr);
313 unsigned int Xl=*xl;
314 unsigned int Xr=*xr;
315 int i=N/2;
316 unsigned int *p=ctx->P;
317 unsigned int *s=(unsigned int *)ctx->S;
318 while (i--)
320 Xl ^= *p++;
321 Xr ^= F(Xl) ^ *p++;
322 Xl ^= F(Xr);
324 *xr = Xl ^ *p++;
325 *xl = Xr ^ *p;
327 BSWAPONBIGE(xl,xr);
330 void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned int *xl, unsigned int *xr)
332 BSWAPONBIGE(xl,xr);
334 unsigned int Xl=*xl;
335 unsigned int Xr=*xr;
336 unsigned int *p=ctx->P + N + 1;
337 unsigned int *s=(unsigned int *)ctx->S;
338 int i=N/2;
339 while (i--)
341 Xl ^= *p--;
342 Xr ^= F(Xl) ^ *p--;
343 Xl ^= F(Xr);
345 *xr = Xl ^ *p--;
346 *xl = Xr ^ *p;
348 BSWAPONBIGE(xl,xr);
351 void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) {
352 int i, j=0;
353 unsigned int *s=(unsigned int *)ORIG_P;
354 unsigned int *p=ctx->P;
356 unsigned int datal=0, datar=0;
358 if (!__bigE)
360 int a=1;
361 __bigE = (*(char *)&a) ? -1 : 1;
364 i=N+2;
365 while (i--)
367 int k=4;
368 unsigned int data = 0;
369 while (k--)
371 data = (data << 8) | key[j];
372 if (++j >= keyLen) j = 0;
374 *p++=*s++ ^ data;
376 for(i=0;i<256*4; i++) ctx->S[i]=ORIG_S[i];
378 p=ctx->P;
379 i=(N+2)/2;
380 while (i--)
382 BSWAPONBIGE(&datal,&datar);
383 Blowfish_Encrypt(ctx, &datal, &datar);
384 BSWAPONBIGE(&datal,&datar);
385 *p++=datal;
386 *p++=datar;
389 s=ctx->S;
390 i=256/2*4;
391 while (i--)
393 BSWAPONBIGE(&datal,&datar);
394 Blowfish_Encrypt(ctx, &datal, &datar);
395 BSWAPONBIGE(&datal,&datar);
396 *s++ = datal;
397 *s++ = datar;