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 }
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 }
66 function srr13($sbuf,$len){
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;
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;
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);
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;
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;
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];
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){
467 $PC1_CL = array(
468 0x00000000, 0x00000010, 0x00001000, 0x00001010,
469 0x00100000, 0x00100010, 0x00101000, 0x00101010
470 );
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 );
486 $PC1_DR = array(
487 0x00000000, 0x01000000, 0x00010000, 0x01010000,
488 0x00000100, 0x01000100, 0x00010100, 0x01010100
489 );
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 );
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++]);
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);
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);
674 $two_bit_shifts = TWO_BIT_SHIFTS;
675 $lix=0;
676 for ($i = 16; $i > 0; $i--) {
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)];
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++;
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);
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 }
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);
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 }
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));
978 $keys=array(3);
979 $keys[0]=$lk;
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 }
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));
1014 $keys=array(3);
1015 $keys[0]=$lk;
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 }
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 ?>