github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/crypto/signature_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:36</date>
    10  //</624450085639426048>
    11  
    12  
    13  package crypto
    14  
    15  import (
    16  	"bytes"
    17  	"crypto/ecdsa"
    18  	"reflect"
    19  	"testing"
    20  
    21  	"github.com/ethereum/go-ethereum/common"
    22  	"github.com/ethereum/go-ethereum/common/hexutil"
    23  	"github.com/ethereum/go-ethereum/common/math"
    24  )
    25  
    26  var (
    27  	testmsg     = hexutil.MustDecode("0xce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008")
    28  	testsig     = hexutil.MustDecode("0x90f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549984a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc9301")
    29  	testpubkey  = hexutil.MustDecode("0x04e32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a0a2b2667f7e725ceea70c673093bf67663e0312623c8e091b13cf2c0f11ef652")
    30  	testpubkeyc = hexutil.MustDecode("0x02e32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a")
    31  )
    32  
    33  func TestEcrecover(t *testing.T) {
    34  	pubkey, err := Ecrecover(testmsg, testsig)
    35  	if err != nil {
    36  		t.Fatalf("recover error: %s", err)
    37  	}
    38  	if !bytes.Equal(pubkey, testpubkey) {
    39  		t.Errorf("pubkey mismatch: want: %x have: %x", testpubkey, pubkey)
    40  	}
    41  }
    42  
    43  func TestVerifySignature(t *testing.T) {
    44  sig := testsig[:len(testsig)-1] //删除恢复ID
    45  	if !VerifySignature(testpubkey, testmsg, sig) {
    46  		t.Errorf("can't verify signature with uncompressed key")
    47  	}
    48  	if !VerifySignature(testpubkeyc, testmsg, sig) {
    49  		t.Errorf("can't verify signature with compressed key")
    50  	}
    51  
    52  	if VerifySignature(nil, testmsg, sig) {
    53  		t.Errorf("signature valid with no key")
    54  	}
    55  	if VerifySignature(testpubkey, nil, sig) {
    56  		t.Errorf("signature valid with no message")
    57  	}
    58  	if VerifySignature(testpubkey, testmsg, nil) {
    59  		t.Errorf("nil signature valid")
    60  	}
    61  	if VerifySignature(testpubkey, testmsg, append(common.CopyBytes(sig), 1, 2, 3)) {
    62  		t.Errorf("signature valid with extra bytes at the end")
    63  	}
    64  	if VerifySignature(testpubkey, testmsg, sig[:len(sig)-2]) {
    65  		t.Errorf("signature valid even though it's incomplete")
    66  	}
    67  	wrongkey := common.CopyBytes(testpubkey)
    68  	wrongkey[10]++
    69  	if VerifySignature(wrongkey, testmsg, sig) {
    70  		t.Errorf("signature valid with with wrong public key")
    71  	}
    72  }
    73  
    74  //此测试检查验证签名是否拒绝S>N/2的可延展签名。
    75  func TestVerifySignatureMalleable(t *testing.T) {
    76  	sig := hexutil.MustDecode("0x638a54215d80a6713c8d523a6adc4e6e73652d859103a36b700851cb0e61b66b8ebfc1a610c57d732ec6e0a8f06a9a7a28df5051ece514702ff9cdff0b11f454")
    77  	key := hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd3138")
    78  	msg := hexutil.MustDecode("0xd301ce462d3e639518f482c7f03821fec1e602018630ce621e1e7851c12343a6")
    79  	if VerifySignature(key, msg, sig) {
    80  		t.Error("VerifySignature returned true for malleable signature")
    81  	}
    82  }
    83  
    84  func TestDecompressPubkey(t *testing.T) {
    85  	key, err := DecompressPubkey(testpubkeyc)
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  	if uncompressed := FromECDSAPub(key); !bytes.Equal(uncompressed, testpubkey) {
    90  		t.Errorf("wrong public key result: got %x, want %x", uncompressed, testpubkey)
    91  	}
    92  	if _, err := DecompressPubkey(nil); err == nil {
    93  		t.Errorf("no error for nil pubkey")
    94  	}
    95  	if _, err := DecompressPubkey(testpubkeyc[:5]); err == nil {
    96  		t.Errorf("no error for incomplete pubkey")
    97  	}
    98  	if _, err := DecompressPubkey(append(common.CopyBytes(testpubkeyc), 1, 2, 3)); err == nil {
    99  		t.Errorf("no error for pubkey with extra bytes at the end")
   100  	}
   101  }
   102  
   103  func TestCompressPubkey(t *testing.T) {
   104  	key := &ecdsa.PublicKey{
   105  		Curve: S256(),
   106  		X:     math.MustParseBig256("0xe32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a"),
   107  		Y:     math.MustParseBig256("0x0a2b2667f7e725ceea70c673093bf67663e0312623c8e091b13cf2c0f11ef652"),
   108  	}
   109  	compressed := CompressPubkey(key)
   110  	if !bytes.Equal(compressed, testpubkeyc) {
   111  		t.Errorf("wrong public key result: got %x, want %x", compressed, testpubkeyc)
   112  	}
   113  }
   114  
   115  func TestPubkeyRandom(t *testing.T) {
   116  	const runs = 200
   117  
   118  	for i := 0; i < runs; i++ {
   119  		key, err := GenerateKey()
   120  		if err != nil {
   121  			t.Fatalf("iteration %d: %v", i, err)
   122  		}
   123  		pubkey2, err := DecompressPubkey(CompressPubkey(&key.PublicKey))
   124  		if err != nil {
   125  			t.Fatalf("iteration %d: %v", i, err)
   126  		}
   127  		if !reflect.DeepEqual(key.PublicKey, *pubkey2) {
   128  			t.Fatalf("iteration %d: keys not equal", i)
   129  		}
   130  	}
   131  }
   132  
   133  func BenchmarkEcrecoverSignature(b *testing.B) {
   134  	for i := 0; i < b.N; i++ {
   135  		if _, err := Ecrecover(testmsg, testsig); err != nil {
   136  			b.Fatal("ecrecover error", err)
   137  		}
   138  	}
   139  }
   140  
   141  func BenchmarkVerifySignature(b *testing.B) {
   142  sig := testsig[:len(testsig)-1] //删除恢复ID
   143  	for i := 0; i < b.N; i++ {
   144  		if !VerifySignature(testpubkey, testmsg, sig) {
   145  			b.Fatal("verify error")
   146  		}
   147  	}
   148  }
   149  
   150  func BenchmarkDecompressPubkey(b *testing.B) {
   151  	for i := 0; i < b.N; i++ {
   152  		if _, err := DecompressPubkey(testpubkeyc); err != nil {
   153  			b.Fatal(err)
   154  		}
   155  	}
   156  }
   157