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));
}
|