Creating repository for dokuwiki modifications for sudaraka.org
[sudaraka-org:dokuwiki-mods.git] / inc / blowfish.php
1 <?php
2 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 /**
4  * The Cipher_blowfish:: class implements the Cipher interface enryption data
5  * using the Blowfish algorithm.
6  *
7  * $Horde: horde/lib/Cipher/blowfish.php,v 1.2.2.3 2003/01/03 13:23:22 jan Exp $
8  *
9  * Copyright 2002-2003 Mike Cochrane <mike@graftonhall.co.nz>
10  *
11  * See the enclosed file COPYING for license information (LGPL). If you
12  * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
13  *
14  * @author  Mike Cochrane <mike@graftonhall.co.nz>
15  * @version $Id: blowfish.php 11081 2008-01-25 09:35:48Z cybot_tm $
16  * @since   Horde 2.2
17  * @package horde.cipher
18  */
19
20 // Change for phpMyAdmin by lem9:
21 //class Horde_Cipher_blowfish extends Horde_Cipher {
22 class Horde_Cipher_blowfish
23 {
24     /* Pi Array */
25     var $p = array(
26             0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
27             0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
28             0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
29             0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
30             0x9216D5D9, 0x8979FB1B);
31
32     /* S Boxes */
33     var $s1 = array(
34             0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
35             0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
36             0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
37             0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
38             0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
39             0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
40             0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
41             0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
42             0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
43             0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
44             0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
45             0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
46             0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
47             0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
48             0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
49             0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
50             0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
51             0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
52             0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
53             0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
54             0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
55             0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
56             0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
57             0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
58             0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
59             0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
60             0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
61             0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
62             0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
63             0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
64             0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
65             0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
66             0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
67             0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
68             0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
69             0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
70             0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
71             0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
72             0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
73             0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
74             0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
75             0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
76             0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
77             0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
78             0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
79             0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
80             0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
81             0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
82             0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
83             0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
84             0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
85             0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
86             0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
87             0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
88             0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
89             0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
90             0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
91             0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
92             0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
93             0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
94             0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
95             0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
96             0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
97             0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A);
98     var $s2 = array(
99             0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
100             0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
101             0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
102             0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
103             0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
104             0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
105             0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
106             0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
107             0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
108             0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
109             0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
110             0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
111             0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
112             0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
113             0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
114             0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
115             0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
116             0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
117             0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
118             0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
119             0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
120             0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
121             0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
122             0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
123             0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
124             0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
125             0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
126             0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
127             0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
128             0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
129             0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
130             0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
131             0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
132             0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
133             0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
134             0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
135             0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
136             0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
137             0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
138             0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
139             0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
140             0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
141             0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
142             0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
143             0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
144             0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
145             0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
146             0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
147             0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
148             0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
149             0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
150             0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
151             0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
152             0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
153             0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
154             0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
155             0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
156             0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
157             0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
158             0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
159             0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
160             0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
161             0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
162             0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7);
163     var $s3 = array(
164             0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
165             0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
166             0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
167             0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
168             0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
169             0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
170             0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
171             0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
172             0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
173             0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
174             0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
175             0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
176             0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
177             0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
178             0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
179             0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
180             0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
181             0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
182             0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
183             0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
184             0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
185             0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
186             0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
187             0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
188             0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
189             0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
190             0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
191             0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
192             0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
193             0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
194             0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
195             0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
196             0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
197             0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
198             0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
199             0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
200             0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
201             0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
202             0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
203             0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
204             0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
205             0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
206             0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
207             0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
208             0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
209             0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
210             0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
211             0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
212             0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
213             0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
214             0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
215             0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
216             0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
217             0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
218             0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
219             0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
220             0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
221             0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
222             0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
223             0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
224             0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
225             0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
226             0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
227             0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0);
228     var $s4 = array(
229             0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
230             0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
231             0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
232             0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
233             0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
234             0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
235             0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
236             0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
237             0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
238             0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
239             0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
240             0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
241             0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
242             0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
243             0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
244             0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
245             0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
246             0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
247             0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
248             0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
249             0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
250             0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
251             0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
252             0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
253             0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
254             0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
255             0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
256             0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
257             0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
258             0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
259             0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
260             0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
261             0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
262             0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
263             0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
264             0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
265             0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
266             0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
267             0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
268             0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
269             0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
270             0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
271             0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
272             0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
273             0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
274             0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
275             0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
276             0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
277             0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
278             0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
279             0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
280             0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
281             0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
282             0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
283             0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
284             0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
285             0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
286             0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
287             0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
288             0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
289             0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
290             0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
291             0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
292             0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6);
293
294     /* The number of rounds to do */
295     var $_rounds = 16;
296
297     /**
298      * Set the key to be used for en/decryption
299      *
300      * @param String $key   The key to use
301      */
302     function setKey($key) {
303         $key = $this->_formatKey($key);
304         $keyPos = $keyXor = 0;
305
306         $iMax = count($this->p);
307         $keyLen = count($key);
308         for ($i = 0; $i < $iMax; $i++) {
309             for ($t = 0; $t < 4; $t++) {
310                 $keyXor = ($keyXor << 8) | (($key[$keyPos]) & 0x0ff);
311                 if (++$keyPos == $keyLen) {
312                     $keyPos = 0;
313                 }
314             }
315             $this->p[$i] = $this->p[$i] ^ $keyXor;
316         }
317
318         $encZero = array('L' => 0, 'R' => 0);
319         for ($i = 0; $i + 1 < $iMax; $i += 2) {
320             $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
321             $this->p[$i] = $encZero['L'];
322             $this->p[$i + 1] = $encZero['R'];
323         }
324
325         $iMax = count($this->s1);
326         for ($i = 0; $i < $iMax; $i += 2) {
327             $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
328             $this->s1[$i] = $encZero['L'];
329             $this->s1[$i + 1] = $encZero['R'];
330         }
331
332         $iMax = count($this->s2);
333         for ($i = 0; $i < $iMax; $i += 2) {
334             $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
335             $this->s2[$i] = $encZero['L'];
336             $this->s2[$i + 1] = $encZero['R'];
337         }
338
339         $iMax = count($this->s3);
340         for ($i = 0; $i < $iMax; $i += 2) {
341             $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
342             $this->s3[$i] = $encZero['L'];
343             $this->s3[$i + 1] = $encZero['R'];
344         }
345
346         $iMax = count($this->s4);
347         for ($i = 0; $i < $iMax; $i += 2) {
348             $encZero = $this->_encryptBlock($encZero['L'], $encZero['R']);
349             $this->s4[$i] = $encZero['L'];
350             $this->s4[$i + 1] = $encZero['R'];
351         }
352
353     }
354
355     /**
356      * Encrypt a block on data.
357      *
358      * @param String $block         The data to encrypt
359      * @param optional String $key  The key to use
360      *
361      * @return String the encrypted output
362      */
363     function encryptBlock($block, $key = null) {
364         if (!is_null($key)) {
365             $this->setKey($key);
366         }
367
368         list($L, $R) = array_values(unpack('N*', $block));
369         $parts = $this->_encryptBlock($L, $R);
370         return pack("NN", $parts['L'], $parts['R']);
371     }
372
373     /**
374      * Encrypt a block on data.
375      *
376      * @param String $L  The data to encrypt.
377      * @param String $R  The data to encrypt.
378      *
379      * @return String  The encrypted output.
380      */
381     function _encryptBlock($L, $R) {
382         $L ^= $this->p[0];
383         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[1];
384         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[2];
385         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[3];
386         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[4];
387         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[5];
388         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[6];
389         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[7];
390         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[8];
391         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[9];
392         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[10];
393         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[11];
394         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[12];
395         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[13];
396         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[14];
397         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[15];
398         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[16];
399         $R ^= $this->p[17];
400
401         return array('L' => $R, 'R' => $L);
402     }
403
404     /**
405      * Decrypt a block on data.
406      *
407      * @param String $block         The data to decrypt
408      * @param optional String $key  The key to use
409      *
410      * @return String the decrypted output
411      */
412     function decryptBlock($block, $key = null) {
413         if (!is_null($key)) {
414             $this->setKey($key);
415         }
416
417         // change for phpMyAdmin
418         $L = null;
419         $R = null;
420
421         $retarray = array_values(unpack('N*', $block));
422         if (isset($retarray[0])) {
423             $L = $retarray[0];
424         }
425         if (isset($retarray[1])) {
426             $R = $retarray[1];
427         }
428         // end change for phpMyAdmin
429
430         $L ^= $this->p[17];
431         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[16];
432         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[15];
433         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[14];
434         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[13];
435         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[12];
436         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[11];
437         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[10];
438         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[9];
439         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[8];
440         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[7];
441         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[6];
442         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[5];
443         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[4];
444         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[3];
445         $R ^= ((($this->s1[($L >> 24) & 0xFF] + $this->s2[($L >> 16) & 0x0ff]) ^ $this->s3[($L >> 8) & 0x0ff]) + $this->s4[$L & 0x0ff]) ^ $this->p[2];
446         $L ^= ((($this->s1[($R >> 24) & 0xFF] + $this->s2[($R >> 16) & 0x0ff]) ^ $this->s3[($R >> 8) & 0x0ff]) + $this->s4[$R & 0x0ff]) ^ $this->p[1];
447
448         $decrypted = pack("NN", $R ^ $this->p[0], $L);
449         return $decrypted;
450     }
451
452     /**
453      * Converts a text key into an array.
454      *
455      * @return array  The key.
456      */
457     function _formatKey($key) {
458         return array_values(unpack('C*', $key));
459     }
460
461 }
462
463 // higher-level functions:
464 /**
465  * Encryption using blowfish algorithm
466  *
467  * @param   string  original data
468  * @param   string  the secret
469  *
470  * @return  string  the encrypted result
471  *
472  * @access  public
473  *
474  * @author  lem9
475  */
476 function PMA_blowfish_encrypt($data, $secret) {
477     $pma_cipher = new Horde_Cipher_blowfish;
478     $encrypt = '';
479
480     $data .= '_'; // triming fixed for DokuWiki FS#1690 FS#1713
481     $mod = strlen($data) % 8;
482
483     if ($mod > 0) {
484         $data .= str_repeat("\0", 8 - $mod);
485     }
486
487     foreach (str_split($data, 8) as $chunk) {
488         $encrypt .= $pma_cipher->encryptBlock($chunk, $secret);
489     }
490     return base64_encode($encrypt);
491 }
492
493 /**
494  * Decryption using blowfish algorithm
495  *
496  * @param   string  encrypted data
497  * @param   string  the secret
498  *
499  * @return  string  original data
500  *
501  * @access  public
502  *
503  * @author  lem9
504  */
505 function PMA_blowfish_decrypt($encdata, $secret) {
506     $pma_cipher = new Horde_Cipher_blowfish;
507     $decrypt = '';
508     $data = base64_decode($encdata);
509
510     foreach (str_split($data, 8) as $chunk) {
511         $decrypt .= $pma_cipher->decryptBlock($chunk, $secret);
512     }
513     return substr(rtrim($decrypt, "\0"), 0, -1); // triming fixed for DokuWiki FS#1690 FS#1713
514 }