aboutsummaryrefslogtreecommitdiff
path: root/gen.go
diff options
context:
space:
mode:
Diffstat (limited to 'gen.go')
-rw-r--r--gen.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/gen.go b/gen.go
new file mode 100644
index 0000000..21b90a2
--- /dev/null
+++ b/gen.go
@@ -0,0 +1,59 @@
+package main
+
+import (
+ "crypto/rand"
+ "crypto/sha512"
+ "fmt"
+
+ "golang.org/x/crypto/ed25519"
+)
+
+func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error {
+ pub, sec, err := ed25519.GenerateKey(rand.Reader)
+ if err != nil {
+ return err
+ }
+
+ digest := sha512.Sum512(sec)
+ enckey := new(EncKey)
+ copy(enckey.PKAlg[:], PKAlg[:])
+ copy(enckey.KDFAlg[:], KDFAlg[:])
+ copy(enckey.SecKey[:], sec[:])
+ enckey.KDFRounds = uint32(rounds)
+ // KDF
+ rand.Read(enckey.KeyNum[:])
+ rand.Read(enckey.Salt[:])
+ copy(enckey.Checksum[:], digest[:len(enckey.Checksum)])
+
+ sb64, err := enckey.Marshal()
+ if err != nil {
+ return err
+ }
+
+ sfile := File{
+ Comment: fmt.Sprintf("%s secret key", comment),
+ B64: sb64,
+ }
+ if err := sfile.EncodeFile(seckeyfile); err != nil {
+ return err
+ }
+
+ pubkey := new(PubKey)
+ copy(pubkey.PKAlg[:], PKAlg[:])
+ copy(pubkey.KeyNum[:], enckey.KeyNum[:])
+ copy(pubkey.PubKey[:], pub[:])
+
+ pb64, err := enckey.Marshal()
+ if err != nil {
+ return err
+ }
+ pfile := File{
+ Comment: fmt.Sprintf("%s public key", comment),
+ B64: pb64,
+ }
+ if err := pfile.EncodeFile(pubkeyfile); err != nil {
+ return err
+ }
+
+ return nil
+}