Rev 609 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
require_once(realpath(dirname(__FILE__) . '/') . '/secret/wp-hashcash.lib');
header("Pragma: no-cache");
header("Expires: 0");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
$expired = array();
$function_name = hashcash_random_string(rand(6,18));
$expired [] = $function_name;
$js = "function $function_name (){";
$type = rand(0, 3) * 0;
switch($type){
/* Addition of n times of field value / n, + modulus:
Time guarantee: 100 iterations or less */
case 0:
$eax = hashcash_random_string(rand(8,10), $expired);
$expired [] = $eax;
$val = hashcash_field_value();
$inc = rand($val / 100, $val - 1);
$n = floor($val / $inc);
$r = $val % $inc;
$js .= "var $eax = $inc; ";
for($i = 0; $i < $n - 1; $i++){
$js .= "$eax += $inc; ";
}
$js .= "$eax += $r; ";
$js .= "return $eax; ";
break;
/* Conversion from binary:
Time guarantee: log(n) iterations or less */
case 1:
$eax = hashcash_random_string(rand(8,10), $expired);
$expired [] = $eax;
$ebx = hashcash_random_string(rand(8,10), $expired);
$expired [] = $ebx;
$ecx = hashcash_random_string(rand(8,10), $expired);
$expired [] = $ecx;
$val = hashcash_field_value();
$binval = strrev(base_convert($val, 10, 2));
$js .= "var $eax = \"$binval\"; ";
$js .= "var $ebx = 0; ";
$js .= "var $ecx = 0; ";
$js .= "while($ecx < $eax.length){ ";
$js .= "if($eax.charAt($ecx) == \"1\") { ";
$js .= "$ebx += Math.pow(2, $ecx); ";
$js .= "} ";
$js .= "$ecx++; ";
$js .= "} ";
$js .= "return $ebx; ";
break;
/* Multiplication of square roots:
Time guarantee: constant time */
case 2:
$val = hashcash_field_value();
$sqrt = floor(sqrt($val));
$r = $val - ($sqrt * $sqrt);
$js .= "return $sqrt * $sqrt + $r; ";
break;
/* Sum of random numbers to the final value:
Time guarantee: log(n) expected value */
case 3:
$val = hashcash_field_value();
$js .= "return ";
$i = 0;
while($val > 0){
if($i++ > 0)
$js .= "+";
$temp = rand(1, $val);
$val -= $temp;
$js .= $temp;
}
$js .= ";";
break;
}
$js .= "} $function_name ();";
// pack bytes
function strToLongs($s) {
$l = array();
// pad $s to some multiple of 4
$s = preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY);
while(count($s) % 4 != 0){
$s [] = ' ';
}
for ($i = 0; $i < ceil(count($s)/4); $i++) {
$l[$i] = ord($s[$i*4]) + (ord($s[$i*4+1]) << 8) + (ord($s[$i*4+2]) << 16) + (ord($s[$i*4+3]) << 24);
}
return $l;
}
// xor all the bytes with a random key
$key = rand(21474836, 2126008810);
$js = strToLongs($js);
for($i = 0; $i < count($js); $i++){
$js[$i] = $js[$i] ^ $key;
}
// libs function encapsulation
$libs_name = hashcash_random_string(rand(6,18), $expired);
$expired [] = $libs_name;
$libs = "function $libs_name(){";
// write bytes to javascript, xor with key
$data_name = hashcash_random_string(rand(6,18), $expired);
$expired [] = $data_name;
$libs .= "var $data_name = new Array(" . count($js) . "); ";
for($i = 0; $i < count($js); $i++){
$libs .= $data_name . '[' . $i . '] = ' . $js[$i] . ' ^ ' . $key .'; ';
}
// convert bytes back to string
$libs .= " var a = new Array($data_name.length); ";
$libs .= "for (var i=0; i<" . $data_name . ".length; i++) { ";
$libs .= 'a[i] = String.fromCharCode(' . $data_name .'[i] & 0xFF, ' . $data_name . '[i]>>>8 & 0xFF, ';
$libs .= $data_name . '[i]>>>16 & 0xFF, ' . $data_name . '[i]>>>24 & 0xFF); } ';
$libs .= "return eval(a.join('')); ";
// call libs function
$libs .= "} $libs_name();";
// return code
echo $libs;
?>