cosmos-sdk/crypto/keys/secp256r1/pubkey_internal_test.go

119 lines
2.8 KiB
Go
Raw Normal View History

crypto: add secp256r1 (#8559) * Optimize secp256k1 hashing * Add ADR-028 related functions * Update ed25519 * fix errors/handle * fix build * fix build * Add tests and update function names * wip * Use LengthPrefix for composed addresses * add tests for NewComposed * add module hash function * fix append * rollback ed25519 ADR-28 update * rollback ed25519 ADR-28 test * Adding Module tests and convert tests to test suite * convert store_key_test.go to test suite * rollback test check comment * any.pb.go update * generated proto files * wip * renames * wip2 * add String method to PBBytes * wip3 * add pubkey tests * adding cryptotypes.PrivKey methods * re-enable test * fix equals test * fix ecdsa object receiver * add ProtoMarshaler implementation and tests * move code to init and add interface registry * add bytes tests * merge Unmarshal with UnmarshalAmino * implement ProtoMarshaler to ecdsaSK * remove bytes.go * add private key marshaling tests * break tests into 2 suites * add signature tests * remove TODO * remove bytes.proto * adding changelog * Update CHANGELOG.md * Update crypto/keys/ecdsa/ecdsa_privkey.go * Update crypto/keys/ecdsa/ecdsa_pubkey.go * comments: add dot (.) at the end * update comments * update commented code * rename files * remove Amino methods * use 2 spaces in protocgen.sh * rollback changes in protocgen.sh * add MessageName * rework ecdsa proto structure * move ecdsa to internal package * add secp256r1 proto * refactore proto definition for secp256r1 * fix err check * update comments * create const for fieldSize+1 * simplify the PubKey.String test * Apply suggestions from code review Co-authored-by: Jonathan Gimeno <jgimeno@gmail.com> * Update doc comments: SDK Interface -> sdk.Interface * rename init.go to doc.go * Add PubKey.Type() test * Revert "Update doc comments: SDK Interface -> sdk.Interface" This reverts commit 01f2b4f5efcd79a452483bcda152db54a8fbfee2. * Use cryptotypes.Address instead of tmcrypto * Revert "Use cryptotypes.Address instead of tmcrypto" This reverts commit 15b866ae67bdb7ca4872f4089fcab19f9e2e3608. This issue will be solved in https://github.com/cosmos/cosmos-sdk/issues/8775 * add link to ANSI X9.62 * move init.go -> doc.go * use proto.MessageName() Co-authored-by: Alessio Treglia <alessio@tendermint.com> Co-authored-by: Jonathan Gimeno <jgimeno@gmail.com>
2021-03-04 04:29:48 -08:00
package secp256r1
import (
"testing"
proto "github.com/gogo/protobuf/proto"
"github.com/stretchr/testify/suite"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
)
var _ cryptotypes.PubKey = (*PubKey)(nil)
func TestPKSuite(t *testing.T) {
suite.Run(t, new(PKSuite))
}
type CommonSuite struct {
suite.Suite
pk *PubKey // cryptotypes.PubKey
sk cryptotypes.PrivKey
}
func (suite *CommonSuite) SetupSuite() {
sk, err := GenPrivKey()
suite.Require().NoError(err)
suite.sk = sk
suite.pk = sk.PubKey().(*PubKey)
}
type PKSuite struct{ CommonSuite }
func (suite *PKSuite) TestString() {
require := suite.Require()
pkStr := suite.pk.String()
prefix := "secp256r1{"
require.Equal(prefix, pkStr[:len(prefix)])
}
func (suite *PKSuite) TestType() {
suite.Require().Equal(name, suite.pk.Type())
}
func (suite *PKSuite) TestEquals() {
require := suite.Require()
skOther, err := GenPrivKey()
require.NoError(err)
pkOther := skOther.PubKey()
pkOther2 := &PubKey{&ecdsaPK{skOther.Secret.PubKey()}}
require.False(suite.pk.Equals(pkOther))
require.True(pkOther.Equals(pkOther2))
require.True(pkOther2.Equals(pkOther))
require.True(pkOther.Equals(pkOther), "Equals must be reflexive")
}
func (suite *PKSuite) TestMarshalProto() {
require := suite.Require()
/**** test structure marshalling ****/
var pk PubKey
bz, err := proto.Marshal(suite.pk)
require.NoError(err)
require.NoError(proto.Unmarshal(bz, &pk))
require.True(pk.Equals(suite.pk))
/**** test structure marshalling with codec ****/
pk = PubKey{}
registry := types.NewInterfaceRegistry()
cdc := codec.NewProtoCodec(registry)
bz, err = cdc.MarshalBinaryBare(suite.pk)
require.NoError(err)
require.NoError(cdc.UnmarshalBinaryBare(bz, &pk))
require.True(pk.Equals(suite.pk))
const bufSize = 100
bz2 := make([]byte, bufSize)
pkCpy := suite.pk
_, err = pkCpy.MarshalTo(bz2)
require.NoError(err)
require.Len(bz2, bufSize)
require.Equal(bz, bz2[:pk.Size()])
bz2 = make([]byte, bufSize)
_, err = pkCpy.MarshalToSizedBuffer(bz2)
require.NoError(err)
require.Len(bz2, bufSize)
require.Equal(bz, bz2[(bufSize-pk.Size()):])
/**** test interface marshalling ****/
bz, err = cdc.MarshalInterface(suite.pk)
require.NoError(err)
var pkI cryptotypes.PubKey
err = cdc.UnmarshalInterface(bz, &pkI)
require.EqualError(err, "no registered implementations of type types.PubKey")
RegisterInterfaces(registry)
require.NoError(cdc.UnmarshalInterface(bz, &pkI))
require.True(pkI.Equals(suite.pk))
cdc.UnmarshalInterface(bz, nil)
require.Error(err, "nil should fail")
}
func (suite *PKSuite) TestSize() {
require := suite.Require()
var pk ecdsaPK
require.Equal(pk.Size(), len(suite.pk.Bytes()))
var nilPk *ecdsaPK
require.Equal(0, nilPk.Size(), "nil value must have zero size")
}