aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-04-18 23:58:58 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-04-18 23:58:58 +0200
commitf221c4644877dcce83e5bb73b086f833f75dfc4a (patch)
treed9ecd12117ca02e0b949cd995e2085c8fab0b6c1 /main.go
parentcbcc151ff94e89866d3c889f2346b6ba036e39fa (diff)
verify
Diffstat (limited to 'main.go')
-rw-r--r--main.go79
1 files changed, 67 insertions, 12 deletions
diff --git a/main.go b/main.go
index dddc624..7419752 100644
--- a/main.go
+++ b/main.go
@@ -1,9 +1,12 @@
package main
import (
+ "errors"
"flag"
"fmt"
+ "io/ioutil"
"log"
+ "path"
)
const (
@@ -37,22 +40,29 @@ var (
func main() {
flag.Parse()
- var rounds = 42
- if *nopass {
- rounds = 0
- }
-
switch {
case *generate:
+ rounds := DefaultRounds
+ if *nopass {
+ rounds = 0
+ }
if err := Generate(*pub, *sec, *comment, rounds); err != nil {
log.Fatal(err)
}
case *sign:
+ if err := Sign(*msg, *sec, *embed); err != nil {
+ log.Fatal(err)
+ }
case *verify:
+ if err := Verify(*msg, *pub); err != nil {
+ log.Fatal(err)
+ }
+ default:
+ flag.Usage()
}
}
-func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error {
+func Generate(pubFile, secFile, comment string, rounds int) error {
pubKey, encKey, err := NewKey()
if err != nil {
return err
@@ -66,30 +76,75 @@ func Generate(pubkeyfile, seckeyfile, comment string, rounds int) error {
encKey.Kdf(pass, rounds)
}
- sb64, err := Marshal(encKey)
+ encRaw, err := Marshal(encKey)
if err != nil {
return err
}
sfile := File{
Comment: fmt.Sprintf("%s secret key", comment),
- RawKey: sb64,
+ RawKey: encRaw,
}
- if err := sfile.WriteFile(seckeyfile, SecMode); err != nil {
+ if err := sfile.WriteFile(secFile, SecMode); err != nil {
return err
}
- pb64, err := Marshal(pubKey)
+ pubRaw, err := Marshal(pubKey)
if err != nil {
return err
}
pfile := File{
Comment: fmt.Sprintf("%s public key", comment),
- RawKey: pb64,
+ RawKey: pubRaw,
}
- if err := pfile.WriteFile(pubkeyfile, PubMode); err != nil {
+ if err := pfile.WriteFile(pubFile, PubMode); err != nil {
return err
}
return nil
}
+
+func Sign(msgFile, secFile string, embed bool) error {
+ sfile, err := ParseFile(secFile)
+ if err != nil {
+ return err
+ }
+ encKey := new(EncKey)
+ if err := Unmarshal(sfile.RawKey, encKey); err != nil {
+ return err
+ }
+ if encKey.KDFRounds > 0 {
+ pass, err := AskPassword(nil, false)
+ if err != nil {
+ return err
+ }
+ encKey.Kdf(pass, int(encKey.KDFRounds))
+ }
+ if !encKey.IsValid() {
+ return errors.New("invalid key")
+ }
+ body, err := ioutil.ReadFile(msgFile)
+ if err != nil {
+ return err
+ }
+ sig := encKey.Sign(body)
+ sigRaw, err := Marshal(sig)
+ if err != nil {
+ return err
+ }
+ sigfile := File{
+ Comment: fmt.Sprintf("verify with %s", path.Base(secFile)), // TODO replace .sec with .pub
+ RawKey: sigRaw,
+ }
+ if embed {
+ sigfile.Message = body
+ }
+ if err := sigfile.WriteFile(msgFile+".sig", PubMode); err != nil {
+ return err
+ }
+ return nil
+}
+
+func Verify(msgFile, pubFile string) error {
+ return nil
+}