github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/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 }