Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit ecf94d0

Browse files
authored
Merge pull request #36 from keybase/david/ed25519-everywhere
Generate SSH keys in go rather than via shelling out to ssh-keygen
2 parents 11f8d55 + 1f92dcc commit ecf94d0

File tree

5 files changed

+53
-64
lines changed

5 files changed

+53
-64
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module github.com/keybase/bot-sshca
33
go 1.12
44

55
require (
6+
github.com/ScaleFT/sshkeys v0.0.0-20181112160850-82451a803681
7+
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a // indirect
68
github.com/google/uuid v1.1.1
79
github.com/keybase/go-keybase-chat-bot v0.0.0-20190812134859-bc54fd9cf83b
810
github.com/sirupsen/logrus v1.4.2

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
2+
github.com/ScaleFT/sshkeys v0.0.0-20181112160850-82451a803681 h1:JS2rl38kZmHgWa0xINSaSYH0Whtvem64/4+Ef0+Y5pE=
3+
github.com/ScaleFT/sshkeys v0.0.0-20181112160850-82451a803681/go.mod h1:WfDateMPQ/55dPbZRp5Zxrux5WiEaHsjk9puUhz0KgY=
24
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
35
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
46
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
57
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a h1:saTgr5tMLFnmy/yg3qDTft4rE5DY2uJ/cCxCe3q0XTU=
9+
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a/go.mod h1:Bw9BbhOJVNR+t0jCqx2GC6zv0TGBsShs56Y3gfSCvl0=
610
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
711
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
812
github.com/keybase/go-keybase-chat-bot v0.0.0-20190812134859-bc54fd9cf83b h1:7Te2f9LQ/rd6XSzpntz6BaCBgglZ0uiCdv3/GdhX9VA=

src/keybaseca/sshutils/generate.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package sshutils
2+
3+
import (
4+
"crypto/rand"
5+
"fmt"
6+
"io/ioutil"
7+
8+
"github.com/ScaleFT/sshkeys"
9+
"github.com/keybase/bot-sshca/src/shared"
10+
"golang.org/x/crypto/ed25519"
11+
"golang.org/x/crypto/ssh"
12+
)
13+
14+
// Generate a new SSH key. Places the private key at filename and the public key at filename.pub.
15+
// We use ed25519 keys since they may be more secure (and are smaller). The go crypto ssh library
16+
// does not support marshalling ed25519 keys so we use ScaleFT/sshkeys to marshal them to the
17+
// correct on disk format for SSH
18+
func generateNewSSHKey(filename string) error {
19+
// Generate the key
20+
pub, private, err := ed25519.GenerateKey(rand.Reader)
21+
if err != nil {
22+
return fmt.Errorf("failed to generate ed25519 key: %v", err)
23+
}
24+
25+
// Write the private key
26+
bytes, err := sshkeys.Marshal(private, &sshkeys.MarshalOptions{Format: sshkeys.FormatOpenSSHv1})
27+
if err != nil {
28+
return fmt.Errorf("failed to marshal ed25519 key: %v", err)
29+
}
30+
err = ioutil.WriteFile(filename, bytes, 0600)
31+
if err != nil {
32+
return fmt.Errorf("failed to write ssh private key to %s: %v", filename, err)
33+
}
34+
35+
// Write the public key
36+
publicKey, err := ssh.NewPublicKey(pub)
37+
if err != nil {
38+
return fmt.Errorf("failed to create public key from ed25519 key: %v", err)
39+
}
40+
bytes = ssh.MarshalAuthorizedKey(publicKey)
41+
err = ioutil.WriteFile(shared.KeyPathToPubKey(filename), bytes, 0600)
42+
if err != nil {
43+
return fmt.Errorf("failed to write ssh public key to %s: %v", shared.KeyPathToPubKey(filename), err)
44+
}
45+
46+
return nil
47+
}

src/keybaseca/sshutils/generate_unix.go

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/keybaseca/sshutils/generate_windows.go

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)