diff --git a/app/Livewire/Security/PrivateKey/Create.php b/app/Livewire/Security/PrivateKey/Create.php index cd1c06568..30449b220 100644 --- a/app/Livewire/Security/PrivateKey/Create.php +++ b/app/Livewire/Security/PrivateKey/Create.php @@ -26,7 +26,7 @@ class Create extends Component 'value' => 'private Key', ]; - public function generateNewKey() + public function generateNewRSAKey() { try { $this->rateLimit(10); @@ -37,6 +37,17 @@ class Create extends Component return handleError($e, $this); } } + public function generateNewEDKey() + { + try { + $this->rateLimit(10); + $this->name = generate_random_name(); + $this->description = 'Created by Coolify'; + ['private' => $this->value, 'public' => $this->publicKey] = generateSSHKey('ed25519'); + } catch(\Throwable $e) { + return handleError($e, $this); + } + } public function updated($updateProperty) { if ($updateProperty === 'value') { diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index baee4ce15..458dbae85 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -39,6 +39,7 @@ use Lcobucci\JWT\Encoding\JoseEncoder; use Lcobucci\JWT\Signer\Key\InMemory; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\Token\Builder; +use phpseclib3\Crypt\EC; use Poliander\Cron\CronExpression; use Visus\Cuid2\Cuid2; use phpseclib3\Crypt\RSA; @@ -165,13 +166,22 @@ function generate_random_name(?string $cuid = null): string } return Str::kebab("{$generator->getName()}-$cuid"); } -function generateSSHKey() +function generateSSHKey(string $type = 'rsa') { - $key = RSA::createKey(); - return [ - 'private' => $key->toString('PKCS1'), - 'public' => $key->getPublicKey()->toString('OpenSSH', ['comment' => 'coolify-generated-ssh-key']) - ]; + if ($type === 'rsa') { + $key = RSA::createKey(); + return [ + 'private' => $key->toString('PKCS1'), + 'public' => $key->getPublicKey()->toString('OpenSSH', ['comment' => 'coolify-generated-ssh-key']) + ]; + } else if ($type === 'ed25519') { + $key = EC::createKey('Ed25519'); + return [ + 'private' => $key->toString('OpenSSH'), + 'public' => $key->getPublicKey()->toString('OpenSSH', ['comment' => 'coolify-generated-ssh-key']) + ]; + } + throw new Exception('Invalid key type'); } function formatPrivateKey(string $privateKey) { diff --git a/resources/views/livewire/security/private-key/create.blade.php b/resources/views/livewire/security/private-key/create.blade.php index d44e2c470..1bace9f3a 100644 --- a/resources/views/livewire/security/private-key/create.blade.php +++ b/resources/views/livewire/security/private-key/create.blade.php @@ -1,6 +1,12 @@