github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/btc/key_test.go (about)

     1  package btc
     2  
     3  import (
     4  //	"math/big"
     5  	"encoding/hex"
     6  	"testing"
     7  )
     8  
     9  func TestPbkyues(t *testing.T) {
    10  	var tstvcs = []string {
    11  		"04CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB450163075FAE68D21D5EA9E2D07FE8742229AFAF02983034E84C614D16CF7107",
    12  		"03CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB",
    13  
    14  		"0476232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9F73B5631781A152BDBF3037AB605573A8D18E7628339EB8C4A8280E5D2E161EA",
    15  		"0276232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9",
    16  
    17  		"04672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C1216E7F69AAE46FED4621DE63CA6EE1251BCC584C2362B7040DEF99F668C810B",
    18  		"03672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C",
    19  
    20  		"04B0B9D37E47380CB037C422365779C169723E4D05C300B7A8BD4A48A9B4E60F0647DEA3378908B133D69BB3E0943CCCF6872C0A94678166D819FEA558B96A812D",
    21  		"03B0B9D37E47380CB037C422365779C169723E4D05C300B7A8BD4A48A9B4E60F06",
    22  
    23  		"0491643DB1E5096E72FAF027D65A79085320186734BC4A5416B5F747F8761551566AD3B3EC7AA0360DEE4EBCCDBCB6FC5260881B9C747E10C671519D8713FFA4F5",
    24  		"0391643DB1E5096E72FAF027D65A79085320186734BC4A5416B5F747F876155156",
    25  
    26  		"04BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450FC99915A84D69CBA5E1EA1A11D6E9C49C039B949EE135B0133FEFCE156064A708",
    27  		"02BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450F",
    28  
    29  		"04FC0C0989BF1EC12C483AB65A63792DF96F74059DE1CB1B6599F3217A6E4957C2A9051A5FB9C15D13BBCC2FAEFF50F1BDE56BC692760A5D92DBFD52D2764BF723",
    30  		"03FC0C0989BF1EC12C483AB65A63792DF96F74059DE1CB1B6599F3217A6E4957C2",
    31  
    32  		"04259EB3B0BE2E1A92958F353450FD499E158E16C526C582F4016A2F05E2A5D78FEB2B208DDF07239278922A286E97672841EFE4C23C434D44472DAF777D50F145",
    33  		"03259EB3B0BE2E1A92958F353450FD499E158E16C526C582F4016A2F05E2A5D78F",
    34  
    35  		"046950778CC3F5B35FB74280770FE038C292C92705887F90FC1B2E184F578EFBC554DF9356EA840217D26E7E557C9D07F29C1BF8406C7DFA2BCA15891FCB8F8173",
    36  		"036950778CC3F5B35FB74280770FE038C292C92705887F90FC1B2E184F578EFBC5",
    37  
    38  		"04BF528DCFBAD67F851EE9B378590EDD42A585FD2D4BFD3E70B9DAD822CE4B2BBDDDDECD0FBD948013A29CBECD19FB96A23C8AAF741F85FF12505588AD106CFB24",
    39  		"02BF528DCFBAD67F851EE9B378590EDD42A585FD2D4BFD3E70B9DAD822CE4B2BBD",
    40  
    41  		"049F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80D484D98F6FD138B0DA7915B6E343D1E67DFA4A96FE4AD1B6AC52E0DAD3C01E66",
    42  		"029F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80",
    43  
    44  		"0458C19BD334283CD9935E14A10028B8B836685260E69F5AFA3FED459953A1FCBB55AC2CF10CCE64B372361A97D8C1D3A900838978C508C67B6B12BD376F705EEF",
    45  		"0358C19BD334283CD9935E14A10028B8B836685260E69F5AFA3FED459953A1FCBB",
    46  
    47  		"04C92EF93E2B187248460BDEDD1E340B198BD19B800AF5FBEDC3B0010A42E5B28641F4B7964B1AF6987BAAC2DAD2C6A3C0F1FBADD1ACF652721077A4DF5F502F3A",
    48  		"02C92EF93E2B187248460BDEDD1E340B198BD19B800AF5FBEDC3B0010A42E5B286",
    49  	}
    50  	for i:=0; i<len(tstvcs); i+=2 {
    51  		xy, _ := hex.DecodeString(tstvcs[i])
    52  		x, _ := hex.DecodeString(tstvcs[i+1])
    53  		k1, e := NewPublicKey(xy)
    54  		if e != nil {
    55  			t.Error("error new k1")
    56  			return
    57  		}
    58  		k2, e := NewPublicKey(x)
    59  		if e != nil {
    60  			t.Error("error new k2")
    61  			return
    62  		}
    63  		if !k1.X.Equals(&k2.X) {
    64  			t.Error("X error", i)
    65  			return
    66  		}
    67  		if !k1.Y.Equals(&k2.Y) {
    68  			t.Error("Y error", i)
    69  			return
    70  		}
    71  	}
    72  }
    73  
    74  
    75  /*
    76  If it was up to me, this test should not pass, but we need to follow the original
    77  implementation, because such an inconsistent signatures have been mined alredy.
    78  See more comments about it at the end of NewSignature() in key.go
    79  */
    80  func TestSignature(t *testing.T) {
    81  	raw, _ := hex.DecodeString("3045022034e4786cf22cd00b45faff8afc3b8789c924378176d934adee0d3b3f4a8bf0dc022100b658dd07beeede1f792d238c3ee29c25200f3b834662f9c900bb4d065526dac90001")
    82  	s, e := NewSignature(raw)
    83  	if e != nil {
    84  		t.Error(e.Error())
    85  		return
    86  	}
    87  	if s.HashType!=1 {
    88  		t.Error("HashType", s.HashType)
    89  		return
    90  	}
    91  }
    92  
    93  
    94  func BenchmarkKey02swap(b *testing.B) {
    95  	xy, _ := hex.DecodeString("02BD22E9E7AE9238EBD7937DCAF2887535B13DEB2EF9E95D5FB9225D29BDCD450F")
    96  	for i := 0; i < b.N; i++ {
    97  		NewPublicKey(xy)
    98  	}
    99  }
   100  
   101  func BenchmarkKey02nswa(b *testing.B) {
   102  	xy, _ := hex.DecodeString("0276232786465DE7FD05B68DB84A3C1D84AAEF2928E907D99969196383E71717A9")
   103  	for i := 0; i < b.N; i++ {
   104  		NewPublicKey(xy)
   105  	}
   106  }
   107  
   108  func BenchmarkKey03swap(b *testing.B) {
   109  	xy, _ := hex.DecodeString("03672E9066C6A7980359514621D1FE787CCD5B6539B67614B940929723BDF5623C")
   110  	for i := 0; i < b.N; i++ {
   111  		NewPublicKey(xy)
   112  	}
   113  }
   114  
   115  func BenchmarkKey03nswa(b *testing.B) {
   116  	xy, _ := hex.DecodeString("03CEB28DE33FBC5ED8B343DE5B00E68A53B73653C204D236694BE2C2DD6A959AEB")
   117  	for i := 0; i < b.N; i++ {
   118  		NewPublicKey(xy)
   119  	}
   120  }
   121  
   122  func BenchmarkKey04full(b *testing.B) {
   123  	xy, _ := hex.DecodeString("049F2F10A61354C2ADF5C5A9B82E2CFC4A209F8C5BA9B29B7DC8B56574105E4B80D484D98F6FD138B0DA7915B6E343D1E67DFA4A96FE4AD1B6AC52E0DAD3C01E66")
   124  	for i := 0; i < b.N; i++ {
   125  		NewPublicKey(xy)
   126  	}
   127  }
   128  
   129  
   130  type vervec struct {
   131  	addr string
   132  	signature string
   133  	message string
   134  	expected bool
   135  }
   136  
   137  func TestVerifyMessage(t *testing.T) {
   138  	var testvcs = []vervec {
   139  		{
   140  			"13XSgyGGJcUso5f1EK8LZ7j194FtEvTfkn",
   141  			"H2AoueOjHJ5yX8vX1dFnNqqq/Mm/FX37S+Yry88JadSIA21KNvojW4+fgVqm9UV6YH+VanGgNb8JcNhXi/IYu1o=",
   142  			"rel net msg",
   143  			true,
   144  		},
   145  		{
   146  			"mqMmY5Uc6AgWoemdbRsvkpTes5hF6p5d8w",
   147  			"H+HUh1GiTw22BMhqRwbSET/4aYCFIuivSgTyU/A+qH7xZp5gz61zp//WMFTbpNDbiMYoYz7pD88NYg/0DekcMpY=",
   148  			"test",
   149  			true,
   150  		},
   151  		{
   152  			"muTPoTTXbVWdurzw4aqTh7DLQ82RRE8hXz",
   153  			"H5iQmSJeZKrDcvKJrkAIOubFfajrxuPiSO0/xMorz+C31EyDF/bmkE+XLAihfkt3EQTEjxSgPURkdKxqJpxTw8Y=",
   154  			"This is some test message",
   155  			true,
   156  		},
   157  		{
   158  			"mmS8FqnakrybtSzXSHXcGjeMfHUQqojx6Q",
   159  			"H0m1/OUAc1amV02c/bMF2Rdv2pJIPYfdSv5To3rax5O0eauXuexvafATfdLN1VFh/71SvpayMm3qoq2/9y+QQBA=",
   160  			"test",
   161  			true,
   162  		},
   163  		{
   164  			"mpu4t3bSgcWneVDKdjB8JHcGu2RgXT6QhJ",
   165  			"H3PJeR3oSKwYfbiCFhzIpSbLjS3aZge2qMEi+gnB1ay+nNENnJo6uaejoVvo7+gBI3M7eU+jk5Jv91tj8DjOIxQ=",
   166  			"test",
   167  			true,
   168  		},
   169  		{
   170  			"mwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSP",
   171  			"H+TE9nhNgZXizuEySs8npLojQMAEhE0r1TpJCC3QxV4dd4l8AEN3smJH5ryw4IcHApJf6Z5m5hxz8Q0vnPd5aVw=",
   172  			"dlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibmwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSPdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibmwajpkz1ZthoAN3fvG8bCRvgoEf3BRraSPdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoeirbeoibdlrhkjelrhjedslgjekrojirweopjighoerihoei",
   173  			true,
   174  		},
   175  		{
   176  			"mmS8FqnakrybtSzXSHXcGjeMfHUQqojx6Q",
   177  			"H3PJeR3oSKwYfbiCFhzIpSbLjS3aZge2qMEi+gnB1ay+nNENnJo6uaejoVvo7+gBI3M7eU+jk5Jv91tj8DjOIxQ=",
   178  			"test",
   179  			false,
   180  		},
   181  		{
   182  			"mqMmY5Uc6AgWoemdbRsvkpTes5hF6p5d8w",
   183  			"H+hUh1GiTw22BMhqRwbSET/4aYCFIuivSgTyU/A+qH7xZp5gz61zp//WMFTbpNDbiMYoYz7pD88NYg/0DekcMpY=",
   184  			"test",
   185  			false,
   186  		},
   187  		{
   188  			"momBPYuZ42xGVBNC1DxQBKM3WT3fa8MLMn",
   189  			"ILRw4C+DSjqq+ie9K0ngcmnpYqUUEPNk6eGVwxNRoF5QVgl4rtdt6dXXgfh+0gaIMu1UXyshvwQGVKLa/2lMiwk=",
   190  			"test",
   191  			true,
   192  		},
   193  	}
   194  
   195  	var hash [32]byte
   196  	for i := range testvcs {
   197  		ad, er := NewAddrFromString(testvcs[i].addr)
   198  		if er != nil {
   199  			t.Error(er.Error())
   200  		}
   201  
   202  		nv, sig, er := ParseMessageSignature(testvcs[i].signature)
   203  		if er != nil {
   204  			t.Error(er.Error())
   205  		}
   206  
   207  		HashFromMessage([]byte(testvcs[i].message), hash[:])
   208  
   209  		compressed := nv>=31
   210  		if compressed {
   211  			nv -= 4
   212  		}
   213  
   214  		var verified_ok bool
   215  		pub := sig.RecoverPublicKey(hash[:], int(nv-27))
   216  		if pub != nil {
   217  			sa := NewAddrFromPubkey(pub.Bytes(compressed), ad.Version)
   218  			if sa != nil {
   219  				verified_ok = ad.Hash160==sa.Hash160
   220  			} else {
   221  				t.Error("NewAddrFromPubkey failed")
   222  			}
   223  		}
   224  		if verified_ok != testvcs[i].expected {
   225  			t.Error("Result different than expected at index", i, verified_ok, testvcs[i].expected)
   226  		}
   227  	}
   228  }
   229  
   230  func BenchmarkRecoverKey(b *testing.B) {
   231  	var hash [32]byte
   232  	HashFromMessage([]byte("rel net msg"), hash[:])
   233  	nv, sig, _ := ParseMessageSignature("H2AoueOjHJ5yX8vX1dFnNqqq/Mm/FX37S+Yry88JadSIA21KNvojW4+fgVqm9UV6YH+VanGgNb8JcNhXi/IYu1o=")
   234  	for i := 0; i < b.N; i++ {
   235  		sig.RecoverPublicKey(hash[:], int(nv-27))
   236  	}
   237  }