Skip to content

Commit 56201be

Browse files
committed
optimize the gen key util
1 parent 549c0ca commit 56201be

File tree

4 files changed

+28
-31
lines changed

4 files changed

+28
-31
lines changed

lib/secure/secure_test.go

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -234,35 +234,26 @@ func TestBelongs(t *testing.T) {
234234
func TestGenerateKeyFile(t *testing.T) {
235235
g := got.T(t)
236236

237-
g.MkdirAll(0, "tmp")
238-
239-
p := "tmp/id_ed25519"
240-
241-
g.E(secure.GenerateKeyFile(false, p, "pc", "pass"))
237+
prvRaw, pubRaw, err := secure.GenerateKeyFile(false, "pc", "pass")
238+
g.E(err)
242239

243-
pub, err := secure.SSHPubKey(g.Read(p + secure.PUB_KEY_EXT).Bytes())
240+
pub, err := secure.SSHPubKey(pubRaw)
244241
g.E(err)
245242
g.Is(pub, ed25519.PublicKey{})
246243

247-
prv, err := secure.SSHPrvKey(g.Read(p).Bytes(), "pass")
244+
prv, err := secure.SSHPrvKey(prvRaw, "pass")
248245
g.E(err)
249246
g.Is(prv, ed25519.PrivateKey{})
250247
}
251248

252249
func TestGenerateDeterministicKeyFile(t *testing.T) {
253250
g := got.T(t)
254251

255-
g.MkdirAll(0, "tmp")
256-
257-
p := "tmp/id_ed25519_deterministic"
258-
259-
g.E(secure.GenerateKeyFile(true, p, "pc", "pass"))
260-
261-
pub := g.Read(p + secure.PUB_KEY_EXT).Bytes()
262-
263-
g.E(secure.GenerateKeyFile(true, p, "pc", "pass"))
252+
_, pub, err := secure.GenerateKeyFile(true, "pc", "pass")
253+
g.E(err)
264254

265-
prv := g.Read(p).Bytes()
255+
prv, _, err := secure.GenerateKeyFile(true, "pc", "pass")
256+
g.E(err)
266257

267258
yes, err := secure.Belongs(pub, prv, "pass")
268259
g.E(err)

lib/secure/utils.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"encoding/pem"
1111
"fmt"
1212
"math/big"
13-
"os"
1413

1514
"golang.org/x/crypto/argon2"
1615
"golang.org/x/crypto/hkdf"
@@ -83,53 +82,50 @@ func bytesToKeys(private []byte, passphrase string, publics [][]byte) (crypto.Pr
8382
return prv, pubs, nil
8483
}
8584

86-
// GenerateKeyFile generates a new ed25519 ssh key pair.
85+
// GenerateKeyFile generates a new ed25519 ssh key pair. The first return value is the private key in PEM format,
86+
// the second return value is the public key in ssh authorized_key format.
8787
// If deterministic is true, the key will be generated based on the passphrase itself,
8888
// so the same passphrase will always generate the same key, this is useful if you don't want to backup the key,
8989
// but it's less secure, you must use a strong passphrase.
90-
func GenerateKeyFile(deterministic bool, privateKeyPath, comment, passphrase string) error {
90+
func GenerateKeyFile(deterministic bool, comment, passphrase string) ([]byte, []byte, error) {
9191
var prvKeyPem *pem.Block
9292

9393
seed := rand.Reader
9494

9595
if passphrase != "" && deterministic {
9696
salt := sha256.Sum256([]byte(passphrase))
97-
derivedKey := argon2.IDKey([]byte(passphrase), salt[:], 128, 64*1024, 4, 32)
97+
derivedKey := argon2.IDKey([]byte(passphrase), salt[:], 1, 64*1024, 4, 32)
9898
seed = hkdf.New(sha256.New, derivedKey, nil, nil)
9999
}
100100

101101
publicKey, privateKey, err := ed25519.GenerateKey(seed)
102102
if err != nil {
103-
return err
103+
return nil, nil, err
104104
}
105105

106106
sshPubKey, err := ssh.NewPublicKey(publicKey)
107107
if err != nil {
108-
return err
108+
return nil, nil, err
109109
}
110110

111111
pubKeyString := fmt.Sprintf("%s %s %s\n",
112112
sshPubKey.Type(),
113113
base64.StdEncoding.EncodeToString(sshPubKey.Marshal()),
114114
comment,
115115
)
116-
err = os.WriteFile(privateKeyPath+PUB_KEY_EXT, []byte(pubKeyString), 0o644)
117-
if err != nil {
118-
return err
119-
}
120116

121117
if passphrase != "" {
122118
prvKeyPem, err = ssh.MarshalPrivateKeyWithPassphrase(privateKey, comment, []byte(passphrase))
123119
} else {
124120
prvKeyPem, err = ssh.MarshalPrivateKey(privateKey, comment)
125121
}
126122
if err != nil {
127-
return err
123+
return nil, nil, err
128124
}
129125

130126
prvKeyBytes := pem.EncodeToMemory(prvKeyPem)
131127

132-
return os.WriteFile(privateKeyPath, prvKeyBytes, 0o600)
128+
return prvKeyBytes, []byte(pubKeyString), nil
133129
}
134130

135131
func bigIntToBytes(a *big.Int, padding int) []byte {

lib/whisper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
const (
15-
APIVersion = "v0.8.14"
15+
APIVersion = "v0.9.0"
1616
WireFormatVersion = byte(8)
1717
)
1818

main.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,17 @@ func genKey(path string) {
315315
comment := readLine("Enter the comment for it: ")
316316
deterministic := readLine("Enter yes for deterministic key: ") == "yes"
317317

318-
err := secure.GenerateKeyFile(deterministic, path, comment, pass)
318+
prv, pub, err := secure.GenerateKeyFile(deterministic, comment, pass)
319+
if err != nil {
320+
exit(err)
321+
}
322+
323+
err = os.WriteFile(path, prv, 0o600)
324+
if err != nil {
325+
exit(err)
326+
}
327+
328+
err = os.WriteFile(path+secure.PUB_KEY_EXT, pub, 0o644)
319329
if err != nil {
320330
exit(err)
321331
}

0 commit comments

Comments
 (0)