aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-23 00:53:01 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-23 00:53:01 +0200
commit517383f806898378c4840657521cc60eb969e9d3 (patch)
tree435385342c6cefc9823fd96c073cb95dfcea0451
parent25e9c9f19f90aea367ae9831df1e7208e3f5f0b5 (diff)
bikeshadding
-rw-r--r--file/file.go81
-rw-r--r--file/file_test.go7
-rw-r--r--key/key.go5
-rw-r--r--sign.go12
-rw-r--r--verify.go19
5 files changed, 62 insertions, 62 deletions
diff --git a/file/file.go b/file/file.go
index 156f5b0..d69a640 100644
--- a/file/file.go
+++ b/file/file.go
@@ -2,6 +2,7 @@
package file
import (
+ "bufio"
"bytes"
"encoding"
"encoding/base64"
@@ -34,38 +35,16 @@ type Block struct {
Message []byte // TODO replace with io.ReadCloser
}
-func Encode(w io.Writer, b *Block) error {
- fmt.Fprintln(w, untrusted, b.Comment)
- fmt.Fprintln(w, base64.StdEncoding.EncodeToString(b.Bytes))
- w.Write(b.Message)
- return nil
-}
-
-func EncodeToMemory(b *Block) []byte {
- buf := new(bytes.Buffer)
- Encode(buf, b)
- return buf.Bytes()
-}
-
-func EncodeFile(fname string, perm os.FileMode, b *Block) error {
- fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
- if err != nil {
- return err
- }
- defer fd.Close()
- return Encode(fd, b)
-}
-
-func Decode(data []byte) (*Block, error) {
- r := bytes.NewBuffer(data)
- comment, err := r.ReadString('\n')
+func decodeBlock(r io.Reader) (*Block, error) {
+ buf := bufio.NewReader(r)
+ comment, err := buf.ReadString('\n')
if err != nil {
return nil, err
}
if !strings.HasPrefix(comment, untrusted) {
return nil, ErrComment
}
- raw, err := r.ReadString('\n')
+ raw, err := buf.ReadString('\n')
if err != nil {
return nil, err
}
@@ -73,7 +52,7 @@ func Decode(data []byte) (*Block, error) {
if err != nil {
return nil, err
}
- message, err := ioutil.ReadAll(r)
+ message, err := ioutil.ReadAll(buf)
if err != nil {
return nil, err
}
@@ -84,39 +63,43 @@ func Decode(data []byte) (*Block, error) {
}, nil
}
-func DecodeFile(fname string) (*Block, error) {
- body, err := ioutil.ReadFile(fname)
- if err != nil {
- return nil, err
- }
- return Decode(body)
-}
-
-func ParseFile(fname string, u encoding.BinaryUnmarshaler) (string, io.Reader, error) {
- body, err := ioutil.ReadFile(fname)
+func DecodeFile(fname string, u encoding.BinaryUnmarshaler) (string, []byte, error) {
+ fd, err := os.Open(fname)
if err != nil {
return "", nil, err
}
- return Parse(body, u)
+ defer fd.Close()
+ return Decode(fd, u)
}
-// TODO rename
-func Parse(data []byte, u encoding.BinaryUnmarshaler) (string, io.Reader, error) {
- block, err := Decode(data)
+func Decode(r io.Reader, u encoding.BinaryUnmarshaler) (string, []byte, error) {
+ block, err := decodeBlock(r)
if err != nil {
return "", nil, err
}
if err := u.UnmarshalBinary(block.Bytes); err != nil {
return "", nil, err
}
- if len(block.Message) > 0 {
- return block.Comment, bytes.NewReader(block.Message), nil
+ return block.Comment, block.Message, nil
+}
+
+func encodeBlock(w io.Writer, b *Block) error {
+ fmt.Fprintln(w, untrusted, b.Comment)
+ fmt.Fprintln(w, base64.StdEncoding.EncodeToString(b.Bytes))
+ w.Write(b.Message)
+ return nil
+}
+
+func EncodeFile(fname string, perm os.FileMode, b *Block) error {
+ fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
}
- return block.Comment, nil, nil
+ defer fd.Close()
+ return encodeBlock(fd, b)
}
-// TODO rename
-func Store(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, error) {
+func Encode(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, error) {
raw, err := u.MarshalBinary()
if err != nil {
return nil, err
@@ -130,5 +113,9 @@ func Store(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, err
Bytes: raw,
Message: body,
}
- return EncodeToMemory(block), nil
+ buf := new(bytes.Buffer)
+ if err := encodeBlock(buf, block); err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
}
diff --git a/file/file_test.go b/file/file_test.go
index d34da2c..783b92c 100644
--- a/file/file_test.go
+++ b/file/file_test.go
@@ -10,7 +10,12 @@ func TestSig(t *testing.T) {
Comment: "comment",
Bytes: []byte{'t', 'e', 's', 't'},
}
- b2, err := Decode(EncodeToMemory(b))
+ buf := new(bytes.Buffer)
+ err := encodeBlock(buf, b)
+ if err != nil {
+ t.Error(err)
+ }
+ b2, err := decodeBlock(buf)
if err != nil {
t.Error(err)
}
diff --git a/key/key.go b/key/key.go
index 585dc7a..d9e8aef 100644
--- a/key/key.go
+++ b/key/key.go
@@ -11,8 +11,7 @@ import (
"golang.org/x/crypto/ed25519"
)
-// DefaultRounds of KDF
-const DefaultRounds = 42
+const kdfRounds = 42
var (
ErrInvalidPK = errors.New("unsupported format")
@@ -55,7 +54,7 @@ func Generate(der Deriver) (*Pub, *Sec, error) {
// Pbdkf
if der != nil {
- sec.KDFRounds = DefaultRounds
+ sec.KDFRounds = kdfRounds
}
if err := sec.Crypt(der); err != nil {
return nil, nil, err
diff --git a/sign.go b/sign.go
index ee4bace..ed2091d 100644
--- a/sign.go
+++ b/sign.go
@@ -61,9 +61,15 @@ func sign(args []string) error {
}
func openSec(fname string) (*key.Sec, error) {
- block, err := file.DecodeFile(fname)
- if err != nil {
+ sec := new(key.Sec)
+ if _, _, err := file.DecodeFile(fname, sec); err != nil {
+ return nil, err
+ }
+ if err := sec.Crypt(ask.Passphrase{}); err != nil {
+ return nil, err
+ }
+ if err := sec.Validate(); err != nil {
return nil, err
}
- return key.NewSec(block.Bytes, ask.Passphrase{})
+ return sec, nil
}
diff --git a/verify.go b/verify.go
index dd90c55..6984382 100644
--- a/verify.go
+++ b/verify.go
@@ -63,22 +63,25 @@ func verify(args []string) error {
}
func openPub(fname string) (*key.Pub, error) {
- block, err := file.DecodeFile(fname)
- if err != nil {
+ pub := new(key.Pub)
+ if _, _, err := file.DecodeFile(fname, pub); err != nil {
+ return nil, err
+ }
+ if err := pub.Validate(); err != nil {
return nil, err
}
- return key.NewPub(block.Bytes)
+ return pub, nil
}
func openSig(fname string) (*key.Sig, []byte, string, error) {
- block, err := file.DecodeFile(fname)
+ sig := new(key.Sig)
+ comment, msg, err := file.DecodeFile(fname, sig)
if err != nil {
return nil, nil, "", err
}
- sig, err := key.NewSig(block.Bytes)
- if err != nil {
+ if err := sig.Validate(); err != nil {
return nil, nil, "", err
}
- pubKey, _ := file.PubFile(block.Comment)
- return sig, block.Message, pubKey, nil
+ pubKey, _ := file.PubFile(comment)
+ return sig, msg, pubKey, nil
}