diff options
| author | Kyren223 <kyren223@proton.me> | 2025-08-08 19:34:10 +0300 |
|---|---|---|
| committer | Kyren223 <kyren223@proton.me> | 2025-08-08 19:34:10 +0300 |
| commit | 824f3ba43599913f7623aefaa46d285ae4fa6f02 (patch) | |
| tree | d8ba7b9bd6f1a793777d587ad30651d59e1ba742 /scripts/ed25519-converter.go | |
| parent | 64e4e52cefac8643c827a4bdfae1e4663e67d9e6 (diff) | |
Added ed25519-converter script
Diffstat (limited to 'scripts/ed25519-converter.go')
| -rw-r--r-- | scripts/ed25519-converter.go | 83 |
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() +} |
