summaryrefslogtreecommitdiff
path: root/scripts/ed25519-converter.go
diff options
context:
space:
mode:
authorKyren223 <kyren223@proton.me>2025-08-08 19:34:10 +0300
committerKyren223 <kyren223@proton.me>2025-08-08 19:34:10 +0300
commit824f3ba43599913f7623aefaa46d285ae4fa6f02 (patch)
treed8ba7b9bd6f1a793777d587ad30651d59e1ba742 /scripts/ed25519-converter.go
parent64e4e52cefac8643c827a4bdfae1e4663e67d9e6 (diff)
Added ed25519-converter script
Diffstat (limited to 'scripts/ed25519-converter.go')
-rw-r--r--scripts/ed25519-converter.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/scripts/ed25519-converter.go b/scripts/ed25519-converter.go
new file mode 100644
index 0000000..60b3594
--- /dev/null
+++ b/scripts/ed25519-converter.go
@@ -0,0 +1,83 @@
+package main
+
+import (
+ "bufio"
+ "crypto/ed25519"
+ "encoding/base64"
+ "encoding/pem"
+ "fmt"
+ "os"
+ "os/exec"
+ "strings"
+
+ "golang.org/x/crypto/ssh"
+)
+
+func main() {
+ key := ""
+
+ fmt.Println("Key:")
+ _, _ = fmt.Scan(&key)
+
+ reader := bufio.NewReader(os.Stdin)
+ fmt.Print("Passphrase: ")
+ passphrase, _ := reader.ReadString('\n')
+ passphrase = strings.TrimSpace(passphrase)
+
+ keyBytes, err := base64.StdEncoding.DecodeString(key)
+ if err != nil {
+ fmt.Println("Invalid base64:", err)
+ return
+ }
+ if len(keyBytes) != 64 {
+ fmt.Println("Invalid key length:", len(keyBytes))
+ return
+ }
+
+ // Use the first 32 bytes as private seed
+ privKey := ed25519.NewKeyFromSeed(keyBytes[:32])
+
+ var pemBlock *pem.Block
+ hasPassphrase := passphrase != "none"
+ if hasPassphrase {
+ fmt.Printf("Encrypting with passphrase: '%s'\n", passphrase)
+ pemBlock, err = ssh.MarshalPrivateKeyWithPassphrase(privKey, "eko", []byte(passphrase))
+ } else {
+ fmt.Println("Encrypting without passphrase")
+ pemBlock, err = ssh.MarshalPrivateKey(privKey, "eko")
+ }
+
+ if err != nil {
+ fmt.Println("failed private key marshaling", err)
+ return
+ }
+ err = pem.Encode(os.Stdout, pemBlock)
+ if err != nil {
+ fmt.Println("pem encoding to file error:", err)
+ return
+ }
+
+ fmt.Println("randomart")
+ printRandomart(privKey)
+}
+
+func printRandomart(key ed25519.PrivateKey) {
+ pub, err := ssh.NewPublicKey(key.Public())
+ if err != nil {
+ panic(err)
+ }
+
+ tmpfile, err := os.CreateTemp("", "id_ed25519.pub")
+ if err != nil {
+ panic(err)
+ }
+ defer os.Remove(tmpfile.Name())
+
+ tmpfile.Write(ssh.MarshalAuthorizedKey(pub))
+ tmpfile.Close()
+
+ cmd := exec.Command("ssh-keygen", "-lvf", tmpfile.Name())
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Run()
+}