git » repo » main » tree

[main] / services / keys / keys / generate.php

<?php

require_once "common.php";

$openssl_config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 2048,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

function try_generate_key() {
    global $openssl_config;

    $login = $_POST['login'] ?? '';
    $comment = $_POST['comment'] ?? '';

    if (!$login || !$comment) {
        http_response_code(400);
        return '<div class="alert alert-danger" role="alert">No login or comment!<div>';
    }

    if (!preg_match('/^[-_\w]+$/', $login)) {
        return '<div class="alert alert-danger" role="alert">Bad login!<div>';
    }

    $redis = new Redis();
    $redis->connect('redis');

    if ($redis->exists($login)) {
        http_response_code(400);
        return '<div class="alert alert-danger" role="alert">Such key already exists!</div>';
    }

    $private_key = openssl_pkey_new($openssl_config);
    openssl_pkey_export($private_key, $private_key_pem);
    $public_key_pem = openssl_pkey_get_details($private_key)['key'];
    $private_key_pem = trim($private_key_pem, "\n");

    $hash = password_hash($private_key_pem, PASSWORD_DEFAULT, ["cost" => 6]);

    $ret = [
        'comment' => $comment,
        'public_key_pem' => $public_key_pem,
        'private_key_hash' => $hash,
    ];

    if (!$redis->setNx($login, json_encode($ret))) {
        http_response_code(400);
        return '<div class="alert alert-danger" role="alert">Such key already exists!</div>';
    }

    $login_encoded = urlencode($login);

    return <<< END
Generated!<br/>
Save your private key in a safe place!<br/>
Private key:<br/>
<pre>
$private_key_pem
</pre>
<br/>

Public key:<br/>
<pre>
$public_key_pem
</pre>
<a class="btn btn-outline-success" href='check.php?login=$login_encoded'>Next</a>
END;
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $ret = try_generate_key();
    head("Generate new key");
    echo $ret;
} else {
    head("Generate new key");
?>
    <h1>Generate key</h1>
    <form method="POST">
    <div class="form-group">
        <label for="login">Login</label>
        <input type="text" class="form-control" id="login" name="login"><br>
        <label for="comment">Comment</label>
        <input type="text" class="form-control" id="comment" name="comment"><br>
    </div>
    <input class="btn btn-outline-success" type="submit" value="Generate">
    </form>

<?php
}
foot();