mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-04 01:36:24 +01:00
lntemp+rpc: refactor testSignVerifyMessage
This commit is contained in:
parent
20e454b229
commit
08dfebbd6c
4 changed files with 58 additions and 62 deletions
|
@ -147,3 +147,33 @@ func (h *HarnessRPC) MuSig2Cleanup(
|
||||||
|
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SignMessageSigner makes a RPC call to the node's SignerClient and asserts.
|
||||||
|
//
|
||||||
|
// NOTE: there's already `SignMessage` in `h.LN`.
|
||||||
|
func (h *HarnessRPC) SignMessageSigner(
|
||||||
|
req *signrpc.SignMessageReq) *signrpc.SignMessageResp {
|
||||||
|
|
||||||
|
ctxt, cancel := context.WithTimeout(h.runCtx, DefaultTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
resp, err := h.Signer.SignMessage(ctxt, req)
|
||||||
|
h.NoError(err, "SignMessage")
|
||||||
|
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyMessageSigner makes a RPC call to the node's SignerClient and asserts.
|
||||||
|
//
|
||||||
|
// NOTE: there's already `VerifyMessageSigner` in `h.LN`.
|
||||||
|
func (h *HarnessRPC) VerifyMessageSigner(
|
||||||
|
req *signrpc.VerifyMessageReq) *signrpc.VerifyMessageResp {
|
||||||
|
|
||||||
|
ctxt, cancel := context.WithTimeout(h.runCtx, DefaultTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
resp, err := h.Signer.VerifyMessage(ctxt, req)
|
||||||
|
h.NoError(err, "VerifyMessage")
|
||||||
|
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
|
@ -449,4 +449,8 @@ var allTestCasesTemp = []*lntemp.TestCase{
|
||||||
Name: "sign output raw",
|
Name: "sign output raw",
|
||||||
TestFunc: testSignOutputRaw,
|
TestFunc: testSignOutputRaw,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "sign verify message",
|
||||||
|
TestFunc: testSignVerifyMessage,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@ package itest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/btcsuite/btcd/btcec/v2"
|
"github.com/btcsuite/btcd/btcec/v2"
|
||||||
"github.com/btcsuite/btcd/btcec/v2/schnorr"
|
"github.com/btcsuite/btcd/btcec/v2/schnorr"
|
||||||
|
@ -17,7 +15,6 @@ import (
|
||||||
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
|
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
|
||||||
"github.com/lightningnetwork/lnd/lntemp"
|
"github.com/lightningnetwork/lnd/lntemp"
|
||||||
"github.com/lightningnetwork/lnd/lntemp/node"
|
"github.com/lightningnetwork/lnd/lntemp/node"
|
||||||
"github.com/lightningnetwork/lnd/lntest"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -362,42 +359,17 @@ func assertSignOutputRaw(ht *lntemp.HarnessTest,
|
||||||
ht.MineBlocksAndAssertNumTxes(1, 1)
|
ht.MineBlocksAndAssertNumTxes(1, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// deriveCustomizedKey uses the family and index to derive a public key from
|
|
||||||
// the node's walletkit client.
|
|
||||||
func deriveCustomizedKey(ctx context.Context, node *lntest.HarnessNode,
|
|
||||||
keyLoc *signrpc.KeyLocator) (*btcec.PublicKey, error) {
|
|
||||||
|
|
||||||
ctxt, cancel := context.WithTimeout(ctx, defaultTimeout)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
resp, err := node.WalletKitClient.DeriveKey(ctxt, keyLoc)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to derive key: %v", err)
|
|
||||||
}
|
|
||||||
pub, err := btcec.ParsePubKey(resp.RawKeyBytes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to parse node pubkey: %v", err)
|
|
||||||
}
|
|
||||||
return pub, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// testSignVerifyMessage makes sure that the SignMessage RPC can be used with
|
// testSignVerifyMessage makes sure that the SignMessage RPC can be used with
|
||||||
// all custom flags by verifying with VerifyMessage. Tests both ECDSA and
|
// all custom flags by verifying with VerifyMessage. Tests both ECDSA and
|
||||||
// Schnorr signatures.
|
// Schnorr signatures.
|
||||||
func testSignVerifyMessage(net *lntest.NetworkHarness, t *harnessTest) {
|
func testSignVerifyMessage(ht *lntemp.HarnessTest) {
|
||||||
runSignVerifyMessage(t, net, net.Alice)
|
runSignVerifyMessage(ht, ht.Alice)
|
||||||
}
|
}
|
||||||
|
|
||||||
// runSignVerifyMessage makes sure that the SignMessage RPC can be used with all
|
// runSignVerifyMessage makes sure that the SignMessage RPC can be used with
|
||||||
// custom flags by verifying with VerifyMessage. Tests both ECDSA and Schnorr
|
// all custom flags by verifying with VerifyMessage. Tests both ECDSA and
|
||||||
// signatures.
|
// Schnorr signatures.
|
||||||
func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
func runSignVerifyMessage(ht *lntemp.HarnessTest, alice *node.HarnessNode) {
|
||||||
alice *lntest.HarnessNode) {
|
|
||||||
|
|
||||||
ctxb := context.Background()
|
|
||||||
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
|
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
aliceMsg := []byte("alice msg")
|
aliceMsg := []byte("alice msg")
|
||||||
keyLoc := &signrpc.KeyLocator{
|
keyLoc := &signrpc.KeyLocator{
|
||||||
KeyFamily: int32(keychain.KeyFamilyNodeKey),
|
KeyFamily: int32(keychain.KeyFamilyNodeKey),
|
||||||
|
@ -411,11 +383,16 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
SchnorrSig: false,
|
SchnorrSig: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
signMsgResp, err := alice.SignerClient.SignMessage(ctxt, signMsgReq)
|
signMsgResp := alice.RPC.SignMessageSigner(signMsgReq)
|
||||||
require.NoError(t.t, err, "failed to sign message")
|
|
||||||
|
|
||||||
customPubKey, err := deriveCustomizedKey(ctxt, alice, keyLoc)
|
deriveCustomizedKey := func() *btcec.PublicKey {
|
||||||
require.NoError(t.t, err, "failed to create customized pubkey")
|
resp := alice.RPC.DeriveKey(keyLoc)
|
||||||
|
pub, err := btcec.ParsePubKey(resp.RawKeyBytes)
|
||||||
|
require.NoError(ht, err, "failed to parse node pubkey")
|
||||||
|
return pub
|
||||||
|
}
|
||||||
|
|
||||||
|
customPubKey := deriveCustomizedKey()
|
||||||
|
|
||||||
verifyReq := &signrpc.VerifyMessageReq{
|
verifyReq := &signrpc.VerifyMessageReq{
|
||||||
Msg: aliceMsg,
|
Msg: aliceMsg,
|
||||||
|
@ -423,10 +400,8 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
Pubkey: customPubKey.SerializeCompressed(),
|
Pubkey: customPubKey.SerializeCompressed(),
|
||||||
IsSchnorrSig: false,
|
IsSchnorrSig: false,
|
||||||
}
|
}
|
||||||
verifyResp, err := alice.SignerClient.VerifyMessage(ctxt, verifyReq)
|
verifyResp := alice.RPC.VerifyMessageSigner(verifyReq)
|
||||||
require.NoError(t.t, err)
|
require.True(ht, verifyResp.Valid, "failed to verify message")
|
||||||
|
|
||||||
require.True(t.t, verifyResp.Valid, "failed to verify message")
|
|
||||||
|
|
||||||
// Use a different key locator.
|
// Use a different key locator.
|
||||||
keyLoc = &signrpc.KeyLocator{
|
keyLoc = &signrpc.KeyLocator{
|
||||||
|
@ -440,12 +415,8 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
KeyLoc: keyLoc,
|
KeyLoc: keyLoc,
|
||||||
SchnorrSig: true,
|
SchnorrSig: true,
|
||||||
}
|
}
|
||||||
|
signMsgResp = alice.RPC.SignMessageSigner(signMsgReq)
|
||||||
signMsgResp, err = alice.SignerClient.SignMessage(ctxt, signMsgReq)
|
customPubKey = deriveCustomizedKey()
|
||||||
require.NoError(t.t, err)
|
|
||||||
|
|
||||||
customPubKey, err = deriveCustomizedKey(ctxt, alice, keyLoc)
|
|
||||||
require.NoError(t.t, err, "failed to create customized pubkey")
|
|
||||||
|
|
||||||
// Verify the Schnorr signature.
|
// Verify the Schnorr signature.
|
||||||
verifyReq = &signrpc.VerifyMessageReq{
|
verifyReq = &signrpc.VerifyMessageReq{
|
||||||
|
@ -454,10 +425,8 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
Pubkey: schnorr.SerializePubKey(customPubKey),
|
Pubkey: schnorr.SerializePubKey(customPubKey),
|
||||||
IsSchnorrSig: true,
|
IsSchnorrSig: true,
|
||||||
}
|
}
|
||||||
verifyResp, err = alice.SignerClient.VerifyMessage(ctxt, verifyReq)
|
verifyResp = alice.RPC.VerifyMessageSigner(verifyReq)
|
||||||
require.NoError(t.t, err)
|
require.True(ht, verifyResp.Valid, "failed to verify message")
|
||||||
|
|
||||||
require.True(t.t, verifyResp.Valid, "failed to verify message")
|
|
||||||
|
|
||||||
// Also test that we can tweak a private key and verify the message
|
// Also test that we can tweak a private key and verify the message
|
||||||
// against the tweaked public key.
|
// against the tweaked public key.
|
||||||
|
@ -467,8 +436,7 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
)
|
)
|
||||||
|
|
||||||
signMsgReq.SchnorrSigTapTweak = tweakBytes[:]
|
signMsgReq.SchnorrSigTapTweak = tweakBytes[:]
|
||||||
signMsgResp, err = alice.SignerClient.SignMessage(ctxt, signMsgReq)
|
signMsgResp = alice.RPC.SignMessageSigner(signMsgReq)
|
||||||
require.NoError(t.t, err)
|
|
||||||
|
|
||||||
verifyReq = &signrpc.VerifyMessageReq{
|
verifyReq = &signrpc.VerifyMessageReq{
|
||||||
Msg: aliceMsg,
|
Msg: aliceMsg,
|
||||||
|
@ -476,8 +444,6 @@ func runSignVerifyMessage(t *harnessTest, net *lntest.NetworkHarness,
|
||||||
Pubkey: schnorr.SerializePubKey(tweakedPubKey),
|
Pubkey: schnorr.SerializePubKey(tweakedPubKey),
|
||||||
IsSchnorrSig: true,
|
IsSchnorrSig: true,
|
||||||
}
|
}
|
||||||
verifyResp, err = alice.SignerClient.VerifyMessage(ctxt, verifyReq)
|
verifyResp = alice.RPC.VerifyMessageSigner(verifyReq)
|
||||||
require.NoError(t.t, err)
|
require.True(ht, verifyResp.Valid, "failed to verify message")
|
||||||
|
|
||||||
require.True(t.t, verifyResp.Valid, "failed to verify message")
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,6 @@
|
||||||
package itest
|
package itest
|
||||||
|
|
||||||
var allTestCases = []*testCase{
|
var allTestCases = []*testCase{
|
||||||
{
|
|
||||||
name: "sign verify message",
|
|
||||||
test: testSignVerifyMessage,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
name: "async payments benchmark",
|
name: "async payments benchmark",
|
||||||
test: testAsyncPayments,
|
test: testAsyncPayments,
|
||||||
|
|
Loading…
Add table
Reference in a new issue