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()) -// }