From 0a3859cef388867512ac0e275ac2cc347b3d7e5a Mon Sep 17 00:00:00 2001
From: Gabriel Handford
Date: Mon, 13 Jul 2020 18:46:58 -0700
Subject: [PATCH 1/2] edx25519: JSON marshal seed
---
docs/mem.go | 11 +++++++----
edx25519.go | 30 ++++++++++++++++++++++++++++--
edx25519_test.go | 30 +++++++++++++++++++++++++++++-
3 files changed, 64 insertions(+), 7 deletions(-)
diff --git a/docs/mem.go b/docs/mem.go
index cc47f80..dca7b4a 100644
--- a/docs/mem.go
+++ b/docs/mem.go
@@ -24,7 +24,7 @@ type Mem struct {
values map[string][]byte
metadata map[string]*metadata
nowFn func() time.Time
- inc int64
+ inc map[string]int64
}
type metadata struct {
@@ -38,6 +38,7 @@ func NewMem() *Mem {
paths: NewStringSet(),
values: map[string][]byte{},
metadata: map[string]*metadata{},
+ inc: map[string]int64{},
nowFn: time.Now,
}
}
@@ -293,11 +294,13 @@ func randBytes(length int) []byte {
func (m *Mem) EventsAdd(ctx context.Context, path string, data [][]byte) ([]*events.Event, error) {
out := make([]*events.Event, 0, len(data))
for _, b := range data {
- m.inc++
+ inc := m.inc[path]
+ inc++
+ m.inc[path] = inc
id := encoding.MustEncode(randBytes(32), encoding.Base62)
event := &events.Event{
Data: b,
- Index: m.inc,
+ Index: inc,
Timestamp: m.nowFn(),
}
b, err := json.Marshal(event)
@@ -313,7 +316,7 @@ func (m *Mem) EventsAdd(ctx context.Context, path string, data [][]byte) ([]*eve
return out, nil
}
-// EventsDelete removes events at path.
+// EventsDelete removes all events at path.
func (m *Mem) EventsDelete(ctx context.Context, path string) (bool, error) {
ok, err := m.Delete(ctx, path)
if err != nil {
diff --git a/edx25519.go b/edx25519.go
index 8371e2c..4804a4c 100644
--- a/edx25519.go
+++ b/edx25519.go
@@ -40,6 +40,9 @@ func NewEdX25519KeyFromPrivateKey(privateKey *[ed25519.PrivateKeySize]byte) *EdX
}
func (k *EdX25519Key) setPrivateKey(b []byte) error {
+ if len(b) != ed25519.PrivateKeySize {
+ return errors.Errorf("invalid private key length %d", len(b))
+ }
// Derive public key from private key
edpk := ed25519.PrivateKey(b)
publicKey := edpk.Public().(ed25519.PublicKey)
@@ -94,7 +97,7 @@ func (k *EdX25519Key) Signer() crypto.Signer {
// MarshalText for encoding.TextMarshaler interface.
func (k *EdX25519Key) MarshalText() ([]byte, error) {
- return []byte(encoding.MustEncode(k.Bytes(), encoding.Base64)), nil
+ return []byte(encoding.MustEncode(k.Seed()[:], encoding.Base64)), nil
}
// UnmarshalText for encoding.TextUnmarshaler interface.
@@ -103,12 +106,35 @@ func (k *EdX25519Key) UnmarshalText(s []byte) error {
if err != nil {
return err
}
- if err := k.setPrivateKey(b); err != nil {
+ var privateKey []byte
+ if len(b) == 32 {
+ privateKey = ed25519.NewKeyFromSeed(b)
+ } else {
+ privateKey = b
+ }
+ if err := k.setPrivateKey(privateKey); err != nil {
return err
}
return nil
}
+// // MarshalMsgpack for msgpack.
+// func (k *EdX25519Key) MarshalMsgpack() ([]byte, error) {
+// return k.Seed()[:], nil
+// }
+
+// // UnmarshalMsgpack for msgpack.
+// func (k *EdX25519Key) UnmarshalMsgpack(b []byte) error {
+// if len(b) != 32 {
+// return errors.Errorf("invalid edx25519 bytes for msgpack %d", len(b))
+// }
+// privateKey := ed25519.NewKeyFromSeed(b)
+// if err := k.setPrivateKey(privateKey); err != nil {
+// return err
+// }
+// return nil
+// }
+
// Equal returns true if equal to key.
func (k *EdX25519Key) Equal(o *EdX25519Key) bool {
return subtle.ConstantTimeCompare(k.Bytes(), o.Bytes()) == 1
diff --git a/edx25519_test.go b/edx25519_test.go
index 723eb58..d87f752 100644
--- a/edx25519_test.go
+++ b/edx25519_test.go
@@ -99,7 +99,9 @@ func TestSign(t *testing.T) {
}
func TestEdX25519JSON(t *testing.T) {
- key := keys.GenerateEdX25519Key()
+ seed := keys.Bytes32(bytes.Repeat([]byte{0x01}, 32))
+
+ key := keys.NewEdX25519KeyFromSeed(seed)
type test struct {
Key *keys.EdX25519Key `json:"key"`
@@ -107,10 +109,36 @@ func TestEdX25519JSON(t *testing.T) {
b, err := json.Marshal(test{Key: key})
require.NoError(t, err)
+ expected := `{"key":"AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE="}`
+ require.Equal(t, expected, string(b))
var out test
err = json.Unmarshal(b, &out)
require.NoError(t, err)
+ require.Equal(t, key.Bytes(), out.Key.Bytes())
+ // 64 byte private key
+ old := `{"key":"AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGKiOPddAnxlf1S2y08ul1yymcJvx2UEhvzdIgBtA9vXA=="}`
+ err = json.Unmarshal([]byte(old), &out)
+ require.NoError(t, err)
require.Equal(t, key.Bytes(), out.Key.Bytes())
}
+
+// func TestEdX25519Msgpack(t *testing.T) {
+// seed := keys.Bytes32(bytes.Repeat([]byte{0x01}, 32))
+// key := keys.NewEdX25519KeyFromSeed(seed)
+
+// type test struct {
+// Key *keys.EdX25519Key `msgpack:"key"`
+// }
+
+// b, err := msgpack.Marshal(test{Key: key})
+// require.NoError(t, err)
+// expected := "81a36b65790101010101010101010101010101010101010101010101010101010101010101"
+
+// require.Equal(t, expected, hex.EncodeToString(b))
+// var out test
+// err = msgpack.Unmarshal(b, &out)
+// require.NoError(t, err)
+// require.Equal(t, key.Bytes(), out.Key.Bytes())
+// }
From ba2dcfe8be137ab215b956f3039820a074685715 Mon Sep 17 00:00:00 2001
From: Gabriel Handford
Date: Mon, 13 Jul 2020 18:47:44 -0700
Subject: [PATCH 2/2] Removed unused
---
edx25519.go | 17 -----------------
edx25519_test.go | 19 -------------------
2 files changed, 36 deletions(-)
diff --git a/edx25519.go b/edx25519.go
index 4804a4c..c61dd47 100644
--- a/edx25519.go
+++ b/edx25519.go
@@ -118,23 +118,6 @@ func (k *EdX25519Key) UnmarshalText(s []byte) error {
return nil
}
-// // MarshalMsgpack for msgpack.
-// func (k *EdX25519Key) MarshalMsgpack() ([]byte, error) {
-// return k.Seed()[:], nil
-// }
-
-// // UnmarshalMsgpack for msgpack.
-// func (k *EdX25519Key) UnmarshalMsgpack(b []byte) error {
-// if len(b) != 32 {
-// return errors.Errorf("invalid edx25519 bytes for msgpack %d", len(b))
-// }
-// privateKey := ed25519.NewKeyFromSeed(b)
-// if err := k.setPrivateKey(privateKey); err != nil {
-// return err
-// }
-// return nil
-// }
-
// Equal returns true if equal to key.
func (k *EdX25519Key) Equal(o *EdX25519Key) bool {
return subtle.ConstantTimeCompare(k.Bytes(), o.Bytes()) == 1
diff --git a/edx25519_test.go b/edx25519_test.go
index d87f752..f1f1fc1 100644
--- a/edx25519_test.go
+++ b/edx25519_test.go
@@ -123,22 +123,3 @@ func TestEdX25519JSON(t *testing.T) {
require.NoError(t, err)
require.Equal(t, key.Bytes(), out.Key.Bytes())
}
-
-// func TestEdX25519Msgpack(t *testing.T) {
-// seed := keys.Bytes32(bytes.Repeat([]byte{0x01}, 32))
-// key := keys.NewEdX25519KeyFromSeed(seed)
-
-// type test struct {
-// Key *keys.EdX25519Key `msgpack:"key"`
-// }
-
-// b, err := msgpack.Marshal(test{Key: key})
-// require.NoError(t, err)
-// expected := "81a36b65790101010101010101010101010101010101010101010101010101010101010101"
-
-// require.Equal(t, expected, hex.EncodeToString(b))
-// var out test
-// err = msgpack.Unmarshal(b, &out)
-// require.NoError(t, err)
-// require.Equal(t, key.Bytes(), out.Key.Bytes())
-// }