mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-12 21:01:21 +00:00
* switch from fork (tendermint/btcd) to orig package (btcsuite/btcd); also
- remove obsolete check in test `size != -1` is always true
- WIP as the serialization still needs to be wrapped
* WIP: wrap signature & privkey, pubkey needs to be wrapped as well
* wrap pubkey too
* use "github.com/ethereum/go-ethereum/crypto/secp256k1" if cgo is
available, else use "github.com/btcsuite/btcd/btcec" and take care of
lower-S when verifying
Annoyingly, had to disable pruning when importing
github.com/ethereum/go-ethereum/ :-/
* update comment
* update comment
* emulate signature_nocgo.go for additional benchmarks:
592bf6a59c/crypto/signature_nocgo.go (L60-L76)
* use our format (r || s) in lower-s form when in the non-cgo case
* remove comment about using the C library directly
* vendor github.com/btcsuite/btcd too
* Add test for the !cgo case
* update changelog pending
Closes #3162 #3163
Refs #1958, #2091, tendermint/btcd#1
40 lines
996 B
Go
40 lines
996 B
Go
// +build !cgo
|
|
|
|
package secp256k1
|
|
|
|
import (
|
|
"testing"
|
|
|
|
secp256k1 "github.com/btcsuite/btcd/btcec"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Ensure that signature verification works, and that
|
|
// non-canonical signatures fail.
|
|
// Note: run with CGO_ENABLED=0 or go test -tags !cgo.
|
|
func TestSignatureVerificationAndRejectUpperS(t *testing.T) {
|
|
msg := []byte("We have lingered long enough on the shores of the cosmic ocean.")
|
|
for i := 0; i < 500; i++ {
|
|
priv := GenPrivKey()
|
|
sigStr, err := priv.Sign(msg)
|
|
require.NoError(t, err)
|
|
sig := signatureFromBytes(sigStr)
|
|
require.False(t, sig.S.Cmp(secp256k1halfN) > 0)
|
|
|
|
pub := priv.PubKey()
|
|
require.True(t, pub.VerifyBytes(msg, sigStr))
|
|
|
|
// malleate:
|
|
sig.S.Sub(secp256k1.S256().CurveParams.N, sig.S)
|
|
require.True(t, sig.S.Cmp(secp256k1halfN) > 0)
|
|
malSigStr := serializeSig(sig)
|
|
|
|
require.False(t, pub.VerifyBytes(msg, malSigStr),
|
|
"VerifyBytes incorrect with malleated & invalid S. sig=%v, key=%v",
|
|
sig,
|
|
priv,
|
|
)
|
|
}
|
|
}
|