2018-07-18 08:38:44 -07:00
|
|
|
package secp256k1_test
|
2018-06-20 15:30:44 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/btcsuite/btcutil/base58"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
2018-07-18 08:38:44 -07:00
|
|
|
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
|
|
"github.com/tendermint/tendermint/crypto/secp256k1"
|
2018-06-20 15:30:44 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
type keyData struct {
|
|
|
|
priv string
|
|
|
|
pub string
|
|
|
|
addr string
|
|
|
|
}
|
|
|
|
|
|
|
|
var secpDataTable = []keyData{
|
|
|
|
{
|
|
|
|
priv: "a96e62ed3955e65be32703f12d87b6b5cf26039ecfa948dc5107a495418e5330",
|
|
|
|
pub: "02950e1cdfcb133d6024109fd489f734eeb4502418e538c28481f22bce276f248c",
|
|
|
|
addr: "1CKZ9Nx4zgds8tU7nJHotKSDr4a9bYJCa3",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPubKeySecp256k1Address(t *testing.T) {
|
|
|
|
for _, d := range secpDataTable {
|
|
|
|
privB, _ := hex.DecodeString(d.priv)
|
|
|
|
pubB, _ := hex.DecodeString(d.pub)
|
|
|
|
addrBbz, _, _ := base58.CheckDecode(d.addr)
|
2018-07-18 08:38:44 -07:00
|
|
|
addrB := crypto.Address(addrBbz)
|
2018-06-20 15:30:44 -07:00
|
|
|
|
2018-07-18 08:38:44 -07:00
|
|
|
var priv secp256k1.PrivKeySecp256k1
|
2018-06-20 15:30:44 -07:00
|
|
|
copy(priv[:], privB)
|
|
|
|
|
|
|
|
pubKey := priv.PubKey()
|
2018-07-18 08:38:44 -07:00
|
|
|
pubT, _ := pubKey.(secp256k1.PubKeySecp256k1)
|
2018-06-20 15:30:44 -07:00
|
|
|
pub := pubT[:]
|
|
|
|
addr := pubKey.Address()
|
|
|
|
|
|
|
|
assert.Equal(t, pub, pubB, "Expected pub keys to match")
|
|
|
|
assert.Equal(t, addr, addrB, "Expected addresses to match")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-18 08:38:44 -07:00
|
|
|
func TestSignAndValidateSecp256k1(t *testing.T) {
|
|
|
|
privKey := secp256k1.GenPrivKeySecp256k1()
|
|
|
|
pubKey := privKey.PubKey()
|
|
|
|
|
|
|
|
msg := crypto.CRandBytes(128)
|
|
|
|
sig, err := privKey.Sign(msg)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
assert.True(t, pubKey.VerifyBytes(msg, sig))
|
|
|
|
|
|
|
|
// Mutate the signature, just one bit.
|
|
|
|
sigEd := sig.(secp256k1.SignatureSecp256k1)
|
|
|
|
sigEd[3] ^= byte(0x01)
|
|
|
|
sig = sigEd
|
|
|
|
|
|
|
|
assert.False(t, pubKey.VerifyBytes(msg, sig))
|
2018-06-20 15:30:44 -07:00
|
|
|
}
|