summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/ed25519-converter.go83
-rw-r--r--scripts/go.mod7
-rw-r--r--scripts/go.sum6
3 files changed, 96 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()
+}
diff --git a/scripts/go.mod b/scripts/go.mod
new file mode 100644
index 0000000..0184c4f
--- /dev/null
+++ b/scripts/go.mod
@@ -0,0 +1,7 @@
+module scripts
+
+go 1.24.5
+
+require golang.org/x/crypto v0.41.0
+
+require golang.org/x/sys v0.35.0 // indirect
diff --git a/scripts/go.sum b/scripts/go.sum
new file mode 100644
index 0000000..fd8f3eb
--- /dev/null
+++ b/scripts/go.sum
@@ -0,0 +1,6 @@
+golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
+golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
+golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
+golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
+golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=