diff --git a/keys.go b/keys.go new file mode 100644 index 0000000..c2ca20a --- /dev/null +++ b/keys.go @@ -0,0 +1,61 @@ +package easyssh + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "io" + "io/ioutil" + "os" + + "golang.org/x/crypto/ssh" +) + +// CreateKeyPairFiles is the equivalent of running 'ssh-keygen -t rsa"' +func CreateKeyPairFiles(publicKeyPath, privateKeyPath string) error { + + privateKeyFile, err := os.Create(privateKeyPath) + if err != nil { + return err + } + defer privateKeyFile.Close() + + publicKeyFile, err := os.Create(publicKeyPath) + if err != nil { + return err + } + defer publicKeyFile.Close() + + return CreateKeyPair(publicKeyFile, privateKeyFile) +} + +// CreateKeyPair creates a new SSH Key Pair writing the formatted keys to the corresponding io.Writers +func CreateKeyPair(publicKey, privateKey io.Writer) (err error) { + k, err := rsa.GenerateKey(rand.Reader, 1024) + if err != nil { + return err + } + privatePEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)} + err = pem.Encode(privateKey, privatePEM) + if err != nil { + return err + } + public, err := ssh.NewPublicKey(&k.PublicKey) + if err != nil { + return err + } + _, err = publicKey.Write(ssh.MarshalAuthorizedKey(public)) + return err +} + +// LoadPrivateKey loads a file at the provided path and attempts to load it into an ssh.Signer that can be used for SSH servers +func LoadPrivateKey(filePath string) (ssh.Signer, error) { + + privateBytes, err := ioutil.ReadFile(filePath) + if err != nil { + return nil, err + } + + return ssh.ParsePrivateKey(privateBytes) +}