Code

Added check to class_plugin::check() to prevent calling $this->config->member_functio...
[gosa.git] / include / heimdal / deslib.php
1 <?php
2 /*
3  * deslib.php,v 1.0 2006/08/25 21:00:00
4  *
5  * Copyright 2006 Alejandro Escanero Blanco <aescanero@chaosdimension.org>
6  *
7  * See the enclosed file COPYING for license information (GPL).  If you
8  * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
9  */
12 class Des{
14         var $in;
15         var $out;
16         var $key;
17         var $schedule1;
18         var $schedule2;
19         var $schedule3;
21         function add1($a,$b,$len){
22                 $carry=0;
23                 for ($i=$len-1;$i>=0;$i--){
24                         $x=$a[$i]+$b[$i]+$carry;
25                         if($x > 0xff) $carry=1;else $carry=0;
26                         $a[$i] = $x & 0xff;
27                 }
28                 for($i = $len - 1; $carry!=0 && $i!=0; $i--){
29                         $x = $a[$i] + $carry;
30                         if($x > 0xff) $carry=1;else $carry=0;
31                         $a[$i] = $x & 0xff;
32                 }
33                 return ($a);
34         }
35         
36         function _krb5_n_fold($str,$size){ //str=passREALMname
37                 $len=strlen($str);
38                 if($size>$len) $maxlen=2*$size;
39                 else $maxlen=2*$len;
40                 $l=0;
41                 $key=array($size);
42                 $tmp=array($maxlen);
43                 $tmpi=0;
44                 for ($i=0;$i<$maxlen;$i++) $tmp[$i]=0;
45                 for ($i=0;$i<$size;$i++) $key[$i]=0;
46                 $buf=$str;
47                 do{
48                         for ($i=0; $i<$len;$i++) $tmp[$tmpi+$l+$i]=ord(substr($buf,$i,1));
49                         $l+=$len;
50                         $buf=$this->srr13($buf,strlen($buf)*8);
51                         while($l>=$size){
52                                 $key=$this->add1($key,$tmp,$size);
53                                 $l-=$size;
54                                 if($l==0) break;
55                                 for ($i=0;$i<$l;$i++) $tmp[$i]=$tmp[$i+$size];
56                         }
57                 }while ($l!=0);
58 /*              $stringh="";
59                 for($i=0;$i<$size;$i++) $stringh.=sprintf("%02x",$key[$i]);
60                 print "EKEY: ".$stringh."\n";*/
61                 $skey="";
62                 for($i=0;$i<$size;$i++) $skey.=chr($key[$i]);
63                 return($skey);
64         }
65         
66         function srr13($sbuf,$len){
67                 
68                 $buf=array(strlen($sbuf));
69                 for($i=0;$i<strlen($sbuf);$i++) $buf[$i]=ord(substr($sbuf,$i,1));
70                 $bytes = floor(($len + 7) / 8);
71                 $tmp=array($bytes);
72                 for($i=0;$i<$bytes;$i++) $tmp[$i]=0;
73                 
74                 $bits = 13 % $len;
75                 $lbit = $len % 8;
76                 for($i=0;$i<$bytes;$i++) $tmp[$i]=$buf[$i];
77                 if($lbit!=0){
78                         $tmp[$bytes - 1] &= (0xff << (8 - $lbit));
79                         for($i = $lbit; $i < 8; $i += $len)
80                         $tmp[$bytes - 1] |= $buf[0] >> $i;
81                 }
82                 for($i = 0; $i < $bytes; $i++) {
83                 $bb = 8 * $i - $bits;
84                 while($bb < 0)
85                         $bb += $len;
86                 $b1 = floor($bb / 8);
87                 $s1 = $bb % 8;
88                 
89                 if($bb + 8 > $bytes * 8) 
90                         $s2 = ($len + 8 - $s1) % 8;
91                 else 
92                         $s2 = 8 - $s1;
93                 $b2 = ($b1 + 1) % $bytes;
94                 $buf[$i] = (($tmp[$b1]) << $s1) | (($tmp[$b2]) >> $s2);
95                 }
96                 $slen=strlen($sbuf);
97                 $sbuf="";
98                 for($i=0;$i<$slen;$i++) $sbuf.=chr($buf[$i]);
99                 return($sbuf);
100         
101         }
103         function load($achar,$aint){            //Array=char(8), Array=int32(2)
104                 $aint[0] =  $achar[0] << 24;
105                 $aint[0] |= $achar[1] << 16;
106                 $aint[0] |= $achar[2] << 8;
107                 $aint[0] |= $achar[3] << 0;
108                 $aint[1] =  $achar[4] << 24;
109                 $aint[1] |= $achar[5] << 16;
110                 $aint[1] |= $achar[6] << 8;
111                 $aint[1] |= $achar[7] << 0;
112         }
114         function store($aint,$achar){           //Array=int32(2),Array=char(8)
115                 $achar[0] = ($aint[0] >> 24) & 0xff;
116                 $achar[1] = ($aint[0] >> 16) & 0xff;
117                 $achar[2] = ($aint[0] >>  8) & 0xff;
118                 $achar[3] = ($aint[0] >>  0) & 0xff;
119                 $achar[4] = ($aint[1] >> 24) & 0xff;
120                 $achar[5] = ($aint[1] >> 16) & 0xff;
121                 $achar[6] = ($aint[1] >>  8) & 0xff;
122                 $achar[7] = ($aint[1] >>  0) & 0xff;
123         }
125         function IP($v){                //v=Array int(2)
126                 $work=0;
127                 $work = (($v[0] >> 4) ^ $v[1]) & 0x0f0f0f0f;
128                 $v[1] ^= $work;
129                 $v[0] ^= ($work << 4);
130                 $work = (($v[0] >> 16) ^ $v[1]) & 0x0000ffff;
131                 $v[1] ^= $work;
132                 $v[0] ^= ($work << 16);
133                 $work = (($v[1] >> 2) ^ $v[0]) & 0x33333333;
134                 $v[0] ^= $work;
135                 $v[1] ^= ($work << 2);
136                 $work = (($v[1] >> 8) ^ $v[0]) & 0x00ff00ff;
137                 $v[0] ^= $work;
138                 $v[1] ^= ($work << 8);
139                 $v[1] = (($v[1] << 1) | (($v[1] >> 31) & 1)) & 0xffffffff;
140                 $work = ($v[0] ^ $v[1]) & 0xaaaaaaaa;
141                 $v[0] ^= $work;
142                 $v[1] ^= $work;
143                 $v[0] = (($v[0] << 1) | (($v[0] >> 31) & 1)) & 0xffffffff;
144         }
146         function FP($v){                //v=Array int(2)
148                 $work=0;
149                 
150                 $v[0] = ($v[0] << 31) | (($v[0] >> 1) & 0x7fffffff);
151                 $work = ($v[1] ^ $v[0]) & 0xaaaaaaaa;
152                 $v[1] ^= $work;
153                 $v[0] ^= $work;
154                 $v[1] = ($v[1] << 31) | (($v[1] >> 1) & 0x7fffffff);
155                 $work = (($v[1] >> 8) ^ $v[0]) & 0x00ff00ff;
156                 $v[0] ^= $work;
157                 $v[1] ^= ($work << 8);
158                 $work = (($v[1] >> 2) ^ $v[0]) & 0x33333333;
159                 $v[0] ^= $work;
160                 $v[1] ^= ($work << 2);
161                 $work = (($v[0] >> 16) ^ $v[1]) & 0x0000ffff;
162                 $v[1] ^= $work;
163                 $v[0] ^= ($work << 16);
164                 $work = (($v[0] >> 4) ^ $v[1]) & 0x0f0f0f0f;
165                 $v[1] ^= $work;
166                 $v[0] ^= ($work << 4);
167         }
169         function desx($aint,$ks,$comp){
170                 $SP = array(
171                         array(
172                                 0x01010400, 0x00000000, 0x00010000, 0x01010404,
173                                 0x01010004, 0x00010404, 0x00000004, 0x00010000,
174                                 0x00000400, 0x01010400, 0x01010404, 0x00000400,
175                                 0x01000404, 0x01010004, 0x01000000, 0x00000004,
176                                 0x00000404, 0x01000400, 0x01000400, 0x00010400,
177                                 0x00010400, 0x01010000, 0x01010000, 0x01000404,
178                                 0x00010004, 0x01000004, 0x01000004, 0x00010004,
179                                 0x00000000, 0x00000404, 0x00010404, 0x01000000,
180                                 0x00010000, 0x01010404, 0x00000004, 0x01010000,
181                                 0x01010400, 0x01000000, 0x01000000, 0x00000400,
182                                 0x01010004, 0x00010000, 0x00010400, 0x01000004,
183                                 0x00000400, 0x00000004, 0x01000404, 0x00010404,
184                                 0x01010404, 0x00010004, 0x01010000, 0x01000404,
185                                 0x01000004, 0x00000404, 0x00010404, 0x01010400,
186                                 0x00000404, 0x01000400, 0x01000400, 0x00000000,
187                                 0x00010004, 0x00010400, 0x00000000, 0x01010004
188                         ),
189                         array(
190                                 0x80108020, 0x80008000, 0x00008000, 0x00108020,
191                                 0x00100000, 0x00000020, 0x80100020, 0x80008020,
192                                 0x80000020, 0x80108020, 0x80108000, 0x80000000,
193                                 0x80008000, 0x00100000, 0x00000020, 0x80100020,
194                                 0x00108000, 0x00100020, 0x80008020, 0x00000000,
195                                 0x80000000, 0x00008000, 0x00108020, 0x80100000,
196                                 0x00100020, 0x80000020, 0x00000000, 0x00108000,
197                                 0x00008020, 0x80108000, 0x80100000, 0x00008020,
198                                 0x00000000, 0x00108020, 0x80100020, 0x00100000,
199                                 0x80008020, 0x80100000, 0x80108000, 0x00008000,
200                                 0x80100000, 0x80008000, 0x00000020, 0x80108020,
201                                 0x00108020, 0x00000020, 0x00008000, 0x80000000,
202                                 0x00008020, 0x80108000, 0x00100000, 0x80000020,
203                                 0x00100020, 0x80008020, 0x80000020, 0x00100020,
204                                 0x00108000, 0x00000000, 0x80008000, 0x00008020,
205                                 0x80000000, 0x80100020, 0x80108020, 0x00108000
206                         ),
207                         array(
208                                 0x00000208, 0x08020200, 0x00000000, 0x08020008,
209                                 0x08000200, 0x00000000, 0x00020208, 0x08000200,
210                                 0x00020008, 0x08000008, 0x08000008, 0x00020000,
211                                 0x08020208, 0x00020008, 0x08020000, 0x00000208,
212                                 0x08000000, 0x00000008, 0x08020200, 0x00000200,
213                                 0x00020200, 0x08020000, 0x08020008, 0x00020208,
214                                 0x08000208, 0x00020200, 0x00020000, 0x08000208,
215                                 0x00000008, 0x08020208, 0x00000200, 0x08000000,
216                                 0x08020200, 0x08000000, 0x00020008, 0x00000208,
217                                 0x00020000, 0x08020200, 0x08000200, 0x00000000,
218                                 0x00000200, 0x00020008, 0x08020208, 0x08000200,
219                                 0x08000008, 0x00000200, 0x00000000, 0x08020008,
220                                 0x08000208, 0x00020000, 0x08000000, 0x08020208,
221                                 0x00000008, 0x00020208, 0x00020200, 0x08000008,
222                                 0x08020000, 0x08000208, 0x00000208, 0x08020000,
223                                 0x00020208, 0x00000008, 0x08020008, 0x00020200
224                         ),
225                         array(
226                                 0x00802001, 0x00002081, 0x00002081, 0x00000080,
227                                 0x00802080, 0x00800081, 0x00800001, 0x00002001,
228                                 0x00000000, 0x00802000, 0x00802000, 0x00802081,
229                                 0x00000081, 0x00000000, 0x00800080, 0x00800001,
230                                 0x00000001, 0x00002000, 0x00800000, 0x00802001,
231                                 0x00000080, 0x00800000, 0x00002001, 0x00002080,
232                                 0x00800081, 0x00000001, 0x00002080, 0x00800080,
233                                 0x00002000, 0x00802080, 0x00802081, 0x00000081,
234                                 0x00800080, 0x00800001, 0x00802000, 0x00802081,
235                                 0x00000081, 0x00000000, 0x00000000, 0x00802000,
236                                 0x00002080, 0x00800080, 0x00800081, 0x00000001,
237                                 0x00802001, 0x00002081, 0x00002081, 0x00000080,
238                                 0x00802081, 0x00000081, 0x00000001, 0x00002000,
239                                 0x00800001, 0x00002001, 0x00802080, 0x00800081,
240                                 0x00002001, 0x00002080, 0x00800000, 0x00802001,
241                                 0x00000080, 0x00800000, 0x00002000, 0x00802080
242                         ),
243                         array(
244                                 0x00000100, 0x02080100, 0x02080000, 0x42000100,
245                                 0x00080000, 0x00000100, 0x40000000, 0x02080000,
246                                 0x40080100, 0x00080000, 0x02000100, 0x40080100,
247                                 0x42000100, 0x42080000, 0x00080100, 0x40000000,
248                                 0x02000000, 0x40080000, 0x40080000, 0x00000000,
249                                 0x40000100, 0x42080100, 0x42080100, 0x02000100,
250                                 0x42080000, 0x40000100, 0x00000000, 0x42000000,
251                                 0x02080100, 0x02000000, 0x42000000, 0x00080100,
252                                 0x00080000, 0x42000100, 0x00000100, 0x02000000,
253                                 0x40000000, 0x02080000, 0x42000100, 0x40080100,
254                                 0x02000100, 0x40000000, 0x42080000, 0x02080100,
255                                 0x40080100, 0x00000100, 0x02000000, 0x42080000,
256                                 0x42080100, 0x00080100, 0x42000000, 0x42080100,
257                                 0x02080000, 0x00000000, 0x40080000, 0x42000000,
258                                 0x00080100, 0x02000100, 0x40000100, 0x00080000,
259                                 0x00000000, 0x40080000, 0x02080100, 0x40000100
260                         ),
261                         array(
262                                 0x20000010, 0x20400000, 0x00004000, 0x20404010,
263                                 0x20400000, 0x00000010, 0x20404010, 0x00400000,
264                                 0x20004000, 0x00404010, 0x00400000, 0x20000010,
265                                 0x00400010, 0x20004000, 0x20000000, 0x00004010,
266                                 0x00000000, 0x00400010, 0x20004010, 0x00004000,
267                                 0x00404000, 0x20004010, 0x00000010, 0x20400010,
268                                 0x20400010, 0x00000000, 0x00404010, 0x20404000,
269                                 0x00004010, 0x00404000, 0x20404000, 0x20000000,
270                                 0x20004000, 0x00000010, 0x20400010, 0x00404000,
271                                 0x20404010, 0x00400000, 0x00004010, 0x20000010,
272                                 0x00400000, 0x20004000, 0x20000000, 0x00004010,
273                                 0x20000010, 0x20404010, 0x00404000, 0x20400000,
274                                 0x00404010, 0x20404000, 0x00000000, 0x20400010,
275                                 0x00000010, 0x00004000, 0x20400000, 0x00404010,
276                                 0x00004000, 0x00400010, 0x20004010, 0x00000000,
277                                 0x20404000, 0x20000000, 0x00400010, 0x20004010
278                         ),
279                         array(
280                                 0x00200000, 0x04200002, 0x04000802, 0x00000000,
281                                 0x00000800, 0x04000802, 0x00200802, 0x04200800,
282                                 0x04200802, 0x00200000, 0x00000000, 0x04000002,
283                                 0x00000002, 0x04000000, 0x04200002, 0x00000802,
284                                 0x04000800, 0x00200802, 0x00200002, 0x04000800,
285                                 0x04000002, 0x04200000, 0x04200800, 0x00200002,
286                                 0x04200000, 0x00000800, 0x00000802, 0x04200802,
287                                 0x00200800, 0x00000002, 0x04000000, 0x00200800,
288                                 0x04000000, 0x00200800, 0x00200000, 0x04000802,
289                                 0x04000802, 0x04200002, 0x04200002, 0x00000002,
290                                 0x00200002, 0x04000000, 0x04000800, 0x00200000,
291                                 0x04200800, 0x00000802, 0x00200802, 0x04200800,
292                                 0x00000802, 0x04000002, 0x04200802, 0x04200000,
293                                 0x00200800, 0x00000000, 0x00000002, 0x04200802,
294                                 0x00000000, 0x00200802, 0x04200000, 0x00000800,
295                                 0x04000002, 0x04000800, 0x00000800, 0x00200002
296                         ),
297                         array(
298                                 0x10001040, 0x00001000, 0x00040000, 0x10041040,
299                                 0x10000000, 0x10001040, 0x00000040, 0x10000000,
300                                 0x00040040, 0x10040000, 0x10041040, 0x00041000,
301                                 0x10041000, 0x00041040, 0x00001000, 0x00000040,
302                                 0x10040000, 0x10000040, 0x10001000, 0x00001040,
303                                 0x00041000, 0x00040040, 0x10040040, 0x10041000,
304                                 0x00001040, 0x00000000, 0x00000000, 0x10040040,
305                                 0x10000040, 0x10001000, 0x00041040, 0x00040000,
306                                 0x00041040, 0x00040000, 0x10041000, 0x00001000,
307                                 0x00000040, 0x10040040, 0x00001000, 0x00041040,
308                                 0x10001000, 0x00000040, 0x10000040, 0x10040000,
309                                 0x10040040, 0x10000000, 0x00040000, 0x10001040,
310                                 0x00000000, 0x10041040, 0x00040040, 0x10000040,
311                                 0x10040000, 0x10001000, 0x10001040, 0x00000000,
312                                 0x10041040, 0x00041000, 0x00041000, 0x00001040,
313                                 0x00001040, 0x00040040, 0x10000000, 0x10041000
314                         )
315                 );
317                 $left = $aint[0];
318                 $right = $aint[1];
319                 $fval=0;
320                 $work=0;
322                 if ($comp) {
323                         $keyix=0;
324                         $keys = $ks[$keyix];
326                         for( $i = 0; $i < 8; $i++ ) {
327                                 $work  = ($right << 28) | (($right >> 4) & 0x0fffffff);
328                                 $work ^= $ks[$keyix];$keyix++;
330                                 $fval  = $SP[6][ $work     & 0x3f];
331                                 $fval |= $SP[4][($work >>  8) & 0x3f];
332                                 $fval |= $SP[2][($work >> 16) & 0x3f];
333                                 $fval |= $SP[0][($work >> 24) & 0x3f];
335                                 $work  = $right ^ $ks[$keyix];$keyix++;
336                                 $fval |= $SP[7][ $work     & 0x3f];
337                                 $fval |= $SP[5][($work >>  8) & 0x3f];
338                                 $fval |= $SP[3][($work >> 16) & 0x3f];
339                                 $fval |= $SP[1][($work >> 24) & 0x3f];
341                                 $left ^= $fval;
342                                 $work  = ($left << 28) | (($left >> 4) & 0x0fffffff);
343                                 $work ^= $ks[$keyix];$keyix++;
344                                 $fval  = $SP[6][ $work     & 0x3f];
345                                 $fval |= $SP[4][($work >>  8) & 0x3f];
346                                 $fval |= $SP[2][($work >> 16) & 0x3f];
347                                 $fval |= $SP[0][($work >> 24) & 0x3f];
348                                 $work  = $left ^ $ks[$keyix];$keyix++;
349                                 $fval |= $SP[7][ $work     & 0x3f];
350                                 $fval |= $SP[5][($work >>  8) & 0x3f];
351                                 $fval |= $SP[3][($work >> 16) & 0x3f];
352                                 $fval |= $SP[1][($work >> 24) & 0x3f];
353                                 $right ^= $fval;
354                         }
355                 } else {
356                         $keyix=30;
357                         $keys = $ks[$keyix];
359                         for( $i = 0; $i < 8; $i++ ) {
360                                 $work  = ($right << 28) | (($right >> 4) & 0x0fffffff);
361                                 $work ^= $ks[$keyix];$keyix++;
362                                 $fval  = $SP[6][ $work     & 0x3f];
363                                 $fval |= $SP[4][($work >>  8) & 0x3f];
364                                 $fval |= $SP[2][($work >> 16) & 0x3f];
365                                 $fval |= $SP[0][($work >> 24) & 0x3f];
366                                 $work  = $right ^ $ks[$keyix];$keyix++;
367                                 $fval |= $SP[7][ $work     & 0x3f];
368                                 $fval |= $SP[5][($work >>  8) & 0x3f];
369                                 $fval |= $SP[3][($work >> 16) & 0x3f];
370                                 $fval |= $SP[1][($work >> 24) & 0x3f];
371                                 $left ^= $fval;
372                                 $work  = ($left << 28) | (($left >> 4) & 0x0fffffff);
373                                 $keyix -= 4;
374                                 $work ^= $ks[$keyix];$keyix++;
375                                 $fval  = $SP[6][ $work     & 0x3f];
376                                 $fval |= $SP[4][($work >>  8) & 0x3f];
377                                 $fval |= $SP[2][($work >> 16) & 0x3f];
378                                 $fval |= $SP[0][($work >> 24) & 0x3f];
379                                 $work  = $left ^ $ks[$keyix];$keyix++;
380                                 $fval |= $SP[7][ $work     & 0x3f];
381                                 $fval |= $SP[5][($work >>  8) & 0x3f];
382                                 $fval |= $SP[3][($work >> 16) & 0x3f];
383                                 $fval |= $SP[1][($work >> 24) & 0x3f];
384                                 $right ^= $fval;
385                                 $keyix -= 4;
386                         }
387                 }
388                 $aint[0] = $right;
389                 $aint[1] = $left;
390         }
393         function _des3_encrypt($aint,$ks1,$ks2,$ks3,$comp){
394                 $this->IP(&$aint);
395                 if($comp){
396                         $this->desx(&$aint,&$ks1,true);
397                         $this->desx(&$aint,&$ks2,false);
398                         $this->desx(&$aint,&$ks3,true);
399                 }else{
400                         $this->desx(&$aint,&$ks1,false);
401                         $this->desx(&$aint,&$ks2,true);
402                         $this->desx(&$aint,&$ks3,false);
403                 }
404                 $this->FP(&$aint);
405         }
407         function DES_ede3_cbc_encrypt($chain,$comp,$ks1,$ks2,$ks3,$ixlen){
409                 $n_fold_key=$ch_input;
410                 $size=$ixlen;
411                 
412                 $ivec=array(8);
413                 for ($i=0;$i<8;$i++) $ivec[$i]=chr(0);
414                 $uiv=array(2);$uiv[0]=0;$uiv[1]=0;
415                 $this->load($ivec,&$uiv);
416 //              $stringh="";
417 //                              for($i=0;$i<$ixlen;$i++) $stringh.=sprintf("%02x",$chain[$i]);
418 //                              print "PREINPUT:  $ixlen ".$stringh."\n";
420                 $ix=0;
421                 $input=array(8); for($i=0;$i<8;$i++) $input[$i]=$chain[$i+$ix];
422                 
423                 $output=&$input;
424                 $u=array(2);$u[0]=0;$u[1]=0;
425                 if($comp){
426                         while($ixlen>=8){
427                                 $this->load($input,&$u);
428                                 $u[0] ^=$uiv[0];
429                                 $u[1] ^=$uiv[1];
430                                 $this->_des3_encrypt(&$u,$ks1,$ks2,$ks3, true);
431                                 $uiv[0]=$u[0];$uiv[1]=$u[1];
432                                 $this->store($u,&$output);
434                                 $ixlen-=8;
435                                 for($i=0;$i<8;$i++) $chain[$i+$ix]=$output[$i];
436                                 $ix+=8;
437                                 for($i=0;$i<8;$i++) $input[$i]=$chain[$i+$ix];
438                         }
439                         if($ixlen>0){
440                                 $tmp=array(8);
441                                 for($i=0;$i<$ixlen;$i++) $input[$i]=$chain[$i+$ix];
442                                 for($i=$ixlen;$i<8;$i++) $input[$i]=0;
443                                 $this->load($input,&$u);
444                                 $u[0] ^= $uiv[0]; $u[1] ^= $uiv[1];
445                                 $this->_des3_encrypt(&$u,$ks1,$ks2,$ks3, true);
446                                 $this->store($u, &$output);
447                                 for($i=0;$i<8;$i++) $chain[$i+$ix]=$output[$i];
448                         }
449                 }else{
450                 }
451                 $this->store($uiv, &$iv);
452                 $uiv[0] = 0; $u[0] = 0; $uiv[1] = 0; $u[1] = 0;
453 //              $stringh="";
454 //              for($i=0;$i<$size;$i++) $stringh.=sprintf("%02x",$chain[$i]);
455 //              print "CHAIN:  $ixlen ".$stringh."\n";
456                  return($chain);
457         }
459         function get(){
460                 $stringh="";
461                 for($i=0;$i<strlen($this->out);$i++) $stringh.=sprintf("%02x",ord(substr($this->out,$i,1)));
462                 return($stringh);
463         }
465         function des_make_key_sched($key){
466         
467                 $PC1_CL = array(
468                         0x00000000, 0x00000010, 0x00001000, 0x00001010,
469                         0x00100000, 0x00100010, 0x00101000, 0x00101010
470                 );
471                         
472                 $PC1_DL = array(
473                         0x00000000, 0x00100000, 0x00001000, 0x00101000,
474                         0x00000010, 0x00100010, 0x00001010, 0x00101010,
475                         0x00000001, 0x00100001, 0x00001001, 0x00101001,
476                         0x00000011, 0x00100011, 0x00001011, 0x00101011
477                 );
479                 $PC1_CR = array(
480                         0x00000000, 0x00000001, 0x00000100, 0x00000101,
481                         0x00010000, 0x00010001, 0x00010100, 0x00010101,
482                         0x01000000, 0x01000001, 0x01000100, 0x01000101,
483                         0x01010000, 0x01010001, 0x01010100, 0x01010101
484                 );
485                 
486                 $PC1_DR = array(
487                         0x00000000, 0x01000000, 0x00010000, 0x01010000,
488                         0x00000100, 0x01000100, 0x00010100, 0x01010100
489                 );
490                         
491                 $PC2_C = array(
492                         array(
493                         0x00000000, 0x00004000, 0x00040000, 0x00044000,
494                         0x00000100, 0x00004100, 0x00040100, 0x00044100,
495                         0x00020000, 0x00024000, 0x00060000, 0x00064000,
496                         0x00020100, 0x00024100, 0x00060100, 0x00064100,
497                         0x00000001, 0x00004001, 0x00040001, 0x00044001,
498                         0x00000101, 0x00004101, 0x00040101, 0x00044101,
499                         0x00020001, 0x00024001, 0x00060001, 0x00064001,
500                         0x00020101, 0x00024101, 0x00060101, 0x00064101,
501                         0x00080000, 0x00084000, 0x000c0000, 0x000c4000,
502                         0x00080100, 0x00084100, 0x000c0100, 0x000c4100,
503                         0x000a0000, 0x000a4000, 0x000e0000, 0x000e4000,
504                         0x000a0100, 0x000a4100, 0x000e0100, 0x000e4100,
505                         0x00080001, 0x00084001, 0x000c0001, 0x000c4001,
506                         0x00080101, 0x00084101, 0x000c0101, 0x000c4101,
507                         0x000a0001, 0x000a4001, 0x000e0001, 0x000e4001,
508                         0x000a0101, 0x000a4101, 0x000e0101, 0x000e4101
509                         ),
510                         array(
511                         0x00000000, 0x00000002, 0x00000200, 0x00000202, 
512                         0x00200000, 0x00200002, 0x00200200, 0x00200202,
513                         0x00001000, 0x00001002, 0x00001200, 0x00001202,
514                         0x00201000, 0x00201002, 0x00201200, 0x00201202,
515                         0x00000040, 0x00000042, 0x00000240, 0x00000242,
516                         0x00200040, 0x00200042, 0x00200240, 0x00200242,
517                         0x00001040, 0x00001042, 0x00001240, 0x00001242,
518                         0x00201040, 0x00201042, 0x00201240, 0x00201242,
519                         0x00000010, 0x00000012, 0x00000210, 0x00000212,
520                         0x00200010, 0x00200012, 0x00200210, 0x00200212,
521                         0x00001010, 0x00001012, 0x00001210, 0x00001212,
522                         0x00201010, 0x00201012, 0x00201210, 0x00201212,
523                         0x00000050, 0x00000052, 0x00000250, 0x00000252,
524                         0x00200050, 0x00200052, 0x00200250, 0x00200252,
525                         0x00001050, 0x00001052, 0x00001250, 0x00001252,
526                         0x00201050, 0x00201052, 0x00201250, 0x00201252
527                         ),
528                         array(
529                         0x00000000, 0x00000004, 0x00000400, 0x00000404, 
530                         0x00400000, 0x00400004, 0x00400400, 0x00400404,
531                         0x00000020, 0x00000024, 0x00000420, 0x00000424,
532                         0x00400020, 0x00400024, 0x00400420, 0x00400424,
533                         0x00008000, 0x00008004, 0x00008400, 0x00008404,
534                         0x00408000, 0x00408004, 0x00408400, 0x00408404,
535                         0x00008020, 0x00008024, 0x00008420, 0x00008424,
536                         0x00408020, 0x00408024, 0x00408420, 0x00408424,
537                         0x00800000, 0x00800004, 0x00800400, 0x00800404,
538                         0x00c00000, 0x00c00004, 0x00c00400, 0x00c00404,
539                         0x00800020, 0x00800024, 0x00800420, 0x00800424,
540                         0x00c00020, 0x00c00024, 0x00c00420, 0x00c00424,
541                         0x00808000, 0x00808004, 0x00808400, 0x00808404,
542                         0x00c08000, 0x00c08004, 0x00c08400, 0x00c08404,
543                         0x00808020, 0x00808024, 0x00808420, 0x00808424,
544                         0x00c08020, 0x00c08024, 0x00c08420, 0x00c08424
545                         ),
546                         array(
547                             0x00000000, 0x00010000, 0x00000008, 0x00010008, 
548                                 0x00000080, 0x00010080, 0x00000088, 0x00010088,
549                                 0x00100000, 0x00110000, 0x00100008, 0x00110008,
550                                 0x00100080, 0x00110080, 0x00100088, 0x00110088,
551                                 0x00000800, 0x00010800, 0x00000808, 0x00010808,
552                                 0x00000880, 0x00010880, 0x00000888, 0x00010888,
553                                 0x00100800, 0x00110800, 0x00100808, 0x00110808,
554                                 0x00100880, 0x00110880, 0x00100888, 0x00110888,
555                                 0x00002000, 0x00012000, 0x00002008, 0x00012008,
556                                 0x00002080, 0x00012080, 0x00002088, 0x00012088,
557                                 0x00102000, 0x00112000, 0x00102008, 0x00112008,
558                                 0x00102080, 0x00112080, 0x00102088, 0x00112088,
559                                 0x00002800, 0x00012800, 0x00002808, 0x00012808,
560                                 0x00002880, 0x00012880, 0x00002888, 0x00012888,
561                                 0x00102800, 0x00112800, 0x00102808, 0x00112808,
562                                 0x00102880, 0x00112880, 0x00102888, 0x00112888
563                         )
564                 );
565                 
566                 $PC2_D = array(
567                         array(
568                                 0x00000000, 0x00000080, 0x00002000, 0x00002080,
569                                 0x00000001, 0x00000081, 0x00002001, 0x00002081,
570                                 0x00200000, 0x00200080, 0x00202000, 0x00202080,
571                                 0x00200001, 0x00200081, 0x00202001, 0x00202081,
572                                 0x00020000, 0x00020080, 0x00022000, 0x00022080,
573                                 0x00020001, 0x00020081, 0x00022001, 0x00022081,
574                                 0x00220000, 0x00220080, 0x00222000, 0x00222080,
575                                 0x00220001, 0x00220081, 0x00222001, 0x00222081,
576                                 0x00000002, 0x00000082, 0x00002002, 0x00002082,
577                                 0x00000003, 0x00000083, 0x00002003, 0x00002083,
578                                 0x00200002, 0x00200082, 0x00202002, 0x00202082,
579                                 0x00200003, 0x00200083, 0x00202003, 0x00202083,
580                                 0x00020002, 0x00020082, 0x00022002, 0x00022082,
581                                 0x00020003, 0x00020083, 0x00022003, 0x00022083,
582                                 0x00220002, 0x00220082, 0x00222002, 0x00222082,
583                                 0x00220003, 0x00220083, 0x00222003, 0x00222083
584                         ),
585                         array(
586                                 0x00000000, 0x00000010, 0x00800000, 0x00800010,
587                                 0x00010000, 0x00010010, 0x00810000, 0x00810010,
588                                 0x00000200, 0x00000210, 0x00800200, 0x00800210,
589                                 0x00010200, 0x00010210, 0x00810200, 0x00810210,
590                                 0x00100000, 0x00100010, 0x00900000, 0x00900010,
591                                 0x00110000, 0x00110010, 0x00910000, 0x00910010,
592                                 0x00100200, 0x00100210, 0x00900200, 0x00900210,
593                                 0x00110200, 0x00110210, 0x00910200, 0x00910210,
594                                 0x00000004, 0x00000014, 0x00800004, 0x00800014,
595                                 0x00010004, 0x00010014, 0x00810004, 0x00810014,
596                                 0x00000204, 0x00000214, 0x00800204, 0x00800214,
597                                 0x00010204, 0x00010214, 0x00810204, 0x00810214,
598                                 0x00100004, 0x00100014, 0x00900004, 0x00900014,
599                                 0x00110004, 0x00110014, 0x00910004, 0x00910014,
600                                 0x00100204, 0x00100214, 0x00900204, 0x00900214,
601                                 0x00110204, 0x00110214, 0x00910204, 0x00910214
602                         ),
603                         array(
604                                 0x00000000, 0x00000400, 0x00001000, 0x00001400,
605                                 0x00080000, 0x00080400, 0x00081000, 0x00081400,
606                                 0x00000020, 0x00000420, 0x00001020, 0x00001420,
607                                 0x00080020, 0x00080420, 0x00081020, 0x00081420,
608                                 0x00004000, 0x00004400, 0x00005000, 0x00005400,
609                                 0x00084000, 0x00084400, 0x00085000, 0x00085400,
610                                 0x00004020, 0x00004420, 0x00005020, 0x00005420,
611                                 0x00084020, 0x00084420, 0x00085020, 0x00085420,
612                                 0x00000800, 0x00000c00, 0x00001800, 0x00001c00,
613                                 0x00080800, 0x00080c00, 0x00081800, 0x00081c00,
614                                 0x00000820, 0x00000c20, 0x00001820, 0x00001c20,
615                                 0x00080820, 0x00080c20, 0x00081820, 0x00081c20,
616                                 0x00004800, 0x00004c00, 0x00005800, 0x00005c00,
617                                 0x00084800, 0x00084c00, 0x00085800, 0x00085c00,
618                                 0x00004820, 0x00004c20, 0x00005820, 0x00005c20,
619                                 0x00084820, 0x00084c20, 0x00085820, 0x00085c20
620                         ),
621                         array(
622                                 0x00000000, 0x00000100, 0x00040000, 0x00040100,
623                                 0x00000040, 0x00000140, 0x00040040, 0x00040140,
624                                 0x00400000, 0x00400100, 0x00440000, 0x00440100,
625                                 0x00400040, 0x00400140, 0x00440040, 0x00440140,
626                                 0x00008000, 0x00008100, 0x00048000, 0x00048100,
627                                 0x00008040, 0x00008140, 0x00048040, 0x00048140,
628                                 0x00408000, 0x00408100, 0x00448000, 0x00448100,
629                                 0x00408040, 0x00408140, 0x00448040, 0x00448140,
630                                 0x00000008, 0x00000108, 0x00040008, 0x00040108,
631                                 0x00000048, 0x00000148, 0x00040048, 0x00040148,
632                                 0x00400008, 0x00400108, 0x00440008, 0x00440108,
633                                 0x00400048, 0x00400148, 0x00440048, 0x00440148,
634                                 0x00008008, 0x00008108, 0x00048008, 0x00048108,
635                                 0x00008048, 0x00008148, 0x00048048, 0x00048148,
636                                 0x00408008, 0x00408108, 0x00448008, 0x00448108,
637                                 0x00408048, 0x00408148, 0x00448048, 0x00448148
638                         )
639                 );
641                         $tmp=0;
642                         $kix=0;
644                         $tmp = ($key[$kix++]) <<24;
645                         $tmp |=($key[$kix++]) <<16;
646                         $tmp |=($key[$kix++]) <<8;
647                         $tmp |=($key[$kix++]);
648                         
650                         $c =  $PC1_CL[($tmp >> 29) & 0x7]
651                         | ($PC1_CL[($tmp >> 21) & 0x7] << 1)
652                         | ($PC1_CL[($tmp >> 13) & 0x7] << 2)
653                         | ($PC1_CL[($tmp >>  5) & 0x7] << 3);
654                         $d =  $PC1_DL[($tmp >> 25) & 0xf]
655                         | ($PC1_DL[($tmp >> 17) & 0xf] << 1)
656                         | ($PC1_DL[($tmp >>  9) & 0xf] << 2)
657                         | ($PC1_DL[($tmp >>  1) & 0xf] << 3);
659         
660                         $tmp = ($key[$kix++]) <<24;
661                         $tmp |=($key[$kix++]) <<16;
662                         $tmp |=($key[$kix++]) <<8;
663                         $tmp |=($key[$kix++]);
665                         $c |= $PC1_CR[($tmp >> 28) & 0xf]
666                         | ($PC1_CR[($tmp >> 20) & 0xf] << 1)
667                         | ($PC1_CR[($tmp >> 12) & 0xf] << 2)
668                         | ($PC1_CR[($tmp >>  4) & 0xf] << 3);
669                         $d |= $PC1_DR[($tmp >> 25) & 0x7]
670                         | ($PC1_DR[($tmp >> 17) & 0x7] << 1)
671                         | ($PC1_DR[($tmp >>  9) & 0x7] << 2)
672                         | ($PC1_DR[($tmp >>  1) & 0x7] << 3);
673                 
674                         $two_bit_shifts = TWO_BIT_SHIFTS;
675                         $lix=0;
676                         for ($i = 16; $i > 0; $i--) {
677                                 
678                                 if ($two_bit_shifts & 0x1) {
679                                         $c = (($c << 2) & 0xffffffc) | ($c >> 26);
680                                         $d = (($d << 2) & 0xffffffc) | ($d >> 26);
681                                 } else {
682                                         $c = (($c << 1) & 0xffffffe) | ($c >> 27);
683                                         $d = (($d << 1) & 0xffffffe) | ($d >> 27);
684                                 }
685                                 $two_bit_shifts >>= 1;
686                                 $ltmp = $PC2_C[0][(($c >> 22) & 0x3f)]
687                                         | $PC2_C[1][(($c >> 15) & 0xf) | (($c >> 16) & 0x30)]
688                                         | $PC2_C[2][(($c >>  8) & 0x3) | (($c >>  9) & 0x3c)]
689                                         | $PC2_C[3][(($c >> 2 ) & 0x20) | (($c >> 1) & 0x18) | ($c & 0x7)];
690                                 $rtmp = $PC2_D[0][(($d >> 22) & 0x3f)]
691                                         | $PC2_D[1][(($d >> 14) & 0xf) | (($d >> 15) & 0x30)]
692                                         | $PC2_D[2][(($d >>  7) & 0x3f)]
693                                         | $PC2_D[3][(($d      ) & 0x3) | (($d >>  1) & 0x3c)];
694                                 
695                                 $sch[$lix]  =  ($ltmp & 0x00fc0000) << 6;
696                                 $sch[$lix] |=    ($ltmp & 0x00000fc0) << 10;
697                                 $sch[$lix] |=    ($rtmp & 0x00fc0000) >> 10;
698                                 $sch[$lix] |= ($rtmp & 0x00000fc0) >> 6;
699                                 $lix++;
700                                 
701                                 $sch[$lix]  =    ($ltmp & 0x0003f000) << 12;
702                                 $sch[$lix] |=    ($ltmp & 0x0000003f) << 16;
703                                 $sch[$lix] |=    ($rtmp & 0x0003f000) >> 4;
704                                 $sch[$lix] |= ($rtmp & 0x0000003f);
705                                 $lix++;
706                         }
708                 return($sch);
709         }
711         function DES_set_odd_parity($in){
713                 $odd_parity=array(
714                         1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
715                         16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
716                         32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
717                         49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
718                         64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
719                         81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
720                         97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
721                         112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
722                         128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
723                         145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
724                         161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
725                         176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
726                         193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
727                         208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
728                         224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
729                         241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254,
730                 );
732                         for($j=0;$j<8;$j++){
733                                 $in[$j]=$odd_parity[$in[$j]];
734                         }
735                 return $in;
736         }
738         function DES3_set_odd_parity($in){
740                 $odd_parity=array(
741                         1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
742                         16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
743                         32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
744                         49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
745                         64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
746                         81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
747                         97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
748                         112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
749                         128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
750                         145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
751                         161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
752                         176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
753                         193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
754                         208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
755                         224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
756                         241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254,
757                 );
758                 for($i=0;$i<3;$i++){
759                         for($j=0;$j<8;$j++){
760                                 $in[($i*8)+$j]=$odd_parity[$in[($i*8)+$j]];
761                         }
762                 }
763                 return $in;
764         }
766         function des_is_weak_key($in){
768                 $weak_keys=array(
769                 /* weak keys */
770                 array(0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01),
771                 array(0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE),
772                 array(0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E),
773                 array(0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1),
774                 /* semi-weak keys */
775                 array(0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE),
776                 array(0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01),
777                 array(0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1),
778                 array(0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E),
779                 array(0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1),
780                 array(0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01),
781                 array(0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE),
782                 array(0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E),
783                 array(0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E),
784                 array(0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01),
785                 array(0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE),
786                 array(0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1));
788                 for ($i=0; $i<16; $i++){
789                         if(count(array_diff($in,$weak_keys[$i]))==0) return(true);;
790                 }
791                 return(false);
792         }
794         function Des3StringToKey($pass,$realm,$username){
795                 $n_fold_key=$this->_krb5_n_fold($pass.$realm.$username,24);
796 //              $stringh="";
797 //              for($i=0;$i<strlen($n_fold_key);$i++) $stringh.=sprintf("%02x",ord(substr($n_fold_key,$i,1)));
798 //              print "IKEY: ".$stringh."\n";
799                 $chain=array(24); for($i=0;$i<24;$i++) $chain[$i]=ord(substr($n_fold_key,$i,1));
800                 $ix=0;
801                 $key1=array(8); for($i=0;$i<8;$i++) $key1[$i]=$chain[$i];
802                 $key2=array(8); for($i=0;$i<8;$i++) $key2[$i]=$chain[$i+8];
803                 $key3=array(8); for($i=0;$i<8;$i++) $key3[$i]=$chain[$i+16];
804                 $ks1=$this->des_make_key_sched($key1);
805                 $ks2=$this->des_make_key_sched($key2);
806                 $ks3=$this->des_make_key_sched($key3);
807                 
808                 $this->out=$this->DES_ede3_cbc_encrypt($chain,true,$ks1,$ks2,$ks3,24);
809                 $keys=array(3);
810                 $this->out=$this->DES3_set_odd_parity($this->out);
811                 for($i = 0;$i < 3; $i++){
812                         $keys[$i]=array(8);
813                         for($j = 0;$j < 8; $j++) $keys[$i][$j]=$this->out[($i*8)+$j];
814                         if($this->DES_is_weak_key($keys[$i])){
815                                 $keys[$i][7]^=0xf0;
816                                 $this->out[($i*8)+7]=$keys[$i][7];
817                         }
818                 }
819 //              $stringh="";
820 //              for($i=0;$i<24;$i++) $stringh.=sprintf("%02x",$this->out[$i]);
821 //              print "OUT KEY: ".$stringh."\n";
822         }
824         function des_cbc_cksum($key,$data,$sch){
825                 $pos=0;
826                 $u=array(0,0);
827                 $uiv=array(0,0);
828                 $this->load($key,&$uiv);
829                 $len=count($data);
830                 $input=array(8);for($i=0;$i<8;$i++) $input[$i]=$data[$i];
831                 $ix=0;
832                         while ($len >=8) {
833                                 $this->load($input,&$u);
834                                 $u[0] ^= $uiv[0]; $u[1] ^= $uiv[1];
835                                 $this->IP(&$u);
836                                 $this->desx(&$u, $sch, true);
837                                 $this->FP(&$u);
838                                 $uiv[0] = $u[0]; $uiv[1] = $u[1];
839                                 $len -= 8;
840                                 for($i=0;$i<8;$i++) $data[$i+$ix]=$input[$i];
841                                 $ix+=8;$input=array(8);for($i=0;$i<8;$i++) $input[$i]=$data[$i+$ix];
842                         }
843                         if($len>0){
844                                 $input=array(8);
845                                 for($i=0;$i<$len;$i++) $input[$i]=$data[$i+$ix];
846                                 for($i=$len;$i<8;$i++) $input[$i]=0;
847                                 $this->load($input,&$u);
848                                 $u[0] ^= $uiv[0]; $u[1] ^= $uiv[1];
849                                 $this->IP(&$u);
850                                 $this->desx(&$u, $sch, true);
851                                 $this->FP(&$u);
852                         }
853                 $this->store($u,&$key);
854                 return($key);
855         }
857         function DesStringToKey($pass,$realm,$username){
858                 $data=$pass.$realm.$username;
859                 $len=strlen($data);
860                 $reverse = 0;
861                 $ix=0;
862                 $key=array(8); for($i=0;$i<8;$i++) $key[$i]=0;
863                 $tmp=array($len);for($i=0;$i<$len;$i++) $tmp[$i]=ord(substr($data,$i,1));
864                 $swap=array( 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
865                              0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf );
866                 for ($i = 0; $i < $len; $i++) {
867                         if ($reverse==0){
868                                 $key[$ix]^=($tmp[$i] << 1);
869                                 $ix++;
870                         }else{
871                                 $ix--;
872                                 $key[$ix]^=($swap[$tmp[$i] & 0xf] <<4)| $swap[(($tmp[$i] & 0xf0) >> 4) &0x0f];
873                         }
874                         if(($i % 8) == 7){
875                                 if($reverse==0) $reverse=1;else $reverse=0;
876                         }
877                 }
878                 $key=$this->DES_set_odd_parity($key);
879                 if($this->DES_is_weak_key($key)){
880                         $key[7]^=0xf0;
881                 }
882                 $sch=$this->des_make_key_sched($key);
883                 $key=$this->des_cbc_cksum($key,$tmp,$sch);
884                 $key=$this->DES_set_odd_parity($key);
885                 if($this->DES_is_weak_key($key)){
886                         $key[7]^=0xf0;
887                 }
888                 $this->out=$key;
889         }
891         function DES3_random_to_key($data){
892                 $key=array(24); for ($i=0;$i<24;$i++) $key[$i]=0;
894                 for($i=0;$i<3;++$i){
895                         for ($j=0;$j<7;++$j){
896                                 $key[(8*$i)+$j]=$data[7*$i+$j];
897                         }
899                         $foo = 0;
900                         for ($j = 6; $j >= 0; --$j) {
901                                 $foo |= $data[7 *$i +$j] & 1;
902                                 $foo <<= 1;
903                         }
904                         $key[(8*$i)+7]=$foo;
905                 }
906                 $keys=array(3);
907                 $out=$key;
908                 $out=$this->DES3_set_odd_parity($out);
909                 for($i = 0;$i < 3; $i++){
910                         $keys[$i]=array(8);
911                         for($j = 0;$j < 8; $j++) $keys[$i][$j]=$out[($i*8)+$j];
912                         if($this->DES_is_weak_key($keys[$i])){
913                                 $keys[$i][7]^=0xf0;
914                                 $out[($i*8)+7]=$keys[$i][7];
915                         }
916                 }
917                 return($out);
918         }
920         function Des3StringToKeyDerived($pass,$realm,$username){
921                 $n_fold_key=$this->_krb5_n_fold($pass.$realm.$username,21);
922 //              $stringh="";
923 //              for($i=0;$i<strlen($n_fold_key);$i++) $stringh.=sprintf("%02x",ord(substr($n_fold_key,$i,1)));
924 //              print "IKEY: ".$stringh."\n";
925                 $data=array(21); for($i=0;$i<strlen($n_fold_key);$i++) $data[$i]=ord(substr($n_fold_key,$i,1));
926                 $this->out=$this->DES3_random_to_key($data);
927                 $keys=array(3);
928                 for($i = 0;$i < 3; $i++){
929                         $keys[$i]=array(8);
930                         for($j = 0;$j < 8; $j++) $keys[$i][$j]=$this->out[($i*8)+$j];
931                 }
932                 
933                 $ks1=$this->des_make_key_sched($keys[0]);
934                 $ks2=$this->des_make_key_sched($keys[1]);
935                 $ks3=$this->des_make_key_sched($keys[2]);
937                 $derivekey=$this->derive_key("kerberos",$this->out,$ks1,$ks2,$ks3,24);
938                 $this->out=$this->DES3_random_to_key($derivekey);
939                 
940         }
943         function derive_key($constant, $data,$ks1,$ks2,$ks3,$ixlen){
944                 $len=strlen($constant);
945                 $n_fold_key=$this->_krb5_n_fold($constant,$len);
946                 $lk=array(8); for($i=0;$i<8;$i++) $lk[$i]=ord(substr($n_fold_key,$i,1));
947                 $keys=array(3);
948                 $keys[0]=$lk;
950                 $keys[0]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
951                 $keys[1]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
952                 $keys[2]=$this->DES_ede3_cbc_encrypt($keys[1],true,$ks1,$ks2,$ks3,8);
954                 $out=array(24);
955                 for ($i=0;$i<3;$i++){
956                         for ($j=0;$j<8;$j++)
957                                 $out[($i*8)+$j]=$keys[$i][$j];
958                 }
959                 return($out);
960         }
962         function derive_key_integrity($masterkey){
963                 $keys=array(3);
964                 for($i = 0;$i < 3; $i++){
965                         $keys[$i]=array(8);
966                         for($j = 0;$j < 8; $j++) $keys[$i][$j]=$masterkey[($i*8)+$j];
967                 }
968                 
969                 $ks1=$this->des_make_key_sched($keys[0]);
970                 $ks2=$this->des_make_key_sched($keys[1]);
971                 $ks3=$this->des_make_key_sched($keys[2]);
973                 $usage=$this->getIntegrityUsage();
975                 $n_fold_key=$this->_krb5_n_fold($usage,8);
976                 $lk=array(8); for($i=0;$i<8;$i++) $lk[$i]=ord(substr($n_fold_key,$i,1));
977                 
978                 $keys=array(3);
979                 $keys[0]=$lk;
980                 
981                 $keys[0]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
982                 $keys[1]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
983                 $keys[2]=$this->DES_ede3_cbc_encrypt($keys[1],true,$ks1,$ks2,$ks3,8);
985                 $out=array(24);
986                 for ($i=0;$i<3;$i++){
987                         for ($j=0;$j<8;$j++)
988                                 $out[($i*8)+$j]=$keys[$i][$j];
989                 }
991                 $out=$this->DES3_random_to_key($out);
992 /*              $stringh="";
993                 for($i=0;$i<24;$i++) $stringh.=sprintf("%02x",$out[$i]);
994                 print "DKEY: ".$stringh."\n";*/
995                 return($out);
996         }
998         function derive_key_encrypt($masterkey){
999                 $keys=array(3);
1000                 for($i = 0;$i < 3; $i++){
1001                         $keys[$i]=array(8);
1002                         for($j = 0;$j < 8; $j++) $keys[$i][$j]=$masterkey[($i*8)+$j];
1003                 }
1004                 
1005                 $ks1=$this->des_make_key_sched($keys[0]);
1006                 $ks2=$this->des_make_key_sched($keys[1]);
1007                 $ks3=$this->des_make_key_sched($keys[2]);
1009                 $usage=$this->getEncryptionUsage();
1011                 $n_fold_key=$this->_krb5_n_fold($usage,8);
1012                 $lk=array(8); for($i=0;$i<8;$i++) $lk[$i]=ord(substr($n_fold_key,$i,1));
1013                 
1014                 $keys=array(3);
1015                 $keys[0]=$lk;
1016                 
1017                 $keys[0]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
1018                 $keys[1]=$this->DES_ede3_cbc_encrypt($keys[0],true,$ks1,$ks2,$ks3,8);
1019                 $keys[2]=$this->DES_ede3_cbc_encrypt($keys[1],true,$ks1,$ks2,$ks3,8);
1021                 $out=array(24);
1022                 for ($i=0;$i<3;$i++){
1023                         for ($j=0;$j<8;$j++)
1024                                 $out[($i*8)+$j]=$keys[$i][$j];
1025                 }
1027                 $out=$this->DES3_random_to_key($out);
1028 /*              $stringh="";
1029                 for($i=0;$i<24;$i++) $stringh.=sprintf("%02x",$out[$i]);
1030                 print "DKEY: ".$stringh."\n";*/
1031                 return($out);
1032         }
1034         function krb5_generate_random_block($len=8){
1035                 $key=$this->DES_new_random_key();
1036                 $sched=$this->des_make_key_sched($key);
1037                 $counter=$this->DES_new_random_key();
1038                 $out=$counter;
1039                 $this->DES_ecb_encrypt(&$out,$sched);
1040         }
1042         function DES_new_random_key($len=8){
1043                 $seed=array($len);
1044                 //inicializacion!!!!
1045                 do{
1046                         $seed=$this->DES_generate_random_block($len);
1047                         $this->DES_set_odd_parity(&$seed);
1048                 }while ($this->DES_is_weak_key($seed));
1049                 $sequence_seed=$this->des_make_key_sched($seed);
1050                 //DES_ecb_encrypt!!!!
1051                 do{
1052                         $this->DES_ecb_encrypt(&$seed,$sequence_seed);
1053                         $this->DES_set_odd_parity(&$seed);
1054                 }while ($this->DES_is_weak_key($seed));
1055                 return($seed);
1056         }
1058         function DES_generate_random_block($len=8){
1059                 $res=array($len);
1060                 for ($i=0;$i<$len;$i++){
1061                         $res[$i]=mt_rand(0,255);
1062                 }
1063                 return($res);
1064         }
1066         function DES_ecb_encrypt($key,$sch){
1067                 $u=array(0,0);
1068                 $this->load($key,&$u);
1069                 //DES_encrypt
1070                 $this->IP(&$u);
1071                 $this->desx(&$u, $sch, true);
1072                 $this->FP(&$u);
1073                 $this->store($u,&$key);
1074                 return($key);
1075         }
1077         function ENCRYPTION_USAGE($u){
1078                 return(($u << 8) | 0xAA);
1079         }
1081         function INTEGRITY_USAGE($u){
1082                 return(($u << 8) | 0x55);
1083         }
1085         function getIntegrityUsage(){
1086                 $usage=$this->INTEGRITY_USAGE(HDB_KU_MKEY);
1087                 $ausage=array(5);
1088                 $ausage[4] = $usage & 0xff;
1089                 $usage= $usage >> 8;
1090                 $ausage[3] = $usage & 0xff;
1091                 $usage= $usage >> 8;
1092                 $ausage[2] = $usage & 0xff;
1093                 $usage= $usage >> 8;
1094                 $ausage[1] = $usage & 0xff;
1095                 $usage= $usage >> 8;
1096                 $ausage[0] = $usage & 0xff;
1097                 $str="";
1098                 for ($i=0;$i<5;$i++){
1099                         $str.=chr($ausage[$i]);
1100                 }
1101                 return($str);
1102         }
1103                 
1104         function getEncryptionUsage(){
1105                 $usage=$this->ENCRYPTION_USAGE(HDB_KU_MKEY);
1106                 $ausage=array(5);
1107                 $ausage[4] = $usage & 0xff;
1108                 $usage= $usage >> 8;
1109                 $ausage[3] = $usage & 0xff;
1110                 $usage= $usage >> 8;
1111                 $ausage[2] = $usage & 0xff;
1112                 $usage= $usage >> 8;
1113                 $ausage[1] = $usage & 0xff;
1114                 $usage= $usage >> 8;
1115                 $ausage[0] = $usage & 0xff;
1116                 $str="";
1117                 for ($i=0;$i<5;$i++){
1118                         $str.=chr($ausage[$i]);
1119                 }
1120                 return($str);
1121         }
1124 };
1128 ?>