ecdh_test.go raw

   1  package secp256k1
   2  
   3  import (
   4  	"encoding/hex"
   5  	"testing"
   6  )
   7  
   8  func TestECDHSymmetry(t *testing.T) {
   9  	var a, b [32]byte
  10  	a[31] = 1
  11  	b[31] = 2
  12  	pubA, ok := PubKey(a)
  13  	if !ok {
  14  		t.Fatal("pub a")
  15  	}
  16  	pubB, ok := PubKey(b)
  17  	if !ok {
  18  		t.Fatal("pub b")
  19  	}
  20  	x1, ok := ECDH(a, pubB)
  21  	if !ok {
  22  		t.Fatal("ecdh a,b")
  23  	}
  24  	x2, ok := ECDH(b, pubA)
  25  	if !ok {
  26  		t.Fatal("ecdh b,a")
  27  	}
  28  	if x1 != x2 {
  29  		t.Fatalf("shared secrets differ: %x %x", x1, x2)
  30  	}
  31  	// 2*G has this x coordinate.
  32  	const want = "c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5"
  33  	if got := hex.EncodeToString(x1[:]); got != want {
  34  		t.Fatalf("x = %s, want %s", got, want)
  35  	}
  36  }
  37  
  38  func TestECDHRejectsBadInput(t *testing.T) {
  39  	var zero, one [32]byte
  40  	one[31] = 1
  41  	if _, ok := ECDH(zero, one); ok {
  42  		t.Fatal("accepted zero secret")
  43  	}
  44  	badPub := [32]byte{0xff}
  45  	if _, ok := ECDH(one, badPub); ok {
  46  		t.Fatal("accepted off-curve public key")
  47  	}
  48  }
  49  
  50  func TestValidatePubKey(t *testing.T) {
  51  	var one [32]byte
  52  	one[31] = 1
  53  	pub, _ := PubKey(one)
  54  	if !ValidatePubKey(pub) {
  55  		t.Fatal("rejected a real public key")
  56  	}
  57  	if ValidatePubKey([32]byte{0xff}) {
  58  		t.Fatal("accepted an off-curve key")
  59  	}
  60  }
  61