diff options
Diffstat (limited to 'modules-available/rebootcontrol/inc/sshkey.inc.php')
-rw-r--r-- | modules-available/rebootcontrol/inc/sshkey.inc.php | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/modules-available/rebootcontrol/inc/sshkey.inc.php b/modules-available/rebootcontrol/inc/sshkey.inc.php new file mode 100644 index 00000000..b4e36d25 --- /dev/null +++ b/modules-available/rebootcontrol/inc/sshkey.inc.php @@ -0,0 +1,40 @@ +<?php + +class SSHKey +{ + + public static function getPrivateKey() { + $privKey = Property::get("rebootcontrol-private-key"); + if (!$privKey) { + $rsaKey = openssl_pkey_new(array( + 'private_key_bits' => 2048, + 'private_key_type' => OPENSSL_KEYTYPE_RSA)); + openssl_pkey_export( openssl_pkey_get_private($rsaKey), $privKey); + Property::set("rebootcontrol-private-key", $privKey); + } + return $privKey; + } + + public static function getPublicKey() { + $pkImport = openssl_pkey_get_private(self::getPrivateKey()); + return self::sshEncodePublicKey($pkImport); + } + + private static function sshEncodePublicKey($privKey) { + $keyInfo = openssl_pkey_get_details($privKey); + $buffer = pack("N", 7) . "ssh-rsa" . + self::sshEncodeBuffer($keyInfo['rsa']['e']) . + self::sshEncodeBuffer($keyInfo['rsa']['n']); + return "ssh-rsa " . base64_encode($buffer); + } + + private static function sshEncodeBuffer($buffer) { + $len = strlen($buffer); + if (ord($buffer[0]) & 0x80) { + $len++; + $buffer = "\x00" . $buffer; + } + return pack("Na*", $len, $buffer); + } + +}
\ No newline at end of file |