crypto/secp256k1: sign with deterministic K (rfc6979) (#3561)

pull/3600/head
Felix Lange 8 years ago committed by GitHub
parent 935d891e9d
commit 96778a1c21
  1. 12
      crypto/secp256k1/secp256.go
  2. 18
      crypto/secp256k1/secp256_test.go

@ -40,8 +40,6 @@ import (
"errors" "errors"
"math/big" "math/big"
"unsafe" "unsafe"
"github.com/ethereum/go-ethereum/crypto/randentropy"
) )
var ( var (
@ -89,13 +87,11 @@ func Sign(msg []byte, seckey []byte) ([]byte, error) {
} }
var ( var (
msgdata = (*C.uchar)(unsafe.Pointer(&msg[0])) msgdata = (*C.uchar)(unsafe.Pointer(&msg[0]))
nonce = randentropy.GetEntropyCSPRNG(32) noncefunc = C.secp256k1_nonce_function_rfc6979
noncefunc = &(*C.secp256k1_nonce_function_default) sigstruct C.secp256k1_ecdsa_recoverable_signature
noncefuncData = unsafe.Pointer(&nonce[0])
sigstruct C.secp256k1_ecdsa_recoverable_signature
) )
if C.secp256k1_ecdsa_sign_recoverable(context, &sigstruct, msgdata, seckeydata, noncefunc, noncefuncData) == 0 { if C.secp256k1_ecdsa_sign_recoverable(context, &sigstruct, msgdata, seckeydata, noncefunc, nil) == 0 {
return nil, ErrSignFailed return nil, ErrSignFailed
} }

@ -112,6 +112,24 @@ func TestSignAndRecover(t *testing.T) {
} }
} }
func TestSignDeterministic(t *testing.T) {
_, seckey := generateKeyPair()
msg := make([]byte, 32)
copy(msg, "hi there")
sig1, err := Sign(msg, seckey)
if err != nil {
t.Fatal(err)
}
sig2, err := Sign(msg, seckey)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(sig1, sig2) {
t.Fatal("signatures not equal")
}
}
func TestRandomMessagesWithSameKey(t *testing.T) { func TestRandomMessagesWithSameKey(t *testing.T) {
pubkey, seckey := generateKeyPair() pubkey, seckey := generateKeyPair()
keys := func() ([]byte, []byte) { keys := func() ([]byte, []byte) {

Loading…
Cancel
Save