aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-10-23 16:56:08 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-10-23 16:56:08 +0200
commit2e95c9cc2b28517d024a7556bae32dbd34f1c510 (patch)
tree5601179381bc19252f8d35416b8fdb2e986dcb4a
parent17ff78ec85558342223cc9d03099bd87cbf28537 (diff)
Encapsulate Base64 encoder/decoder
-rw-r--r--base64.go21
-rw-r--r--enc.go28
-rw-r--r--pub.go24
-rw-r--r--sig.go24
4 files changed, 39 insertions, 58 deletions
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) }