g1_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. package bls12381
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "math/big"
  6. "testing"
  7. "github.com/ethereum/go-ethereum/common"
  8. )
  9. func (g *G1) one() *PointG1 {
  10. one, _ := g.fromBytesUnchecked(
  11. common.FromHex("" +
  12. "17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" +
  13. "08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1",
  14. ),
  15. )
  16. return one
  17. }
  18. func (g *G1) rand() *PointG1 {
  19. k, err := rand.Int(rand.Reader, q)
  20. if err != nil {
  21. panic(err)
  22. }
  23. return g.MulScalar(&PointG1{}, g.one(), k)
  24. }
  25. func TestG1Serialization(t *testing.T) {
  26. g1 := NewG1()
  27. for i := 0; i < fuz; i++ {
  28. a := g1.rand()
  29. buf := g1.ToBytes(a)
  30. b, err := g1.FromBytes(buf)
  31. if err != nil {
  32. t.Fatal(err)
  33. }
  34. if !g1.Equal(a, b) {
  35. t.Fatal("bad serialization from/to")
  36. }
  37. }
  38. for i := 0; i < fuz; i++ {
  39. a := g1.rand()
  40. encoded := g1.EncodePoint(a)
  41. b, err := g1.DecodePoint(encoded)
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. if !g1.Equal(a, b) {
  46. t.Fatal("bad serialization encode/decode")
  47. }
  48. }
  49. }
  50. func TestG1IsOnCurve(t *testing.T) {
  51. g := NewG1()
  52. zero := g.Zero()
  53. if !g.IsOnCurve(zero) {
  54. t.Fatal("zero must be on curve")
  55. }
  56. one := new(fe).one()
  57. p := &PointG1{*one, *one, *one}
  58. if g.IsOnCurve(p) {
  59. t.Fatal("(1, 1) is not on curve")
  60. }
  61. }
  62. func TestG1AdditiveProperties(t *testing.T) {
  63. g := NewG1()
  64. t0, t1 := g.New(), g.New()
  65. zero := g.Zero()
  66. for i := 0; i < fuz; i++ {
  67. a, b := g.rand(), g.rand()
  68. g.Add(t0, a, zero)
  69. if !g.Equal(t0, a) {
  70. t.Fatal("a + 0 == a")
  71. }
  72. g.Add(t0, zero, zero)
  73. if !g.Equal(t0, zero) {
  74. t.Fatal("0 + 0 == 0")
  75. }
  76. g.Sub(t0, a, zero)
  77. if !g.Equal(t0, a) {
  78. t.Fatal("a - 0 == a")
  79. }
  80. g.Sub(t0, zero, zero)
  81. if !g.Equal(t0, zero) {
  82. t.Fatal("0 - 0 == 0")
  83. }
  84. g.Neg(t0, zero)
  85. if !g.Equal(t0, zero) {
  86. t.Fatal("- 0 == 0")
  87. }
  88. g.Sub(t0, zero, a)
  89. g.Neg(t0, t0)
  90. if !g.Equal(t0, a) {
  91. t.Fatal(" - (0 - a) == a")
  92. }
  93. g.Double(t0, zero)
  94. if !g.Equal(t0, zero) {
  95. t.Fatal("2 * 0 == 0")
  96. }
  97. g.Double(t0, a)
  98. g.Sub(t0, t0, a)
  99. if !g.Equal(t0, a) || !g.IsOnCurve(t0) {
  100. t.Fatal(" (2 * a) - a == a")
  101. }
  102. g.Add(t0, a, b)
  103. g.Add(t1, b, a)
  104. if !g.Equal(t0, t1) {
  105. t.Fatal("a + b == b + a")
  106. }
  107. g.Sub(t0, a, b)
  108. g.Sub(t1, b, a)
  109. g.Neg(t1, t1)
  110. if !g.Equal(t0, t1) {
  111. t.Fatal("a - b == - ( b - a )")
  112. }
  113. c := g.rand()
  114. g.Add(t0, a, b)
  115. g.Add(t0, t0, c)
  116. g.Add(t1, a, c)
  117. g.Add(t1, t1, b)
  118. if !g.Equal(t0, t1) {
  119. t.Fatal("(a + b) + c == (a + c ) + b")
  120. }
  121. g.Sub(t0, a, b)
  122. g.Sub(t0, t0, c)
  123. g.Sub(t1, a, c)
  124. g.Sub(t1, t1, b)
  125. if !g.Equal(t0, t1) {
  126. t.Fatal("(a - b) - c == (a - c) -b")
  127. }
  128. }
  129. }
  130. func TestG1MultiplicativeProperties(t *testing.T) {
  131. g := NewG1()
  132. t0, t1 := g.New(), g.New()
  133. zero := g.Zero()
  134. for i := 0; i < fuz; i++ {
  135. a := g.rand()
  136. s1, s2, s3 := randScalar(q), randScalar(q), randScalar(q)
  137. sone := big.NewInt(1)
  138. g.MulScalar(t0, zero, s1)
  139. if !g.Equal(t0, zero) {
  140. t.Fatal(" 0 ^ s == 0")
  141. }
  142. g.MulScalar(t0, a, sone)
  143. if !g.Equal(t0, a) {
  144. t.Fatal(" a ^ 1 == a")
  145. }
  146. g.MulScalar(t0, zero, s1)
  147. if !g.Equal(t0, zero) {
  148. t.Fatal(" 0 ^ s == a")
  149. }
  150. g.MulScalar(t0, a, s1)
  151. g.MulScalar(t0, t0, s2)
  152. s3.Mul(s1, s2)
  153. g.MulScalar(t1, a, s3)
  154. if !g.Equal(t0, t1) {
  155. t.Errorf(" (a ^ s1) ^ s2 == a ^ (s1 * s2)")
  156. }
  157. g.MulScalar(t0, a, s1)
  158. g.MulScalar(t1, a, s2)
  159. g.Add(t0, t0, t1)
  160. s3.Add(s1, s2)
  161. g.MulScalar(t1, a, s3)
  162. if !g.Equal(t0, t1) {
  163. t.Errorf(" (a ^ s1) + (a ^ s2) == a ^ (s1 + s2)")
  164. }
  165. }
  166. }
  167. func TestG1MultiExpExpected(t *testing.T) {
  168. g := NewG1()
  169. one := g.one()
  170. var scalars [2]*big.Int
  171. var bases [2]*PointG1
  172. scalars[0] = big.NewInt(2)
  173. scalars[1] = big.NewInt(3)
  174. bases[0], bases[1] = new(PointG1).Set(one), new(PointG1).Set(one)
  175. expected, result := g.New(), g.New()
  176. g.MulScalar(expected, one, big.NewInt(5))
  177. _, _ = g.MultiExp(result, bases[:], scalars[:])
  178. if !g.Equal(expected, result) {
  179. t.Fatal("bad multi-exponentiation")
  180. }
  181. }
  182. func TestG1MultiExpBatch(t *testing.T) {
  183. g := NewG1()
  184. one := g.one()
  185. n := 1000
  186. bases := make([]*PointG1, n)
  187. scalars := make([]*big.Int, n)
  188. // scalars: [s0,s1 ... s(n-1)]
  189. // bases: [P0,P1,..P(n-1)] = [s(n-1)*G, s(n-2)*G ... s0*G]
  190. for i, j := 0, n-1; i < n; i, j = i+1, j-1 {
  191. scalars[j], _ = rand.Int(rand.Reader, big.NewInt(100000))
  192. bases[i] = g.New()
  193. g.MulScalar(bases[i], one, scalars[j])
  194. }
  195. // expected: s(n-1)*P0 + s(n-2)*P1 + s0*P(n-1)
  196. expected, tmp := g.New(), g.New()
  197. for i := 0; i < n; i++ {
  198. g.MulScalar(tmp, bases[i], scalars[i])
  199. g.Add(expected, expected, tmp)
  200. }
  201. result := g.New()
  202. _, _ = g.MultiExp(result, bases, scalars)
  203. if !g.Equal(expected, result) {
  204. t.Fatal("bad multi-exponentiation")
  205. }
  206. }
  207. func TestG1MapToCurve(t *testing.T) {
  208. for i, v := range []struct {
  209. u []byte
  210. expected []byte
  211. }{
  212. {
  213. u: make([]byte, 48),
  214. expected: common.FromHex("11a9a0372b8f332d5c30de9ad14e50372a73fa4c45d5f2fa5097f2d6fb93bcac592f2e1711ac43db0519870c7d0ea415" + "092c0f994164a0719f51c24ba3788de240ff926b55f58c445116e8bc6a47cd63392fd4e8e22bdf9feaa96ee773222133"),
  215. },
  216. {
  217. u: common.FromHex("07fdf49ea58e96015d61f6b5c9d1c8f277146a533ae7fbca2a8ef4c41055cd961fbc6e26979b5554e4b4f22330c0e16d"),
  218. expected: common.FromHex("1223effdbb2d38152495a864d78eee14cb0992d89a241707abb03819a91a6d2fd65854ab9a69e9aacb0cbebfd490732c" + "0f925d61e0b235ecd945cbf0309291878df0d06e5d80d6b84aa4ff3e00633b26f9a7cb3523ef737d90e6d71e8b98b2d5"),
  219. },
  220. {
  221. u: common.FromHex("1275ab3adbf824a169ed4b1fd669b49cf406d822f7fe90d6b2f8c601b5348436f89761bb1ad89a6fb1137cd91810e5d2"),
  222. expected: common.FromHex("179d3fd0b4fb1da43aad06cea1fb3f828806ddb1b1fa9424b1e3944dfdbab6e763c42636404017da03099af0dcca0fd6" + "0d037cb1c6d495c0f5f22b061d23f1be3d7fe64d3c6820cfcd99b6b36fa69f7b4c1f4addba2ae7aa46fb25901ab483e4"),
  223. },
  224. {
  225. u: common.FromHex("0e93d11d30de6d84b8578827856f5c05feef36083eef0b7b263e35ecb9b56e86299614a042e57d467fa20948e8564909"),
  226. expected: common.FromHex("15aa66c77eded1209db694e8b1ba49daf8b686733afaa7b68c683d0b01788dfb0617a2e2d04c0856db4981921d3004af" + "0952bb2f61739dd1d201dd0a79d74cda3285403d47655ee886afe860593a8a4e51c5b77a22d2133e3a4280eaaaa8b788"),
  227. },
  228. {
  229. u: common.FromHex("015a41481155d17074d20be6d8ec4d46632a51521cd9c916e265bd9b47343b3689979b50708c8546cbc2916b86cb1a3a"),
  230. expected: common.FromHex("06328ce5106e837935e8da84bd9af473422e62492930aa5f460369baad9545defa468d9399854c23a75495d2a80487ee" + "094bfdfe3e552447433b5a00967498a3f1314b86ce7a7164c8a8f4131f99333b30a574607e301d5f774172c627fd0bca"),
  231. },
  232. } {
  233. g := NewG1()
  234. p0, err := g.MapToCurve(v.u)
  235. if err != nil {
  236. t.Fatal("map to curve fails", i, err)
  237. }
  238. if !bytes.Equal(g.ToBytes(p0), v.expected) {
  239. t.Fatal("map to curve fails", i)
  240. }
  241. }
  242. }
  243. func BenchmarkG1Add(t *testing.B) {
  244. g1 := NewG1()
  245. a, b, c := g1.rand(), g1.rand(), PointG1{}
  246. t.ResetTimer()
  247. for i := 0; i < t.N; i++ {
  248. g1.Add(&c, a, b)
  249. }
  250. }
  251. func BenchmarkG1Mul(t *testing.B) {
  252. g1 := NewG1()
  253. a, e, c := g1.rand(), q, PointG1{}
  254. t.ResetTimer()
  255. for i := 0; i < t.N; i++ {
  256. g1.MulScalar(&c, a, e)
  257. }
  258. }
  259. func BenchmarkG1MapToCurve(t *testing.B) {
  260. a := make([]byte, 48)
  261. g1 := NewG1()
  262. t.ResetTimer()
  263. for i := 0; i < t.N; i++ {
  264. _, err := g1.MapToCurve(a)
  265. if err != nil {
  266. t.Fatal(err)
  267. }
  268. }
  269. }