From f221c4644877dcce83e5bb73b086f833f75dfc4a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 18 Apr 2017 23:58:58 +0200 Subject: verify --- main.go | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file 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 +} -- cgit v1.2.3