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 | |
| parent | 64e4e52cefac8643c827a4bdfae1e4663e67d9e6 (diff) | |
Added ed25519-converter script
| -rw-r--r-- | scripts/ed25519-converter.go | 83 | ||||
| -rw-r--r-- | scripts/go.mod | 7 | ||||
| -rw-r--r-- | scripts/go.sum | 6 |
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= |
