From 2e95c9cc2b28517d024a7556bae32dbd34f1c510 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 23 Oct 2016 16:56:08 +0200 Subject: Encapsulate Base64 encoder/decoder --- base64.go | 21 +++++++++++++++++++++ enc.go | 28 ++++++++++++---------------- pub.go | 24 +++--------------------- sig.go | 24 +++--------------------- 4 files changed, 39 insertions(+), 58 deletions(-) create mode 100644 base64.go diff --git a/base64.go b/base64.go new file mode 100644 index 0000000..56a7324 --- /dev/null +++ b/base64.go @@ -0,0 +1,21 @@ +package main + +import ( + "bytes" + "encoding/base64" + "encoding/binary" +) + +func DecodeBase64(v interface{}, b []byte) error { + buf := bytes.NewBuffer(b) + dec := base64.NewDecoder(base64.StdEncoding, buf) + return binary.Read(dec, binary.BigEndian, v) +} + +func EncodeBase64(v interface{}) ([]byte, error) { + buf := &bytes.Buffer{} + enc := base64.NewEncoder(base64.StdEncoding, buf) + err := binary.Write(enc, binary.BigEndian, v) + enc.Close() + return buf.Bytes(), err +} diff --git a/enc.go b/enc.go index 42b24d9..fac8298 100644 --- a/enc.go +++ b/enc.go @@ -3,8 +3,6 @@ package main import ( "bytes" "crypto/sha512" - "encoding/base64" - "encoding/binary" "errors" "golang.org/x/crypto/ed25519" @@ -22,21 +20,19 @@ type EncKey struct { var ErrChecksum = errors.New("checksum mismatch") -func (v *EncKey) Unmarshal(b []byte) error { - buf := bytes.NewBuffer(b) - dec := base64.NewDecoder(base64.StdEncoding, buf) - err := binary.Read(dec, binary.BigEndian, v) +func (v *EncKey) Valid() bool { sum := sha512.Sum512(v.SecKey[:]) - if !bytes.Equal(sum[:len(v.Checksum)], v.Checksum[:]) { - err = ErrChecksum - } - return err + return bytes.Equal(sum[:len(v.Checksum)], v.Checksum[:]) } -func (v *EncKey) Marshal() ([]byte, error) { - buf := new(bytes.Buffer) - enc := base64.NewEncoder(base64.StdEncoding, buf) - err := binary.Write(enc, binary.BigEndian, v) - enc.Close() - return buf.Bytes(), err +func (v *EncKey) Unmarshal(b []byte) error { + if err := DecodeBase64(v, b); err != nil { + return err + } + if !v.Valid() { + return ErrChecksum + } + return nil } + +func (v *EncKey) Marshal() ([]byte, error) { return EncodeBase64(v) } diff --git a/pub.go b/pub.go index 2745c6f..43b48f0 100644 --- a/pub.go +++ b/pub.go @@ -1,12 +1,6 @@ package main -import ( - "bytes" - "encoding/base64" - "encoding/binary" - - "golang.org/x/crypto/ed25519" -) +import "golang.org/x/crypto/ed25519" type PubKey struct { PKAlg [2]byte @@ -14,17 +8,5 @@ type PubKey struct { PubKey [ed25519.PublicKeySize]byte } -func (v *PubKey) Unmarshal(b []byte) error { - buf := bytes.NewBuffer(b) - dec := base64.NewDecoder(base64.StdEncoding, buf) - err := binary.Read(dec, binary.BigEndian, v) - return err -} - -func (v *PubKey) Marshal() ([]byte, error) { - buf := new(bytes.Buffer) - enc := base64.NewEncoder(base64.StdEncoding, buf) - err := binary.Write(enc, binary.BigEndian, v) - enc.Close() - return buf.Bytes(), err -} +func (v *PubKey) Unmarshal(b []byte) error { return DecodeBase64(v, b) } +func (v *PubKey) Marshal() ([]byte, error) { return EncodeBase64(v) } diff --git a/sig.go b/sig.go index 3ff334d..b81d03a 100644 --- a/sig.go +++ b/sig.go @@ -1,12 +1,6 @@ package main -import ( - "bytes" - "encoding/base64" - "encoding/binary" - - "golang.org/x/crypto/ed25519" -) +import "golang.org/x/crypto/ed25519" type Sig struct { PKAlg [2]byte @@ -14,17 +8,5 @@ type Sig struct { Sig [ed25519.SignatureSize]byte } -func (v *Sig) Unmarshal(b []byte) error { - buf := bytes.NewBuffer(b) - dec := base64.NewDecoder(base64.StdEncoding, buf) - err := binary.Read(dec, binary.BigEndian, v) - return err -} - -func (v *Sig) Marshal() ([]byte, error) { - buf := new(bytes.Buffer) - enc := base64.NewEncoder(base64.StdEncoding, buf) - err := binary.Write(enc, binary.BigEndian, v) - enc.Close() - return buf.Bytes(), err -} +func (v *Sig) Unmarshal(b []byte) error { return DecodeBase64(v, b) } +func (v *Sig) Marshal() ([]byte, error) { return EncodeBase64(v) } -- cgit v1.2.3