field_element_test.go 4.8 KB

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