From 25e9c9f19f90aea367ae9831df1e7208e3f5f0b5 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 22 Jul 2017 23:58:53 +0200 Subject: ... --- file/file.go | 6 +++++- key/key.go | 10 +++------- key/sec.go | 24 ++++++++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/file/file.go b/file/file.go index 47f117b..156f5b0 100644 --- a/file/file.go +++ b/file/file.go @@ -100,6 +100,7 @@ func ParseFile(fname string, u encoding.BinaryUnmarshaler) (string, io.Reader, e return Parse(body, u) } +// TODO rename func Parse(data []byte, u encoding.BinaryUnmarshaler) (string, io.Reader, error) { block, err := Decode(data) if err != nil { @@ -108,7 +109,10 @@ func Parse(data []byte, u encoding.BinaryUnmarshaler) (string, io.Reader, error) if err := u.UnmarshalBinary(block.Bytes); err != nil { return "", nil, err } - return block.Comment, bytes.NewReader(block.Message), nil + if len(block.Message) > 0 { + return block.Comment, bytes.NewReader(block.Message), nil + } + return block.Comment, nil, nil } // TODO rename diff --git a/key/key.go b/key/key.go index aa2dd0e..585dc7a 100644 --- a/key/key.go +++ b/key/key.go @@ -55,15 +55,11 @@ func Generate(der Deriver) (*Pub, *Sec, error) { // Pbdkf if der != nil { - xor, err := der.Derive(sec.Salt[:], DefaultRounds, len(sec.Key)) - if err != nil { - return nil, nil, err - } - for i := range xor { - sec.Key[i] ^= xor[i] - } sec.KDFRounds = DefaultRounds } + if err := sec.Crypt(der); err != nil { + return nil, nil, err + } // public key pub := &Pub{PKAlg: pkAlg, KeyNum: sec.KeyNum} diff --git a/key/sec.go b/key/sec.go index b5ddc63..3143fb7 100644 --- a/key/sec.go +++ b/key/sec.go @@ -49,20 +49,28 @@ func (v *Sec) Public() *Pub { return pub } +func (v *Sec) Crypt(der Deriver) error { + if der == nil || v.KDFRounds == 0 { + return nil + } + xor, err := der.Derive(v.Salt[:], int(v.KDFRounds), len(v.Key)) + if err != nil { + return err + } + for i := range xor { + v.Key[i] ^= xor[i] + } + return nil +} + // NewSec returns a parsed and decoded secret key func NewSec(data []byte, der Deriver) (*Sec, error) { sec := new(Sec) if err := sec.UnmarshalBinary(data); err != nil { return nil, err } - if der != nil && sec.KDFRounds > 0 { - xor, err := der.Derive(sec.Salt[:], int(sec.KDFRounds), len(sec.Key)) - if err != nil { - return nil, err - } - for i := range xor { - sec.Key[i] ^= xor[i] - } + if err := sec.Crypt(der); err != nil { + return nil, err } return sec, sec.Validate() } -- cgit v1.2.3