diff --git a/var/www/common.php b/var/www/common.php index ae57f84..13fd598 100644 --- a/var/www/common.php +++ b/var/www/common.php @@ -1,4 +1,5 @@ prepare('INSERT INTO captcha (id, time, code) VALUES (?, ?, ?);'); + $randid = mt_rand(); + $time = time(); + $stmt = $db->prepare('INSERT INTO captcha (id, time, code) VALUES (?, ?, ?);'); $stmt->execute([$randid, $time, $code]); echo "Copy: "; - if(CAPTCHA===1){ - $im=imagecreatetruecolor(55, 24); - $bg=imagecolorallocate($im, 0, 0, 0); - $fg=imagecolorallocate($im, 255, 255, 255); + if(CAPTCHA === 1){ + $im = imagecreatetruecolor(55, 24); + $bg = imagecolorallocate($im, 0, 0, 0); + $fg = imagecolorallocate($im, 255, 255, 255); imagefill($im, 0, 0, $bg); imagestring($im, 5, 5, 5, $code, $fg); echo ' $ok, 'message' => $message, 'onion' => $onion]; + } elseif(($priv = base64_decode($priv_key, true)) !== false){ + if(strpos($priv, '== ed25519v1-secret: type0 ==' . hex2bin('000000')) !== 0 || strlen($priv) !== 96){ + $message = 'Error: v3 secret key invalid.'; + $ok = false; + } else { + $onion = get_onion_v3(substr($priv, 32)); + } + return ['ok' => $ok, 'message' => $message, 'onion' => $onion]; + } + $message = 'Error: private key invalid.'; + $ok = false; + return ['ok' => $ok, 'message' => $message, 'onion' => $onion]; +} + +function generate_new_onion(int $version = 3) : array { + $priv_key = ''; + $onion = ''; + if($version === 2){ + $pkey = openssl_pkey_new(['private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA]); + openssl_pkey_export($pkey, $priv_key); + $onion = get_onion_v2($pkey); + openssl_pkey_free($pkey); + } else { + $seed = random_bytes(32); + $sk = ed25519_seckey_expand($seed); + $priv_key = base64_encode('== ed25519v1-secret: type0 ==' . hex2bin('000000') . $sk); + $onion = get_onion_v3($sk); + } + return ['priv_key' => $priv_key, 'onion' => $onion]; +} + +function ed25519_seckey_expand(string $seed) : string { + $sk = hash('sha512', substr($seed, 0, 32), true); + $sk[0] = chr(ord($sk[0]) & 248); + $sk[31] = chr(ord($sk[31]) & 63); + $sk[31] = chr(ord($sk[31]) | 64); + return $sk; +} diff --git a/var/www/html/register.php b/var/www/html/register.php index cc44d67..439f872 100644 --- a/var/www/html/register.php +++ b/var/www/html/register.php @@ -54,33 +54,27 @@ if($_SERVER['REQUEST_METHOD']==='POST'){ } } if($ok){ - $check=$db->prepare('SELECT null FROM onions WHERE onion=?;'); if(isset($_REQUEST['private_key']) && !empty(trim($_REQUEST['private_key']))){ - $priv_key=trim($_REQUEST['private_key']); - if(($pkey=openssl_pkey_get_private($priv_key))!==false){ - $details=openssl_pkey_get_details($pkey); - if($details['bits']!==1024){ - echo '

Error: private key not of bitsize 1024.

'; - $ok=false; - }else{ - $onion=get_onion($pkey); - $check->execute([$onion]); - if($check->fetch(PDO::FETCH_NUM)){ - echo '

Error onion already exists.

'; - $ok=false; - } + $priv_key = trim($_REQUEST['private_key']); + $data = private_key_to_onion($priv_key); + $onion = $data['onion']; + if(!$data['ok']){ + echo "

$data[message]

"; + $ok = false; + } else { + $check=$db->prepare('SELECT null FROM onions WHERE onion=?;'); + $check->execute([$onion]); + if($check->fetch(PDO::FETCH_NUM)){ + echo '

Error onion already exists.

'; + $ok = false; } - openssl_pkey_free($pkey); - }else{ - echo '

Error: private key invalid.

'; - $ok=false; } }else{ + $check=$db->prepare('SELECT null FROM onions WHERE onion=?;'); do{ - $pkey=openssl_pkey_new(['private_key_bits'=>1024, 'private_key_type'=>OPENSSL_KEYTYPE_RSA]); - openssl_pkey_export($pkey, $priv_key); - $onion=get_onion($pkey); - openssl_pkey_free($pkey); + $data = generate_new_onion(2); + $priv_key = $data['priv_key']; + $onion = $data['onion']; $check->execute([$onion]); }while($check->fetch(PDO::FETCH_NUM)); }