aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-22 23:58:53 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-22 23:58:53 +0200
commit25e9c9f19f90aea367ae9831df1e7208e3f5f0b5 (patch)
treed21d2d8327861b0fbb48ba93f728cf51cb5d434c
parentab4919d1d12e130155d11743badd078fe79cf7aa (diff)
...
-rw-r--r--file/file.go6
-rw-r--r--key/key.go10
-rw-r--r--key/sec.go24
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()
}