eckey_test.go raw

   1  package p256k1
   2  
   3  import (
   4  	"testing"
   5  )
   6  
   7  func TestECSeckeyVerify(t *testing.T) {
   8  	// Test valid key
   9  	validKey := []byte{
  10  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  11  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  12  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  13  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  14  	}
  15  	if !ECSeckeyVerify(validKey) {
  16  		t.Error("valid key should verify")
  17  	}
  18  	
  19  	// Test invalid key (all zeros)
  20  	invalidKey := make([]byte, 32)
  21  	if ECSeckeyVerify(invalidKey) {
  22  		t.Error("zero key should not verify")
  23  	}
  24  	
  25  	// Test wrong length
  26  	if ECSeckeyVerify(validKey[:31]) {
  27  		t.Error("wrong length should not verify")
  28  	}
  29  }
  30  
  31  func TestECSeckeyGenerate(t *testing.T) {
  32  	key, err := ECSeckeyGenerate()
  33  	if err != nil {
  34  		t.Fatalf("failed to generate key: %v", err)
  35  	}
  36  	if len(key) != 32 {
  37  		t.Errorf("key length should be 32, got %d", len(key))
  38  	}
  39  	if !ECSeckeyVerify(key) {
  40  		t.Error("generated key should be valid")
  41  	}
  42  }
  43  
  44  func TestECKeyPairGenerate(t *testing.T) {
  45  	seckey, pubkey, err := ECKeyPairGenerate()
  46  	if err != nil {
  47  		t.Fatalf("failed to generate key pair: %v", err)
  48  	}
  49  	if len(seckey) != 32 {
  50  		t.Errorf("secret key length should be 32, got %d", len(seckey))
  51  	}
  52  	if pubkey == nil {
  53  		t.Fatal("public key should not be nil")
  54  	}
  55  	
  56  	// Verify the public key matches the secret key
  57  	var expectedPubkey PublicKey
  58  	if err := ECPubkeyCreate(&expectedPubkey, seckey); err != nil {
  59  		t.Fatalf("failed to create expected public key: %v", err)
  60  	}
  61  	
  62  	if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
  63  		t.Error("generated public key does not match secret key")
  64  	}
  65  }
  66  
  67  func TestECSeckeyNegate(t *testing.T) {
  68  	key := []byte{
  69  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  70  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  71  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  72  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  73  	}
  74  	
  75  	keyCopy := make([]byte, 32)
  76  	copy(keyCopy, key)
  77  	
  78  	if !ECSeckeyNegate(keyCopy) {
  79  		t.Error("negation should succeed")
  80  	}
  81  	
  82  	// Negating twice should give original
  83  	if !ECSeckeyNegate(keyCopy) {
  84  		t.Error("second negation should succeed")
  85  	}
  86  	
  87  	// Keys should be equal
  88  	for i := 0; i < 32; i++ {
  89  		if key[i] != keyCopy[i] {
  90  			t.Error("double negation should restore original")
  91  			break
  92  		}
  93  	}
  94  }
  95  
  96  func TestECSeckeyTweakAdd(t *testing.T) {
  97  	seckey := []byte{
  98  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  99  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 100  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 101  		0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
 102  	}
 103  	
 104  	tweak := []byte{
 105  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 106  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 107  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 108  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 109  	}
 110  	
 111  	originalSeckey := make([]byte, 32)
 112  	copy(originalSeckey, seckey)
 113  	
 114  	if err := ECSeckeyTweakAdd(seckey, tweak); err != nil {
 115  		t.Fatalf("tweak add failed: %v", err)
 116  	}
 117  	
 118  	// Verify key is still valid
 119  	if !ECSeckeyVerify(seckey) {
 120  		t.Error("tweaked key should be valid")
 121  	}
 122  	
 123  	// Keys should be different
 124  	allSame := true
 125  	for i := 0; i < 32; i++ {
 126  		if seckey[i] != originalSeckey[i] {
 127  			allSame = false
 128  			break
 129  		}
 130  	}
 131  	if allSame {
 132  		t.Error("tweaked key should be different from original")
 133  	}
 134  }
 135  
 136  func TestECPubkeyTweakAdd(t *testing.T) {
 137  	// Generate key pair
 138  	seckey, pubkey, err := ECKeyPairGenerate()
 139  	if err != nil {
 140  		t.Fatalf("failed to generate key pair: %v", err)
 141  	}
 142  	
 143  	tweak := []byte{
 144  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 145  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 146  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 147  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 148  	}
 149  	
 150  	originalPubkey := *pubkey
 151  	
 152  	// Tweak secret key
 153  	seckeyCopy := make([]byte, 32)
 154  	copy(seckeyCopy, seckey)
 155  	if err := ECSeckeyTweakAdd(seckeyCopy, tweak); err != nil {
 156  		t.Fatalf("failed to tweak secret key: %v", err)
 157  	}
 158  	
 159  	// Compute expected public key from tweaked secret key
 160  	var expectedPubkey PublicKey
 161  	if err := ECPubkeyCreate(&expectedPubkey, seckeyCopy); err != nil {
 162  		t.Fatalf("failed to create expected public key: %v", err)
 163  	}
 164  	
 165  	// Tweak public key
 166  	if err := ECPubkeyTweakAdd(pubkey, tweak); err != nil {
 167  		t.Fatalf("failed to tweak public key: %v", err)
 168  	}
 169  	
 170  	// Public keys should match
 171  	if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
 172  		t.Error("tweaked public key does not match tweaked secret key")
 173  	}
 174  	
 175  	// Should be different from original
 176  	if ECPubkeyCmp(pubkey, &originalPubkey) == 0 {
 177  		t.Error("tweaked public key should be different from original")
 178  	}
 179  }
 180  
 181  func TestECPubkeyTweakMul(t *testing.T) {
 182  	// Generate key pair
 183  	seckey, pubkey, err := ECKeyPairGenerate()
 184  	if err != nil {
 185  		t.Fatalf("failed to generate key pair: %v", err)
 186  	}
 187  	
 188  	tweak := []byte{
 189  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 190  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 191  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 192  		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
 193  	}
 194  	
 195  	originalPubkey := *pubkey
 196  	
 197  	// Tweak secret key
 198  	seckeyCopy := make([]byte, 32)
 199  	copy(seckeyCopy, seckey)
 200  	if err := ECSeckeyTweakMul(seckeyCopy, tweak); err != nil {
 201  		t.Fatalf("failed to tweak secret key: %v", err)
 202  	}
 203  	
 204  	// Compute expected public key from tweaked secret key
 205  	var expectedPubkey PublicKey
 206  	if err := ECPubkeyCreate(&expectedPubkey, seckeyCopy); err != nil {
 207  		t.Fatalf("failed to create expected public key: %v", err)
 208  	}
 209  	
 210  	// Tweak public key
 211  	if err := ECPubkeyTweakMul(pubkey, tweak); err != nil {
 212  		t.Fatalf("failed to tweak public key: %v", err)
 213  	}
 214  	
 215  	// Public keys should match
 216  	if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
 217  		t.Error("tweaked public key does not match tweaked secret key")
 218  	}
 219  	
 220  	// Should be different from original
 221  	if ECPubkeyCmp(pubkey, &originalPubkey) == 0 {
 222  		t.Error("tweaked public key should be different from original")
 223  	}
 224  }
 225  
 226