github.com/nova-foundation/go-ethereum@v1.0.1/crypto/bls12381/field_element_test.go (about)

     1  package bls12381
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/rand"
     6  	"math/big"
     7  	"testing"
     8  )
     9  
    10  func TestFieldElementValidation(t *testing.T) {
    11  	zero := new(fe).zero()
    12  	if !zero.isValid() {
    13  		t.Fatal("zero must be valid")
    14  	}
    15  	one := new(fe).one()
    16  	if !one.isValid() {
    17  		t.Fatal("one must be valid")
    18  	}
    19  	if modulus.isValid() {
    20  		t.Fatal("modulus must be invalid")
    21  	}
    22  	n := modulus.big()
    23  	n.Add(n, big.NewInt(1))
    24  	if new(fe).setBig(n).isValid() {
    25  		t.Fatal("number greater than modulus must be invalid")
    26  	}
    27  }
    28  
    29  func TestFieldElementEquality(t *testing.T) {
    30  	// fe
    31  	zero := new(fe).zero()
    32  	if !zero.equal(zero) {
    33  		t.Fatal("0 == 0")
    34  	}
    35  	one := new(fe).one()
    36  	if !one.equal(one) {
    37  		t.Fatal("1 == 1")
    38  	}
    39  	a, _ := new(fe).rand(rand.Reader)
    40  	if !a.equal(a) {
    41  		t.Fatal("a == a")
    42  	}
    43  	b := new(fe)
    44  	add(b, a, one)
    45  	if a.equal(b) {
    46  		t.Fatal("a != a + 1")
    47  	}
    48  	// fe2
    49  	zero2 := new(fe2).zero()
    50  	if !zero2.equal(zero2) {
    51  		t.Fatal("0 == 0")
    52  	}
    53  	one2 := new(fe2).one()
    54  	if !one2.equal(one2) {
    55  		t.Fatal("1 == 1")
    56  	}
    57  	a2, _ := new(fe2).rand(rand.Reader)
    58  	if !a2.equal(a2) {
    59  		t.Fatal("a == a")
    60  	}
    61  	b2 := new(fe2)
    62  	fp2 := newFp2()
    63  	fp2.add(b2, a2, one2)
    64  	if a2.equal(b2) {
    65  		t.Fatal("a != a + 1")
    66  	}
    67  	// fe6
    68  	zero6 := new(fe6).zero()
    69  	if !zero6.equal(zero6) {
    70  		t.Fatal("0 == 0")
    71  	}
    72  	one6 := new(fe6).one()
    73  	if !one6.equal(one6) {
    74  		t.Fatal("1 == 1")
    75  	}
    76  	a6, _ := new(fe6).rand(rand.Reader)
    77  	if !a6.equal(a6) {
    78  		t.Fatal("a == a")
    79  	}
    80  	b6 := new(fe6)
    81  	fp6 := newFp6(fp2)
    82  	fp6.add(b6, a6, one6)
    83  	if a6.equal(b6) {
    84  		t.Fatal("a != a + 1")
    85  	}
    86  	// fe12
    87  	zero12 := new(fe12).zero()
    88  	if !zero12.equal(zero12) {
    89  		t.Fatal("0 == 0")
    90  	}
    91  	one12 := new(fe12).one()
    92  	if !one12.equal(one12) {
    93  		t.Fatal("1 == 1")
    94  	}
    95  	a12, _ := new(fe12).rand(rand.Reader)
    96  	if !a12.equal(a12) {
    97  		t.Fatal("a == a")
    98  	}
    99  	b12 := new(fe12)
   100  	fp12 := newFp12(fp6)
   101  	fp12.add(b12, a12, one12)
   102  	if a12.equal(b12) {
   103  		t.Fatal("a != a + 1")
   104  	}
   105  }
   106  
   107  func TestFieldElementHelpers(t *testing.T) {
   108  	// fe
   109  	zero := new(fe).zero()
   110  	if !zero.isZero() {
   111  		t.Fatal("'zero' is not zero")
   112  	}
   113  	one := new(fe).one()
   114  	if !one.isOne() {
   115  		t.Fatal("'one' is not one")
   116  	}
   117  	odd := new(fe).setBig(big.NewInt(1))
   118  	if !odd.isOdd() {
   119  		t.Fatal("1 must be odd")
   120  	}
   121  	if odd.isEven() {
   122  		t.Fatal("1 must not be even")
   123  	}
   124  	even := new(fe).setBig(big.NewInt(2))
   125  	if !even.isEven() {
   126  		t.Fatal("2 must be even")
   127  	}
   128  	if even.isOdd() {
   129  		t.Fatal("2 must not be odd")
   130  	}
   131  	// fe2
   132  	zero2 := new(fe2).zero()
   133  	if !zero2.isZero() {
   134  		t.Fatal("'zero' is not zero, 2")
   135  	}
   136  	one2 := new(fe2).one()
   137  	if !one2.isOne() {
   138  		t.Fatal("'one' is not one, 2")
   139  	}
   140  	// fe6
   141  	zero6 := new(fe6).zero()
   142  	if !zero6.isZero() {
   143  		t.Fatal("'zero' is not zero, 6")
   144  	}
   145  	one6 := new(fe6).one()
   146  	if !one6.isOne() {
   147  		t.Fatal("'one' is not one, 6")
   148  	}
   149  	// fe12
   150  	zero12 := new(fe12).zero()
   151  	if !zero12.isZero() {
   152  		t.Fatal("'zero' is not zero, 12")
   153  	}
   154  	one12 := new(fe12).one()
   155  	if !one12.isOne() {
   156  		t.Fatal("'one' is not one, 12")
   157  	}
   158  }
   159  
   160  func TestFieldElementSerialization(t *testing.T) {
   161  	t.Run("zero", func(t *testing.T) {
   162  		in := make([]byte, 48)
   163  		fe := new(fe).setBytes(in)
   164  		if !fe.isZero() {
   165  			t.Fatal("bad serialization")
   166  		}
   167  		if !bytes.Equal(in, fe.bytes()) {
   168  			t.Fatal("bad serialization")
   169  		}
   170  	})
   171  	t.Run("bytes", func(t *testing.T) {
   172  		for i := 0; i < fuz; i++ {
   173  			a, _ := new(fe).rand(rand.Reader)
   174  			b := new(fe).setBytes(a.bytes())
   175  			if !a.equal(b) {
   176  				t.Fatal("bad serialization")
   177  			}
   178  		}
   179  	})
   180  	t.Run("big", func(t *testing.T) {
   181  		for i := 0; i < fuz; i++ {
   182  			a, _ := new(fe).rand(rand.Reader)
   183  			b := new(fe).setBig(a.big())
   184  			if !a.equal(b) {
   185  				t.Fatal("bad encoding or decoding")
   186  			}
   187  		}
   188  	})
   189  	t.Run("string", func(t *testing.T) {
   190  		for i := 0; i < fuz; i++ {
   191  			a, _ := new(fe).rand(rand.Reader)
   192  			b, err := new(fe).setString(a.string())
   193  			if err != nil {
   194  				t.Fatal(err)
   195  			}
   196  			if !a.equal(b) {
   197  				t.Fatal("bad encoding or decoding")
   198  			}
   199  		}
   200  	})
   201  }
   202  
   203  func TestFieldElementByteInputs(t *testing.T) {
   204  	zero := new(fe).zero()
   205  	in := make([]byte, 0)
   206  	a := new(fe).setBytes(in)
   207  	if !a.equal(zero) {
   208  		t.Fatal("bad serialization")
   209  	}
   210  	in = make([]byte, 48)
   211  	a = new(fe).setBytes(in)
   212  	if !a.equal(zero) {
   213  		t.Fatal("bad serialization")
   214  	}
   215  	in = make([]byte, 64)
   216  	a = new(fe).setBytes(in)
   217  	if !a.equal(zero) {
   218  		t.Fatal("bad serialization")
   219  	}
   220  	in = make([]byte, 49)
   221  	in[47] = 1
   222  	normalOne := &fe{1, 0, 0, 0, 0, 0}
   223  	a = new(fe).setBytes(in)
   224  	if !a.equal(normalOne) {
   225  		t.Fatal("bad serialization")
   226  	}
   227  }
   228  
   229  func TestFieldElementCopy(t *testing.T) {
   230  	a, _ := new(fe).rand(rand.Reader)
   231  	b := new(fe).set(a)
   232  	if !a.equal(b) {
   233  		t.Fatal("bad copy, 1")
   234  	}
   235  	a2, _ := new(fe2).rand(rand.Reader)
   236  	b2 := new(fe2).set(a2)
   237  	if !a2.equal(b2) {
   238  		t.Fatal("bad copy, 2")
   239  	}
   240  	a6, _ := new(fe6).rand(rand.Reader)
   241  	b6 := new(fe6).set(a6)
   242  	if !a6.equal(b6) {
   243  		t.Fatal("bad copy, 6")
   244  	}
   245  	a12, _ := new(fe12).rand(rand.Reader)
   246  	b12 := new(fe12).set(a12)
   247  	if !a12.equal(b12) {
   248  		t.Fatal("bad copy, 12")
   249  	}
   250  }