summaryrefslogtreecommitdiffstats
path: root/modules-available/rebootcontrol/inc/sshkey.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/rebootcontrol/inc/sshkey.inc.php')
-rw-r--r--modules-available/rebootcontrol/inc/sshkey.inc.php40
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