crypto/keys: enforce length in PublicKey.DecodeBytes()
Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
5aff82aef4
commit
bb137abb03
2 changed files with 14 additions and 2 deletions
|
@ -8,6 +8,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
gio "io"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec"
|
"github.com/btcsuite/btcd/btcec"
|
||||||
|
@ -234,7 +235,15 @@ func decodeCompressedY(x *big.Int, ylsb uint, curve elliptic.Curve) (*big.Int, e
|
||||||
func (p *PublicKey) DecodeBytes(data []byte) error {
|
func (p *PublicKey) DecodeBytes(data []byte) error {
|
||||||
b := io.NewBinReaderFromBuf(data)
|
b := io.NewBinReaderFromBuf(data)
|
||||||
p.DecodeBinary(b)
|
p.DecodeBinary(b)
|
||||||
|
if b.Err != nil {
|
||||||
return b.Err
|
return b.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
b.ReadB()
|
||||||
|
if b.Err != gio.EOF {
|
||||||
|
return errors.New("extra data")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecodeBinary decodes a PublicKey from the given BinReader using information
|
// DecodeBinary decodes a PublicKey from the given BinReader using information
|
||||||
|
@ -375,7 +384,7 @@ func (p *PublicKey) UnmarshalJSON(data []byte) error {
|
||||||
return errors.New("wrong format")
|
return errors.New("wrong format")
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes := make([]byte, l-2)
|
bytes := make([]byte, hex.DecodedLen(l-2))
|
||||||
_, err := hex.Decode(bytes, data[1:l-1])
|
_, err := hex.Decode(bytes, data[1:l-1])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -67,6 +67,9 @@ func TestNewPublicKeyFromBytes(t *testing.T) {
|
||||||
pub2, err := NewPublicKeyFromBytes(b, elliptic.P256())
|
pub2, err := NewPublicKeyFromBytes(b, elliptic.P256())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Same(t, pub, pub2)
|
require.Same(t, pub, pub2)
|
||||||
|
|
||||||
|
_, err = NewPublicKeyFromBytes([]byte{0x00, 0x01}, elliptic.P256())
|
||||||
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDecodeFromString(t *testing.T) {
|
func TestDecodeFromString(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue