github.com/jimmyx0x/go-ethereum@v1.10.28/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 }