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

     1  package secp256k1
     2  
     3  import (
     4  	"crypto/rand"
     5  	"encoding/hex"
     6  	"strconv"
     7  	"testing"
     8  )
     9  
    10  func TestPrintArch(t *testing.T) {
    11  	println("Using field", FieldArch)
    12  }
    13  
    14  func TestSigRecover(t *testing.T) {
    15  	var vs = [][6]string{
    16  		{
    17  			"6028b9e3a31c9e725fcbd7d5d16736aaaafcc9bf157dfb4be62bcbcf0969d488",
    18  			"036d4a36fa235b8f9f815aa6f5457a607f956a71a035bf0970d8578bf218bb5a",
    19  			"9cff3da1a4f86caf3683f865232c64992b5ed002af42b321b8d8a48420680487",
    20  			"0",
    21  			"56dc5df245955302893d8dda0677cc9865d8011bc678c7803a18b5f6faafec08",
    22  			"54b5fbdcd8fac6468dac2de88fadce6414f5f3afbb103753e25161bef77705a6",
    23  		},
    24  		{
    25  			"b470e02f834a3aaafa27bd2b49e07269e962a51410f364e9e195c31351a05e50",
    26  			"560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09",
    27  			"9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6",
    28  			"1",
    29  			"15b7e7d00f024bffcd2e47524bb7b7d3a6b251e23a3a43191ed7f0a418d9a578",
    30  			"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
    31  		},
    32  	}
    33  
    34  	var sig Signature
    35  	var pubkey, exp XY
    36  	var msg Number
    37  
    38  	for i := range vs {
    39  		sig.R.set_hex(vs[i][0])
    40  		sig.S.set_hex(vs[i][1])
    41  		msg.set_hex(vs[i][2])
    42  		rid, _ := strconv.ParseInt(vs[i][3], 10, 32)
    43  		exp.X.SetHex(vs[i][4])
    44  		exp.Y.SetHex(vs[i][5])
    45  
    46  		if sig.recover(&pubkey, &msg, int(rid)) {
    47  			if !exp.X.Equals(&pubkey.X) {
    48  				t.Error("X mismatch at vector", i)
    49  			}
    50  			if !exp.Y.Equals(&pubkey.Y) {
    51  				t.Error("Y mismatch at vector", i)
    52  			}
    53  		} else {
    54  			t.Error("sig.recover fialed")
    55  		}
    56  	}
    57  }
    58  
    59  func TestSigVerify(t *testing.T) {
    60  	var msg Number
    61  	var sig Signature
    62  	var key XY
    63  
    64  	msg.set_hex("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6")
    65  	sig.R.set_hex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10")
    66  	sig.S.set_hex("7d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c")
    67  	xy, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16")
    68  	key.ParsePubkey(xy)
    69  	if !sig.Verify(&key, &msg) {
    70  		t.Error("sig.Verify 0")
    71  	}
    72  
    73  	msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA")
    74  	sig.R.set_hex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980")
    75  	sig.S.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480")
    76  	key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93")
    77  	key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602")
    78  	if !sig.Verify(&key, &msg) {
    79  		t.Error("sig.Verify 1")
    80  	}
    81  
    82  	msg.set_hex("2c43a883f4edc2b66c67a7a355b9312a565bb3d33bb854af36a06669e2028377")
    83  	sig.R.set_hex("6b2fa9344462c958d4a674c2a42fbedf7d6159a5276eb658887e2e1b3915329b")
    84  	sig.S.set_hex("eddc6ea7f190c14a0aa74e41519d88d2681314f011d253665f301425caf86b86")
    85  	xy, _ = hex.DecodeString("02a60d70cfba37177d8239d018185d864b2bdd0caf5e175fd4454cc006fd2d75ac")
    86  	key.ParsePubkey(xy)
    87  	if !sig.Verify(&key, &msg) {
    88  		t.Error("sig.Verify 2")
    89  	}
    90  }
    91  
    92  func TestSigSign(t *testing.T) {
    93  	var sec, msg, non Number
    94  	var sig Signature
    95  	var recid int
    96  	sec.set_hex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146")
    97  	msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA")
    98  	non.set_hex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E")
    99  	res := sig.Sign(&sec, &msg, &non, &recid)
   100  	if res != 1 {
   101  		t.Error("res failed", res)
   102  	}
   103  	if FORCE_LOW_S {
   104  		if recid != 0 {
   105  			t.Error("recid failed", recid)
   106  		}
   107  	} else {
   108  		if recid != 1 {
   109  			t.Error("recid failed", recid)
   110  		}
   111  	}
   112  	non.set_hex("98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc56681980")
   113  	if sig.R.Cmp(&non.Int) != 0 {
   114  		t.Error("R failed", sig.R.String())
   115  	}
   116  	if FORCE_LOW_S {
   117  		non.set_hex("1ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1")
   118  	} else {
   119  		non.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480")
   120  	}
   121  	if sig.S.Cmp(&non.Int) != 0 {
   122  		t.Error("S failed", sig.S.String())
   123  	}
   124  }
   125  
   126  func BenchmarkVerify(b *testing.B) {
   127  	var msg Number
   128  	var sig Signature
   129  	var key XY
   130  	msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA")
   131  	sig.R.set_hex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980")
   132  	sig.S.set_hex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480")
   133  	key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93")
   134  	key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602")
   135  	b.ResetTimer()
   136  	for i := 0; i < b.N; i++ {
   137  		if !sig.Verify(&key, &msg) {
   138  			b.Fatal("sig_verify failed")
   139  		}
   140  	}
   141  }
   142  
   143  func BenchmarkPrv2Pub(b *testing.B) {
   144  	var prv [32]byte
   145  	var pub [33]byte
   146  	rand.Read(prv[:])
   147  	b.ResetTimer()
   148  	for i := 0; i < b.N; i++ {
   149  		BaseMultiply(prv[:], pub[:])
   150  	}
   151  }
   152  
   153  func BenchmarkSign(b *testing.B) {
   154  	var sec, msg, non Number
   155  	var sig Signature
   156  	var recid int
   157  	sec.set_hex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146")
   158  	msg.set_hex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA")
   159  	non.set_hex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E")
   160  	b.ResetTimer()
   161  	for i := 0; i < b.N; i++ {
   162  		sig.Sign(&sec, &msg, &non, &recid)
   163  	}
   164  }