From ec07bb075ec2dc6698acf0a3029def4c531221d1 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Wed, 14 Jun 2023 14:15:06 +0200 Subject: [PATCH] added keypair sample and ValidateSignature to msg server Signed-off-by: Lorenz Herzberger --- testutil/keeper/asset.go | 5 ++-- testutil/sample/sample.go | 20 +++++++++------- x/asset/keeper/msg_server_notarize_asset.go | 26 ++++++++++++++++++++- x/asset/keeper/msg_server_test.go | 15 ++++++++++-- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/testutil/keeper/asset.go b/testutil/keeper/asset.go index 9c65177..681903b 100644 --- a/testutil/keeper/asset.go +++ b/testutil/keeper/asset.go @@ -47,8 +47,9 @@ func AssetKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) { ctrl := gomock.NewController(t) mk := assettestutils.NewMockMachineKeeper(ctrl) - mk.EXPECT().GetMachine(ctx, "pubkey").Return(sample.Machine(), true).AnyTimes() - mk.EXPECT().GetMachine(ctx, "privkey").Return(sample.Machine(), false).AnyTimes() + sk, pk := sample.KeyPair() + mk.EXPECT().GetMachine(ctx, pk).Return(sample.Machine(pk, pk), true).AnyTimes() + mk.EXPECT().GetMachine(ctx, sk).Return(sample.Machine(pk, pk), false).AnyTimes() k := keeper.NewKeeper( cdc, diff --git a/testutil/sample/sample.go b/testutil/sample/sample.go index 1473389..016a29e 100644 --- a/testutil/sample/sample.go +++ b/testutil/sample/sample.go @@ -7,12 +7,14 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// // KeyPair returns a sample private / public keypair -// func KeyPair() (ed25519.PrivKey, cryptotypes.PubKey) { -// sk := ed25519.GenPrivKey() -// pk := sk.PubKey() -// return sk.Key, pk -// } +// KeyPair returns a sample private / public keypair +func KeyPair() (string, string) { + secret := "Hello World!" + sk := ed25519.GenPrivKeyFromSecret([]byte(secret)) + pk := sk.PubKey() + + return sk.String(), pk.String() +} // AccAddress returns a sample account address func AccAddress() string { @@ -21,14 +23,14 @@ func AccAddress() string { return sdk.AccAddress(addr).String() } -func Machine() machinetypes.Machine { +func Machine(pkPM string, pkL string) machinetypes.Machine { m := machinetypes.Machine{ Name: "machine", Ticker: "PM", Issued: 1, Precision: 8, - IssuerPlanetmint: "pubkey", - IssuerLiquid: "pubkey", + IssuerPlanetmint: pkPM, + IssuerLiquid: pkL, Cid: "Cid", } return m diff --git a/x/asset/keeper/msg_server_notarize_asset.go b/x/asset/keeper/msg_server_notarize_asset.go index f4e61be..4ae2282 100644 --- a/x/asset/keeper/msg_server_notarize_asset.go +++ b/x/asset/keeper/msg_server_notarize_asset.go @@ -2,10 +2,13 @@ package keeper import ( "context" + "crypto/sha256" + "encoding/hex" "errors" "planetmint-go/x/asset/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -18,7 +21,10 @@ func (k msgServer) NotarizeAsset(goCtx context.Context, msg *types.MsgNotarizeAs return &types.MsgNotarizeAssetResponse{}, errors.New("machine not found") } - // TODO: validate signature + valid := ValidateSignature(msg.CidHash, msg.Sign, msg.Creator) + if !valid { + return &types.MsgNotarizeAssetResponse{}, errors.New("invalid signature") + } var asset = types.Asset{ Hash: msg.CidHash, @@ -30,3 +36,21 @@ func (k msgServer) NotarizeAsset(goCtx context.Context, msg *types.MsgNotarizeAs return &types.MsgNotarizeAssetResponse{}, nil } + +func ValidateSignature(message string, signature string, publicKey string) bool { + // Convert the message, signature, and public key from hex to bytes + messageBytes, _ := hex.DecodeString(message) + signatureBytes, _ := hex.DecodeString(signature) + publicKeyBytes, _ := hex.DecodeString(publicKey) + + // Hash the message + hash := sha256.Sum256(messageBytes) + + // Create a secp256k1 public key object + pubKey := &secp256k1.PubKey{Key: publicKeyBytes} + + // Verify the signature + isValid := pubKey.VerifySignature(hash[:], signatureBytes) + + return isValid +} diff --git a/x/asset/keeper/msg_server_test.go b/x/asset/keeper/msg_server_test.go index 27da179..081214a 100644 --- a/x/asset/keeper/msg_server_test.go +++ b/x/asset/keeper/msg_server_test.go @@ -5,6 +5,7 @@ import ( "testing" keepertest "planetmint-go/testutil/keeper" + "planetmint-go/testutil/sample" "planetmint-go/x/asset/keeper" "planetmint-go/x/asset/types" @@ -18,7 +19,8 @@ func setupMsgServer(t testing.TB) (types.MsgServer, context.Context) { } func TestMsgServerNotarizeAsset(t *testing.T) { - msg := types.NewMsgNotarizeAsset("pubkey", "cid", "sign", "pubkey") + _, pk := sample.KeyPair() + msg := types.NewMsgNotarizeAsset(pk, "cid", "sign", "pubkey") msgServer, ctx := setupMsgServer(t) res, err := msgServer.NotarizeAsset(ctx, msg) if assert.NoError(t, err) { @@ -27,8 +29,17 @@ func TestMsgServerNotarizeAsset(t *testing.T) { } func TestMsgServerNotarizeAssetMachineNotFound(t *testing.T) { - msg := types.NewMsgNotarizeAsset("privkey", "cid", "sign", "pubkey") + sk, _ := sample.KeyPair() + msg := types.NewMsgNotarizeAsset(sk, "cid", "sign", "pubkey") msgServer, ctx := setupMsgServer(t) _, err := msgServer.NotarizeAsset(ctx, msg) assert.EqualError(t, err, "machine not found") } + +func TestMsgServerNotarizeAssetInvalidAsset(t *testing.T) { + _, pk := sample.KeyPair() + msg := types.NewMsgNotarizeAsset(pk, "cid", "sign", "pubkey") + msgServer, ctx := setupMsgServer(t) + _, err := msgServer.NotarizeAsset(ctx, msg) + assert.EqualError(t, err, "invalid signature") +}