github.com/snowblossomcoin/go-ethereum@v1.9.25/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  
   108  func TestFieldElementHelpers(t *testing.T) {
   109  	// fe
   110  	zero := new(fe).zero()
   111  	if !zero.isZero() {
   112  		t.Fatal("'zero' is not zero")
   113  	}
   114  	one := new(fe).one()
   115  	if !one.isOne() {
   116  		t.Fatal("'one' is not one")
   117  	}
   118  	odd := new(fe).setBig(big.NewInt(1))
   119  	if !odd.isOdd() {
   120  		t.Fatal("1 must be odd")
   121  	}
   122  	if odd.isEven() {
   123  		t.Fatal("1 must not be even")
   124  	}
   125  	even := new(fe).setBig(big.NewInt(2))
   126  	if !even.isEven() {
   127  		t.Fatal("2 must be even")
   128  	}
   129  	if even.isOdd() {
   130  		t.Fatal("2 must not be odd")
   131  	}
   132  	// fe2
   133  	zero2 := new(fe2).zero()
   134  	if !zero2.isZero() {
   135  		t.Fatal("'zero' is not zero, 2")
   136  	}
   137  	one2 := new(fe2).one()
   138  	if !one2.isOne() {
   139  		t.Fatal("'one' is not one, 2")
   140  	}
   141  	// fe6
   142  	zero6 := new(fe6).zero()
   143  	if !zero6.isZero() {
   144  		t.Fatal("'zero' is not zero, 6")
   145  	}
   146  	one6 := new(fe6).one()
   147  	if !one6.isOne() {
   148  		t.Fatal("'one' is not one, 6")
   149  	}
   150  	// fe12
   151  	zero12 := new(fe12).zero()
   152  	if !zero12.isZero() {
   153  		t.Fatal("'zero' is not zero, 12")
   154  	}
   155  	one12 := new(fe12).one()
   156  	if !one12.isOne() {
   157  		t.Fatal("'one' is not one, 12")
   158  	}
   159  }
   160  
   161  func TestFieldElementSerialization(t *testing.T) {
   162  	t.Run("zero", func(t *testing.T) {
   163  		in := make([]byte, 48)
   164  		fe := new(fe).setBytes(in)
   165  		if !fe.isZero() {
   166  			t.Fatal("bad serialization")
   167  		}
   168  		if !bytes.Equal(in, fe.bytes()) {
   169  			t.Fatal("bad serialization")
   170  		}
   171  	})
   172  	t.Run("bytes", func(t *testing.T) {
   173  		for i := 0; i < fuz; i++ {
   174  			a, _ := new(fe).rand(rand.Reader)
   175  			b := new(fe).setBytes(a.bytes())
   176  			if !a.equal(b) {
   177  				t.Fatal("bad serialization")
   178  			}
   179  		}
   180  	})
   181  	t.Run("big", func(t *testing.T) {
   182  		for i := 0; i < fuz; i++ {
   183  			a, _ := new(fe).rand(rand.Reader)
   184  			b := new(fe).setBig(a.big())
   185  			if !a.equal(b) {
   186  				t.Fatal("bad encoding or decoding")
   187  			}
   188  		}
   189  	})
   190  	t.Run("string", func(t *testing.T) {
   191  		for i := 0; i < fuz; i++ {
   192  			a, _ := new(fe).rand(rand.Reader)
   193  			b, err := new(fe).setString(a.string())
   194  			if err != nil {
   195  				t.Fatal(err)
   196  			}
   197  			if !a.equal(b) {
   198  				t.Fatal("bad encoding or decoding")
   199  			}
   200  		}
   201  	})
   202  }
   203  
   204  func TestFieldElementByteInputs(t *testing.T) {
   205  	zero := new(fe).zero()
   206  	in := make([]byte, 0)
   207  	a := new(fe).setBytes(in)
   208  	if !a.equal(zero) {
   209  		t.Fatal("bad serialization")
   210  	}
   211  	in = make([]byte, 48)
   212  	a = new(fe).setBytes(in)
   213  	if !a.equal(zero) {
   214  		t.Fatal("bad serialization")
   215  	}
   216  	in = make([]byte, 64)
   217  	a = new(fe).setBytes(in)
   218  	if !a.equal(zero) {
   219  		t.Fatal("bad serialization")
   220  	}
   221  	in = make([]byte, 49)
   222  	in[47] = 1
   223  	normalOne := &fe{1, 0, 0, 0, 0, 0}
   224  	a = new(fe).setBytes(in)
   225  	if !a.equal(normalOne) {
   226  		t.Fatal("bad serialization")
   227  	}
   228  }
   229  
   230  func TestFieldElementCopy(t *testing.T) {
   231  	a, _ := new(fe).rand(rand.Reader)
   232  	b := new(fe).set(a)
   233  	if !a.equal(b) {
   234  		t.Fatal("bad copy, 1")
   235  	}
   236  	a2, _ := new(fe2).rand(rand.Reader)
   237  	b2 := new(fe2).set(a2)
   238  	if !a2.equal(b2) {
   239  		t.Fatal("bad copy, 2")
   240  	}
   241  	a6, _ := new(fe6).rand(rand.Reader)
   242  	b6 := new(fe6).set(a6)
   243  	if !a6.equal(b6) {
   244  		t.Fatal("bad copy, 6")
   245  	}
   246  	a12, _ := new(fe12).rand(rand.Reader)
   247  	b12 := new(fe12).set(a12)
   248  	if !a12.equal(b12) {
   249  		t.Fatal("bad copy, 12")
   250  	}
   251  }