aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gen.go80
-rw-r--r--gen_test.go12
-rw-r--r--keys.go29
-rw-r--r--main.go43
4 files changed, 72 insertions, 92 deletions
diff --git a/gen.go b/gen.go
deleted file mode 100644
index 40367de..0000000
--- a/gen.go
+++ /dev/null
@@ -1,80 +0,0 @@
-package main
-
-import (
- "crypto/rand"
- "crypto/sha512"
- "encoding/binary"
- "fmt"
-
- "golang.org/x/crypto/ed25519"
-)
-
-func NewKey() (PubKey, EncKey, error) {
- pub, sec, err := ed25519.GenerateKey(rand.Reader)
- if err != nil {
- return PubKey{}, EncKey{}, err
- }
- var keyNum uint64
- if err := binary.Read(rand.Reader, binary.BigEndian, &keyNum); err != nil {
- return PubKey{}, EncKey{}, err
- }
- pubKey := PubKey{
- PKAlg: PKAlg,
- KeyNum: keyNum,
- }
- copy(pubKey.PubKey[:], pub)
-
- encKey := EncKey{
- PKAlg: PKAlg,
- KDFAlg: KDFAlg,
- KeyNum: keyNum,
- }
- copy(encKey.SecKey[:], sec)
- checkSum := sha512.Sum512(sec)
- copy(encKey.Checksum[:], checkSum[:len(encKey.Checksum)])
- rand.Read(encKey.Salt[:])
-
- return pubKey, encKey, nil
-}
-
-func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error {
- pubKey, encKey, err := NewKey()
- if err != nil {
- return err
- }
-
- if rounds > 0 {
- pass, err := AskPassword(nil, true)
- if err != nil {
- return err
- }
- encKey.Kdf(pass, rounds)
- }
-
- sb64, err := Marshal(encKey)
- if err != nil {
- return err
- }
-
- sfile := File{
- Comment: fmt.Sprintf("%s secret key", comment),
- RawKey: sb64,
- }
- if err := sfile.WriteFile(seckeyfile, SecMode); err != nil {
- return err
- }
-
- pb64, err := Marshal(pubKey)
- if err != nil {
- return err
- }
- pfile := File{
- Comment: fmt.Sprintf("%s public key", comment),
- RawKey: pb64,
- }
- if err := pfile.WriteFile(pubkeyfile, PubMode); err != nil {
- return err
- }
-
- return nil
-}
diff --git a/gen_test.go b/gen_test.go
deleted file mode 100644
index 8f8bbba..0000000
--- a/gen_test.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package main
-
-import "testing"
-
-func TestNewKey(t *testing.T) {
- pub, sec, err := NewKey()
- if err != nil {
- t.Error(err)
- }
- t.Log(pub)
- t.Log(sec)
-}
diff --git a/keys.go b/keys.go
index 85675e2..c340e96 100644
--- a/keys.go
+++ b/keys.go
@@ -2,6 +2,7 @@ package main
import (
"bytes"
+ "crypto/rand"
"crypto/sha512"
"encoding/binary"
@@ -97,3 +98,31 @@ func Marshal(v interface{}) ([]byte, error) {
}
return buf.Bytes(), nil
}
+
+func NewKey() (PubKey, EncKey, error) {
+ pub, sec, err := ed25519.GenerateKey(rand.Reader)
+ if err != nil {
+ return PubKey{}, EncKey{}, err
+ }
+ var keyNum uint64
+ if err := binary.Read(rand.Reader, binary.BigEndian, &keyNum); err != nil {
+ return PubKey{}, EncKey{}, err
+ }
+ pubKey := PubKey{
+ PKAlg: PKAlg,
+ KeyNum: keyNum,
+ }
+ copy(pubKey.PubKey[:], pub)
+
+ encKey := EncKey{
+ PKAlg: PKAlg,
+ KDFAlg: KDFAlg,
+ KeyNum: keyNum,
+ }
+ copy(encKey.SecKey[:], sec)
+ checkSum := sha512.Sum512(sec)
+ copy(encKey.Checksum[:], checkSum[:len(encKey.Checksum)])
+ rand.Read(encKey.Salt[:])
+
+ return pubKey, encKey, nil
+}
diff --git a/main.go b/main.go
index db4579f..dddc624 100644
--- a/main.go
+++ b/main.go
@@ -2,6 +2,7 @@ package main
import (
"flag"
+ "fmt"
"log"
)
@@ -50,3 +51,45 @@ func main() {
case *verify:
}
}
+
+func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error {
+ pubKey, encKey, err := NewKey()
+ if err != nil {
+ return err
+ }
+
+ if rounds > 0 {
+ pass, err := AskPassword(nil, true)
+ if err != nil {
+ return err
+ }
+ encKey.Kdf(pass, rounds)
+ }
+
+ sb64, err := Marshal(encKey)
+ if err != nil {
+ return err
+ }
+
+ sfile := File{
+ Comment: fmt.Sprintf("%s secret key", comment),
+ RawKey: sb64,
+ }
+ if err := sfile.WriteFile(seckeyfile, SecMode); err != nil {
+ return err
+ }
+
+ pb64, err := Marshal(pubKey)
+ if err != nil {
+ return err
+ }
+ pfile := File{
+ Comment: fmt.Sprintf("%s public key", comment),
+ RawKey: pb64,
+ }
+ if err := pfile.WriteFile(pubkeyfile, PubMode); err != nil {
+ return err
+ }
+
+ return nil
+}