compiler: implement ECDSA signature verification
Add VerifySignature interop for signature verification. It is converted to VERIFY opcode.
This commit is contained in:
parent
01e16e68ad
commit
bd37359393
4 changed files with 63 additions and 0 deletions
55
pkg/compiler/verify_test.go
Normal file
55
pkg/compiler/verify_test.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
package compiler_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/CityOfZion/neo-go/pkg/crypto/keys"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestVerifyGood(t *testing.T) {
|
||||
msg := []byte("test message")
|
||||
pub, sig := signMessage(t, msg)
|
||||
src := getVerifyProg(pub, sig, msg)
|
||||
|
||||
eval(t, src, true)
|
||||
}
|
||||
|
||||
func TestVerifyBad(t *testing.T) {
|
||||
msg := []byte("test message")
|
||||
pub, sig := signMessage(t, msg)
|
||||
sig[0] = ^sig[0]
|
||||
src := getVerifyProg(pub, sig, msg)
|
||||
|
||||
eval(t, src, false)
|
||||
}
|
||||
|
||||
func signMessage(t *testing.T, msg []byte) ([]byte, []byte) {
|
||||
key, err := keys.NewPrivateKey()
|
||||
require.NoError(t, err)
|
||||
|
||||
sig := key.Sign(msg)
|
||||
pub := key.PublicKey().Bytes()
|
||||
|
||||
return pub, sig
|
||||
}
|
||||
|
||||
func getVerifyProg(pub, sig, msg []byte) string {
|
||||
pubS := fmt.Sprintf("%#v", pub)
|
||||
sigS := fmt.Sprintf("%#v", sig)
|
||||
msgS := fmt.Sprintf("%#v", msg)
|
||||
|
||||
return `
|
||||
package hello
|
||||
|
||||
import "github.com/CityOfZion/neo-go/pkg/interop/crypto"
|
||||
|
||||
func Main() bool {
|
||||
pub := ` + pubS + `
|
||||
sig := ` + sigS + `
|
||||
msg := ` + msgS + `
|
||||
return crypto.VerifySignature(msg, sig, pub)
|
||||
}
|
||||
`
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue