forked from TrueCloudLab/neoneo-go
rpc/crypto: fix validator field marshalling in getvalidators RPC server
Problem: wrong `PublicKey` field json marshalling of result.Validator Solution: add marshaller to publickey (crypto)
This commit is contained in:
parent
ca12c75b12
commit
8e05bfe99c
2 changed files with 69 additions and 0 deletions
|
@ -6,6 +6,7 @@ import (
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
|
@ -274,3 +275,28 @@ func (p *PublicKey) String() string {
|
||||||
by := hex.EncodeToString(p.Y.Bytes())
|
by := hex.EncodeToString(p.Y.Bytes())
|
||||||
return fmt.Sprintf("%s%s", bx, by)
|
return fmt.Sprintf("%s%s", bx, by)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaler interface.
|
||||||
|
func (p PublicKey) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(hex.EncodeToString(p.Bytes()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements json.Unmarshaler interface.
|
||||||
|
func (p *PublicKey) UnmarshalJSON(data []byte) error {
|
||||||
|
l := len(data)
|
||||||
|
if l < 2 || data[0] != '"' || data[l-1] != '"' {
|
||||||
|
return errors.New("wrong format")
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes := make([]byte, l-2)
|
||||||
|
_, err := hex.Decode(bytes, data[1:l-1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = p.DecodeBytes(bytes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package keys
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -143,3 +144,45 @@ func getPubKey(t *testing.T) *PublicKey {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return pubKey
|
return pubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMarshallJSON(t *testing.T) {
|
||||||
|
str := "03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"
|
||||||
|
pubKey, err := NewPublicKeyFromString(str)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
bytes, err := json.Marshal(&pubKey)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, []byte(`"`+str+`"`), bytes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshallJSON(t *testing.T) {
|
||||||
|
str := "03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c"
|
||||||
|
expected, err := NewPublicKeyFromString(str)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
actual := &PublicKey{}
|
||||||
|
err = json.Unmarshal([]byte(`"`+str+`"`), actual)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expected, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshallJSONBadCompresed(t *testing.T) {
|
||||||
|
str := `"02ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"`
|
||||||
|
actual := &PublicKey{}
|
||||||
|
err := json.Unmarshal([]byte(str), actual)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshallJSONNotAHex(t *testing.T) {
|
||||||
|
str := `"04Tb17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"`
|
||||||
|
actual := &PublicKey{}
|
||||||
|
err := json.Unmarshal([]byte(str), actual)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnmarshallJSONBadFormat(t *testing.T) {
|
||||||
|
str := "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
|
||||||
|
actual := &PublicKey{}
|
||||||
|
err := json.Unmarshal([]byte(str), actual)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue