zkevm-rom 0.0.1-security → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of zkevm-rom might be problematic. Click here for more details.

Files changed (232) hide show
  1. package/.eslintrc.js +33 -0
  2. package/.github/CODEOWNERS +14 -0
  3. package/.github/ISSUE_TEMPLATE/bug.yml +38 -0
  4. package/.github/ISSUE_TEMPLATE/feature.yml +26 -0
  5. package/.github/ISSUE_TEMPLATE/question.yml +26 -0
  6. package/.github/workflows/main.yaml +40 -0
  7. package/LICENSE +636 -0
  8. package/README.md +23 -5
  9. package/audits/Hexens_Polygon_zkEVM_PUBLIC_27.02.23.pdf +0 -0
  10. package/audits/Polygon-zkEVM-Public-v1.1-verichains-19-03-2024.pdf +0 -0
  11. package/audits/zkEVM-ROM-upgrade-1-Spearbit-30-May.pdf +0 -0
  12. package/audits/zkEVM-ROM-upgrade-2-Spearbit-21-August.pdf +0 -0
  13. package/audits/zkEVM-engagement-1-Spearbit-27-March.pdf +0 -0
  14. package/audits/zkEVM-engagement-2-Spearbit-27-March.pdf +0 -0
  15. package/audits/zkEVM-engagement-3-Spearbit-6-April.pdf +0 -0
  16. package/counters/README.md +45 -0
  17. package/counters/counters-executor.js +80 -0
  18. package/counters/countersConstants.zkasm +370 -0
  19. package/counters/endIncludes.zkasm +18 -0
  20. package/counters/initIncludes.zkasm +2 -0
  21. package/counters/tests/MLOAD32.zkasm +27 -0
  22. package/counters/tests/MLOADX.zkasm +30 -0
  23. package/counters/tests/MSTORE32.zkasm +32 -0
  24. package/counters/tests/MSTOREX.zkasm +36 -0
  25. package/counters/tests/SHLarith.zkasm +28 -0
  26. package/counters/tests/SHLarithBit.zkasm +28 -0
  27. package/counters/tests/SHRarith.zkasm +28 -0
  28. package/counters/tests/SHRarithBit.zkasm +28 -0
  29. package/counters/tests/abs.zkasm +29 -0
  30. package/counters/tests/addBatchHashByteByByte.zkasm +31 -0
  31. package/counters/tests/computeGasSendCall.zkasm +30 -0
  32. package/counters/tests/divArith.zkasm +27 -0
  33. package/counters/tests/expAD.zkasm +30 -0
  34. package/counters/tests/getLenBits.zkasm +30 -0
  35. package/counters/tests/getLenBytes.zkasm +32 -0
  36. package/counters/tests/isEmptyAccount.zkasm +30 -0
  37. package/counters/tests/mulARITH.zkasm +28 -0
  38. package/counters/tests/offsetUtil.zkasm +29 -0
  39. package/counters/tests/opADDMOD.zkasm +28 -0
  40. package/counters/tests/opAdd.zkasm +27 -0
  41. package/counters/tests/opBLOCKHASH.zkasm +28 -0
  42. package/counters/tests/opCALL.zkasm +41 -0
  43. package/counters/tests/opCALLCODE.zkasm +41 -0
  44. package/counters/tests/opCALLDATACOPY.zkasm +28 -0
  45. package/counters/tests/opCALLDATALOAD.zkasm +27 -0
  46. package/counters/tests/opCODECOPY.zkasm +28 -0
  47. package/counters/tests/opCREATE.zkasm +35 -0
  48. package/counters/tests/opCREATE2.zkasm +35 -0
  49. package/counters/tests/opDELEGATECALL.zkasm +35 -0
  50. package/counters/tests/opDIV.zkasm +27 -0
  51. package/counters/tests/opEXP.zkasm +29 -0
  52. package/counters/tests/opEXTCODECOPY.zkasm +29 -0
  53. package/counters/tests/opMOD.zkasm +27 -0
  54. package/counters/tests/opMUL.zkasm +27 -0
  55. package/counters/tests/opMULMOD.zkasm +28 -0
  56. package/counters/tests/opRETURN.zkasm +32 -0
  57. package/counters/tests/opRETURNDATACOPY.zkasm +29 -0
  58. package/counters/tests/opREVERT.zkasm +32 -0
  59. package/counters/tests/opSDIV.zkasm +28 -0
  60. package/counters/tests/opSHA3.zkasm +28 -0
  61. package/counters/tests/opSIGNEXTEND.zkasm +27 -0
  62. package/counters/tests/opSMOD.zkasm +28 -0
  63. package/counters/tests/opSTATICCALL.zkasm +35 -0
  64. package/counters/tests/opSUB.zkasm +27 -0
  65. package/counters/tests/saveMem.zkasm +31 -0
  66. package/docs/opcode-cost-zk-counters.md +315 -0
  67. package/docs/usage-ecrecover.md +51 -0
  68. package/index.js +43 -0
  69. package/main/block-info.zkasm +204 -0
  70. package/main/constants.zkasm +145 -0
  71. package/main/ecrecover/addFpEc.zkasm +31 -0
  72. package/main/ecrecover/checkSqrtFpEc.zkasm +1558 -0
  73. package/main/ecrecover/constEc.zkasm +13 -0
  74. package/main/ecrecover/ecrecover.zkasm +280 -0
  75. package/main/ecrecover/invFnEc.zkasm +44 -0
  76. package/main/ecrecover/invFpEc.zkasm +45 -0
  77. package/main/ecrecover/mulFnEc.zkasm +36 -0
  78. package/main/ecrecover/mulFpEc.zkasm +36 -0
  79. package/main/ecrecover/mulPointEc.zkasm +311 -0
  80. package/main/ecrecover/sqFpEc.zkasm +38 -0
  81. package/main/ecrecover/sqrtFpEc.zkasm +70 -0
  82. package/main/end.zkasm +4 -0
  83. package/main/l2-tx-hash.zkasm +159 -0
  84. package/main/load-change-l2-block-utils.zkasm +11 -0
  85. package/main/load-change-l2-block.zkasm +28 -0
  86. package/main/load-tx-rlp-utils.zkasm +72 -0
  87. package/main/load-tx-rlp.zkasm +431 -0
  88. package/main/main.zkasm +237 -0
  89. package/main/map-opcodes.zkasm +274 -0
  90. package/main/modexp/array_lib/array_add_AGTB.zkasm +123 -0
  91. package/main/modexp/array_lib/array_add_short.zkasm +85 -0
  92. package/main/modexp/array_lib/array_div.zkasm +215 -0
  93. package/main/modexp/array_lib/array_div_long.zkasm +284 -0
  94. package/main/modexp/array_lib/array_div_short.zkasm +222 -0
  95. package/main/modexp/array_lib/array_mul.zkasm +97 -0
  96. package/main/modexp/array_lib/array_mul_long.zkasm +156 -0
  97. package/main/modexp/array_lib/array_mul_short.zkasm +127 -0
  98. package/main/modexp/array_lib/array_square.zkasm +246 -0
  99. package/main/modexp/array_lib/unused/array_add.zkasm +100 -0
  100. package/main/modexp/array_lib/unused/array_is_odd.zkasm +23 -0
  101. package/main/modexp/array_lib/unused/array_is_one.zkasm +33 -0
  102. package/main/modexp/array_lib/unused/array_is_zero.zkasm +34 -0
  103. package/main/modexp/array_lib/unused/array_sub_AGTB.zkasm +111 -0
  104. package/main/modexp/array_lib/unused/array_unshift.zkasm +37 -0
  105. package/main/modexp/array_lib/utils/array_compare.zkasm +82 -0
  106. package/main/modexp/array_lib/utils/array_trim.zkasm +49 -0
  107. package/main/modexp/constants.zkasm +5 -0
  108. package/main/modexp/modexp.zkasm +296 -0
  109. package/main/modexp/modexp_utils.zkasm +230 -0
  110. package/main/opcodes/arithmetic.zkasm +357 -0
  111. package/main/opcodes/block.zkasm +163 -0
  112. package/main/opcodes/calldata-returndata-code.zkasm +619 -0
  113. package/main/opcodes/comparison.zkasm +446 -0
  114. package/main/opcodes/context-information.zkasm +169 -0
  115. package/main/opcodes/create-terminate-context.zkasm +1011 -0
  116. package/main/opcodes/crypto.zkasm +96 -0
  117. package/main/opcodes/flow-control.zkasm +126 -0
  118. package/main/opcodes/logs.zkasm +193 -0
  119. package/main/opcodes/stack-operations.zkasm +658 -0
  120. package/main/opcodes/storage-memory.zkasm +313 -0
  121. package/main/pairings/BN254/addPointBN254.zkasm +245 -0
  122. package/main/pairings/BN254/ecAdd.zkasm +312 -0
  123. package/main/pairings/BN254/ecMul.zkasm +159 -0
  124. package/main/pairings/BN254/escalarMulBN254.zkasm +155 -0
  125. package/main/pairings/BN254/lineDiffPointsBN254.zkasm +83 -0
  126. package/main/pairings/BN254/lineSamePointsBN254.zkasm +96 -0
  127. package/main/pairings/FP12BN254/CYCLOFP12BN254/compressFp12BN254.zkasm +49 -0
  128. package/main/pairings/FP12BN254/CYCLOFP12BN254/decompressFp12BN254.zkasm +236 -0
  129. package/main/pairings/FP12BN254/CYCLOFP12BN254/expByXCompCycloFp12BN254.zkasm +444 -0
  130. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCompCycloFp12BN254.zkasm +212 -0
  131. package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCycloFp12BN254.zkasm +228 -0
  132. package/main/pairings/FP12BN254/CYCLOFP12BN254/xBinDecompBN254.zkasm +64 -0
  133. package/main/pairings/FP12BN254/frob2Fp12BN254.zkasm +80 -0
  134. package/main/pairings/FP12BN254/frob3Fp12BN254.zkasm +96 -0
  135. package/main/pairings/FP12BN254/frobFp12BN254.zkasm +96 -0
  136. package/main/pairings/FP12BN254/inverseFp12BN254.zkasm +289 -0
  137. package/main/pairings/FP12BN254/mulFp12BN254.zkasm +408 -0
  138. package/main/pairings/FP12BN254/sparseMulAFp12BN254.zkasm +296 -0
  139. package/main/pairings/FP12BN254/sparseMulBFp12BN254.zkasm +291 -0
  140. package/main/pairings/FP12BN254/squareFp12BN254.zkasm +376 -0
  141. package/main/pairings/FP2BN254/addFp2BN254.zkasm +19 -0
  142. package/main/pairings/FP2BN254/escalarMulFp2BN254.zkasm +20 -0
  143. package/main/pairings/FP2BN254/invFp2BN254.zkasm +66 -0
  144. package/main/pairings/FP2BN254/mulFp2BN254.zkasm +19 -0
  145. package/main/pairings/FP2BN254/squareFp2BN254.zkasm +21 -0
  146. package/main/pairings/FP2BN254/subFp2BN254.zkasm +19 -0
  147. package/main/pairings/FP4BN254/squareFp4BN254.zkasm +76 -0
  148. package/main/pairings/FP6BN254/addFp6BN254.zkasm +59 -0
  149. package/main/pairings/FP6BN254/escalarMulFp6BN254.zkasm +51 -0
  150. package/main/pairings/FP6BN254/inverseFp6BN254.zkasm +208 -0
  151. package/main/pairings/FP6BN254/mulFp6BN254.zkasm +201 -0
  152. package/main/pairings/FP6BN254/sparseMulAFp6BN254.zkasm +65 -0
  153. package/main/pairings/FP6BN254/sparseMulBFp6BN254.zkasm +134 -0
  154. package/main/pairings/FP6BN254/sparseMulCFp6BN254.zkasm +128 -0
  155. package/main/pairings/FP6BN254/squareFp6BN254.zkasm +147 -0
  156. package/main/pairings/FP6BN254/subFp6BN254.zkasm +59 -0
  157. package/main/pairings/FPBN254/addFpBN254.zkasm +29 -0
  158. package/main/pairings/FPBN254/invFpBN254.zkasm +55 -0
  159. package/main/pairings/FPBN254/mulFpBN254.zkasm +29 -0
  160. package/main/pairings/FPBN254/reduceFpBN254.zkasm +25 -0
  161. package/main/pairings/FPBN254/squareFpBN254.zkasm +31 -0
  162. package/main/pairings/FPBN254/subFpBN254.zkasm +36 -0
  163. package/main/pairings/FRBN254/reduceFrBN254.zkasm +25 -0
  164. package/main/pairings/constants.zkasm +62 -0
  165. package/main/pairings/ecPairing.zkasm +244 -0
  166. package/main/pairings/finalExpBN254.zkasm +2095 -0
  167. package/main/pairings/halfPairingBN254.zkasm +428 -0
  168. package/main/pairings/loopLengthBN254.zkasm +75 -0
  169. package/main/pairings/millerLoopBN254.zkasm +741 -0
  170. package/main/pairings/pairingBN254.zkasm +481 -0
  171. package/main/pairings/unused/addFp12BN254.zkasm +130 -0
  172. package/main/pairings/unused/expByXCycloFp12BN254.zkasm +411 -0
  173. package/main/pairings/unused/expFp12BN254.zkasm +333 -0
  174. package/main/pairings/unused/subFp12BN254.zkasm +130 -0
  175. package/main/pairings/unused/xPseudoBinDecompBN254.zkasm +68 -0
  176. package/main/pairings/utilsTests/expCycloFp12BN254.zkasm +334 -0
  177. package/main/precompiled/end.zkasm +42 -0
  178. package/main/precompiled/identity.zkasm +99 -0
  179. package/main/precompiled/pre-ecAdd.zkasm +84 -0
  180. package/main/precompiled/pre-ecMul.zkasm +82 -0
  181. package/main/precompiled/pre-ecPairing.zkasm +72 -0
  182. package/main/precompiled/pre-ecrecover.zkasm +71 -0
  183. package/main/precompiled/pre-modexp.zkasm +367 -0
  184. package/main/precompiled/pre-sha2-256.zkasm +125 -0
  185. package/main/precompiled/revert-precompiled.zkasm +25 -0
  186. package/main/precompiled/selector.zkasm +77 -0
  187. package/main/process-change-l2-block.zkasm +147 -0
  188. package/main/process-tx.zkasm +587 -0
  189. package/main/tables/2-exp.zkasm +260 -0
  190. package/main/touched.zkasm +118 -0
  191. package/main/utils.zkasm +2335 -0
  192. package/main/vars.zkasm +117 -0
  193. package/package.json +62 -3
  194. package/test/bytes-length.zkasm +39 -0
  195. package/test/ecrecover.zkasm +538 -0
  196. package/test/lt4-test.zkasm +38 -0
  197. package/test/mstorex.zkasm +191 -0
  198. package/test/opcalldatacopy.ignore.zkasm +331 -0
  199. package/test/performance/read-push.zkasm +71 -0
  200. package/test/read-push.zkasm +304 -0
  201. package/test/testArrayArith.zkasm +1099 -0
  202. package/test/testArrayUtils.zkasm +335 -0
  203. package/test/testCycloFp12ArithBN254.zkasm +548 -0
  204. package/test/testEcAdd.zkasm +252 -0
  205. package/test/testEcMul.zkasm +231 -0
  206. package/test/testEcPairing.zkasm +436 -0
  207. package/test/testFinalExpBn254.zkasm +139 -0
  208. package/test/testFp12ArithBN254.zkasm +692 -0
  209. package/test/testFp2ArithBN254.zkasm +185 -0
  210. package/test/testFp4ArithBN254.zkasm +128 -0
  211. package/test/testFp6ArithBN254.zkasm +260 -0
  212. package/test/testFpArithBN254.zkasm +159 -0
  213. package/test/testFrArithBN254.zkasm +113 -0
  214. package/test/testHalfPairingBN254.zkasm +285 -0
  215. package/test/testModExp.zkasm +586 -0
  216. package/test/testModExpReturn.zkasm +81 -0
  217. package/test/testPairingBN254.zkasm +463 -0
  218. package/test/testPointArithBN254.zkasm +270 -0
  219. package/test/testSHA256.zkasm +27 -0
  220. package/test/touched-assert.zkasm +59 -0
  221. package/test/utils-expAD.zkasm +48 -0
  222. package/test/utils-getLenBytes.zkasm +36 -0
  223. package/tools/audit-tools/registry-op-checker.js +71 -0
  224. package/tools/get-not-used-labels.js +31 -0
  225. package/tools/helpers/helpers.js +47 -0
  226. package/tools/modexp-utils/README.md +5 -0
  227. package/tools/modexp-utils/modexp-test-gen.js +168 -0
  228. package/tools/modexp-utils/modexp-test-int.sage +37 -0
  229. package/tools/parallel-testing/checker.sh +6 -0
  230. package/tools/parallel-testing/gen-parallel-tests.js +78 -0
  231. package/tools/parallel-testing/parallel-tests-sample/sample.test.js +136 -0
  232. package/tools/run-tests-zkasm.js +83 -0
@@ -0,0 +1,128 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; sparseMulCFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²),(b1 + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = a1·b1 + a2·b3·(9+u)
8
+ ;; - c2 = a2·b1 + a3·b3·(9+u)
9
+ ;; - c3 = (a1 + a3)·(b1 + b3) - a1·b1 - a3·b3
10
+ ;;
11
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
+
13
+ VAR GLOBAL sparseMulCFp6BN254_a1_x
14
+ VAR GLOBAL sparseMulCFp6BN254_a1_y
15
+ VAR GLOBAL sparseMulCFp6BN254_a2_x
16
+ VAR GLOBAL sparseMulCFp6BN254_a2_y
17
+ VAR GLOBAL sparseMulCFp6BN254_a3_x
18
+ VAR GLOBAL sparseMulCFp6BN254_a3_y
19
+
20
+ VAR GLOBAL sparseMulCFp6BN254_b1_x
21
+ VAR GLOBAL sparseMulCFp6BN254_b1_y
22
+ VAR GLOBAL sparseMulCFp6BN254_b3_x
23
+ VAR GLOBAL sparseMulCFp6BN254_b3_y
24
+
25
+ VAR GLOBAL sparseMulCFp6BN254_c1_x
26
+ VAR GLOBAL sparseMulCFp6BN254_c1_y
27
+ VAR GLOBAL sparseMulCFp6BN254_c2_x
28
+ VAR GLOBAL sparseMulCFp6BN254_c2_y
29
+ VAR GLOBAL sparseMulCFp6BN254_c3_x
30
+ VAR GLOBAL sparseMulCFp6BN254_c3_y
31
+
32
+ VAR GLOBAL sparseMulCFp6BN254_a1b1_x
33
+ VAR GLOBAL sparseMulCFp6BN254_a1b1_y
34
+ VAR GLOBAL sparseMulCFp6BN254_a3b3_x
35
+ VAR GLOBAL sparseMulCFp6BN254_a3b3_y
36
+ VAR GLOBAL sparseMulCFp6BN254_a2b1_x
37
+ VAR GLOBAL sparseMulCFp6BN254_a2b1_y
38
+ VAR GLOBAL sparseMulCFp6BN254_a1a3sum_x
39
+ VAR GLOBAL sparseMulCFp6BN254_a1a3sum_y
40
+
41
+ VAR GLOBAL sparseMulCFp6BN254_RR
42
+
43
+ sparseMulCFp6BN254:
44
+ RR :MSTORE(sparseMulCFp6BN254_RR)
45
+
46
+ ; 1] a1·b1, a3·b3
47
+ $ => A :MLOAD(sparseMulCFp6BN254_a1_x)
48
+ $ => B :MLOAD(sparseMulCFp6BN254_a1_y)
49
+ $ => C :MLOAD(sparseMulCFp6BN254_b1_x)
50
+ $ => D :MLOAD(sparseMulCFp6BN254_b1_y), CALL(mulFp2BN254)
51
+ E :MSTORE(sparseMulCFp6BN254_a1b1_x)
52
+ C :MSTORE(sparseMulCFp6BN254_a1b1_y)
53
+
54
+ $ => A :MLOAD(sparseMulCFp6BN254_a3_x)
55
+ $ => B :MLOAD(sparseMulCFp6BN254_a3_y)
56
+ $ => C :MLOAD(sparseMulCFp6BN254_b3_x)
57
+ $ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(mulFp2BN254)
58
+ E :MSTORE(sparseMulCFp6BN254_a3b3_x)
59
+ C :MSTORE(sparseMulCFp6BN254_a3b3_y)
60
+
61
+ ; 2] c1 = a1·b1 + a2·b3·(9+u)
62
+ $ => A :MLOAD(sparseMulCFp6BN254_a2_x)
63
+ $ => B :MLOAD(sparseMulCFp6BN254_a2_y)
64
+ $ => C :MLOAD(sparseMulCFp6BN254_b3_x)
65
+ $ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(mulFp2BN254)
66
+ E => A
67
+ C => B
68
+ 9n => C
69
+ 1n => D :CALL(mulFp2BN254)
70
+
71
+ E => A
72
+ C => B
73
+ $ => C :MLOAD(sparseMulCFp6BN254_a1b1_x)
74
+ $ => D :MLOAD(sparseMulCFp6BN254_a1b1_y), CALL(addFp2BN254)
75
+ E :MSTORE(sparseMulCFp6BN254_c1_x)
76
+ C :MSTORE(sparseMulCFp6BN254_c1_y)
77
+
78
+ ; 3] c2 = a2·b1 + a3·b3·(9+u)
79
+ $ => A :MLOAD(sparseMulCFp6BN254_a2_x)
80
+ $ => B :MLOAD(sparseMulCFp6BN254_a2_y)
81
+ $ => C :MLOAD(sparseMulCFp6BN254_b1_x)
82
+ $ => D :MLOAD(sparseMulCFp6BN254_b1_y), CALL(mulFp2BN254)
83
+ E :MSTORE(sparseMulCFp6BN254_a2b1_x)
84
+ C :MSTORE(sparseMulCFp6BN254_a2b1_y)
85
+
86
+ $ => A :MLOAD(sparseMulCFp6BN254_a3b3_x)
87
+ $ => B :MLOAD(sparseMulCFp6BN254_a3b3_y)
88
+ 9n => C
89
+ 1n => D :CALL(mulFp2BN254)
90
+
91
+ E => A
92
+ C => B
93
+ $ => C :MLOAD(sparseMulCFp6BN254_a2b1_x)
94
+ $ => D :MLOAD(sparseMulCFp6BN254_a2b1_y), CALL(addFp2BN254)
95
+ E :MSTORE(sparseMulCFp6BN254_c2_x)
96
+ C :MSTORE(sparseMulCFp6BN254_c2_y)
97
+
98
+
99
+ ; 4] c3 = (a1 + a3)·(b1 + b3) - a1·b1 - a3·b3
100
+ $ => A :MLOAD(sparseMulCFp6BN254_a1_x)
101
+ $ => B :MLOAD(sparseMulCFp6BN254_a1_y)
102
+ $ => C :MLOAD(sparseMulCFp6BN254_a3_x)
103
+ $ => D :MLOAD(sparseMulCFp6BN254_a3_y), CALL(addFp2BN254)
104
+ E :MSTORE(sparseMulCFp6BN254_a1a3sum_x)
105
+ C :MSTORE(sparseMulCFp6BN254_a1a3sum_y)
106
+
107
+ $ => A :MLOAD(sparseMulCFp6BN254_b1_x)
108
+ $ => B :MLOAD(sparseMulCFp6BN254_b1_y)
109
+ $ => C :MLOAD(sparseMulCFp6BN254_b3_x)
110
+ $ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(addFp2BN254)
111
+ E => A
112
+ C => B
113
+ $ => C :MLOAD(sparseMulCFp6BN254_a1a3sum_x)
114
+ $ => D :MLOAD(sparseMulCFp6BN254_a1a3sum_y), CALL(mulFp2BN254)
115
+ E => A
116
+ C => B
117
+ $ => C :MLOAD(sparseMulCFp6BN254_a1b1_x)
118
+ $ => D :MLOAD(sparseMulCFp6BN254_a1b1_y), CALL(subFp2BN254)
119
+ E => A
120
+ C => B
121
+ $ => C :MLOAD(sparseMulCFp6BN254_a3b3_x)
122
+ $ => D :MLOAD(sparseMulCFp6BN254_a3b3_y), CALL(subFp2BN254)
123
+ E :MSTORE(sparseMulCFp6BN254_c3_x)
124
+ C :MSTORE(sparseMulCFp6BN254_c3_y)
125
+
126
+
127
+ $ => RR :MLOAD(sparseMulCFp6BN254_RR)
128
+ :RETURN
@@ -0,0 +1,147 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; squareFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²) ∈ Fp6, where ai ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = 2·a2·a3·(9 + u) + a1²
8
+ ;; - c2 = a3²·(9 + u) + 2·a1·a2
9
+ ;; - c3 = 2·a1·a2 - a3² + (a1 - a2 + a3)² + 2·a2·a3 - a1²
10
+ ;;
11
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
+
13
+ VAR GLOBAL squareFp6BN254_a1_x
14
+ VAR GLOBAL squareFp6BN254_a1_y
15
+ VAR GLOBAL squareFp6BN254_a2_x
16
+ VAR GLOBAL squareFp6BN254_a2_y
17
+ VAR GLOBAL squareFp6BN254_a3_x
18
+ VAR GLOBAL squareFp6BN254_a3_y
19
+ VAR GLOBAL squareFp6BN254_c1_x
20
+ VAR GLOBAL squareFp6BN254_c1_y
21
+ VAR GLOBAL squareFp6BN254_c2_x
22
+ VAR GLOBAL squareFp6BN254_c2_y
23
+ VAR GLOBAL squareFp6BN254_c3_x
24
+ VAR GLOBAL squareFp6BN254_c3_y
25
+
26
+ VAR GLOBAL squareFp6BN254_2a1a2mul_x
27
+ VAR GLOBAL squareFp6BN254_2a1a2mul_y
28
+ VAR GLOBAL squareFp6BN254_a3square_x
29
+ VAR GLOBAL squareFp6BN254_a3square_y
30
+ VAR GLOBAL squareFp6BN254_2a1a2a3sqsub_x
31
+ VAR GLOBAL squareFp6BN254_2a1a2a3sqsub_y
32
+ VAR GLOBAL squareFp6BN254_a1square_x
33
+ VAR GLOBAL squareFp6BN254_a1square_y
34
+ VAR GLOBAL squareFp6BN254_a1a2a3sub_x
35
+ VAR GLOBAL squareFp6BN254_a1a2a3sub_y
36
+ VAR GLOBAL squareFp6BN254_2a2a3mul_x
37
+ VAR GLOBAL squareFp6BN254_2a2a3mul_y
38
+
39
+ VAR GLOBAL squareFp6BN254_RR
40
+
41
+ squareFp6BN254:
42
+ RR :MSTORE(squareFp6BN254_RR)
43
+
44
+ ; 1] 2·a1·a2
45
+ $ => A :MLOAD(squareFp6BN254_a1_x)
46
+ $ => B :MLOAD(squareFp6BN254_a1_y)
47
+ $ => C :MLOAD(squareFp6BN254_a2_x)
48
+ $ => D :MLOAD(squareFp6BN254_a2_y), CALL(mulFp2BN254)
49
+ 2n => A
50
+ C => D
51
+ E => C :CALL(escalarMulFp2BN254)
52
+
53
+ E :MSTORE(squareFp6BN254_2a1a2mul_x)
54
+ C :MSTORE(squareFp6BN254_2a1a2mul_y)
55
+
56
+ ; 2] a3²
57
+ $ => A :MLOAD(squareFp6BN254_a3_x)
58
+ $ => B :MLOAD(squareFp6BN254_a3_y), CALL(squareFp2BN254)
59
+ E :MSTORE(squareFp6BN254_a3square_x)
60
+ C :MSTORE(squareFp6BN254_a3square_y)
61
+
62
+ ; 3] c2 = a3²·(9 + u) + 2·a1·a2
63
+ $ => A :MLOAD(squareFp6BN254_a3square_x)
64
+ $ => B :MLOAD(squareFp6BN254_a3square_y)
65
+ 9n => C
66
+ 1n => D :CALL(mulFp2BN254)
67
+
68
+ $ => A :MLOAD(squareFp6BN254_2a1a2mul_x)
69
+ $ => B :MLOAD(squareFp6BN254_2a1a2mul_y)
70
+ C => D
71
+ E => C :CALL(addFp2BN254)
72
+
73
+ E :MSTORE(squareFp6BN254_c2_x)
74
+ C :MSTORE(squareFp6BN254_c2_y)
75
+
76
+ ; 4] 2·a1·a2 - a3²
77
+ $ => A :MLOAD(squareFp6BN254_2a1a2mul_x)
78
+ $ => B :MLOAD(squareFp6BN254_2a1a2mul_y)
79
+ $ => C :MLOAD(squareFp6BN254_a3square_x)
80
+ $ => D :MLOAD(squareFp6BN254_a3square_y), CALL(subFp2BN254)
81
+ E :MSTORE(squareFp6BN254_2a1a2a3sqsub_x)
82
+ C :MSTORE(squareFp6BN254_2a1a2a3sqsub_y)
83
+
84
+ ; 5] a1²
85
+ $ => A :MLOAD(squareFp6BN254_a1_x)
86
+ $ => B :MLOAD(squareFp6BN254_a1_y), CALL(squareFp2BN254)
87
+ E :MSTORE(squareFp6BN254_a1square_x)
88
+ C :MSTORE(squareFp6BN254_a1square_y)
89
+
90
+ ; 6] (a1 - a2 + a3)²
91
+ $ => A :MLOAD(squareFp6BN254_a1_x)
92
+ $ => B :MLOAD(squareFp6BN254_a1_y)
93
+ $ => C :MLOAD(squareFp6BN254_a2_x)
94
+ $ => D :MLOAD(squareFp6BN254_a2_y), CALL(subFp2BN254)
95
+ E => A
96
+ C => B
97
+ $ => C :MLOAD(squareFp6BN254_a3_x)
98
+ $ => D :MLOAD(squareFp6BN254_a3_y), CALL(addFp2BN254)
99
+ E => A
100
+ C => B :CALL(squareFp2BN254)
101
+
102
+ E :MSTORE(squareFp6BN254_a1a2a3sub_x)
103
+ C :MSTORE(squareFp6BN254_a1a2a3sub_y)
104
+
105
+ ; 7] 2·a2·a3
106
+ $ => A :MLOAD(squareFp6BN254_a2_x)
107
+ $ => B :MLOAD(squareFp6BN254_a2_y)
108
+ $ => C :MLOAD(squareFp6BN254_a3_x)
109
+ $ => D :MLOAD(squareFp6BN254_a3_y), CALL(mulFp2BN254)
110
+ 2n => A
111
+ C => D
112
+ E => C :CALL(escalarMulFp2BN254)
113
+
114
+ E :MSTORE(squareFp6BN254_2a2a3mul_x)
115
+ C :MSTORE(squareFp6BN254_2a2a3mul_y)
116
+
117
+ ; 8] c1 = 2·a2·a3·(9 + u) + a1²
118
+ $ => A :MLOAD(squareFp6BN254_2a2a3mul_x)
119
+ $ => B :MLOAD(squareFp6BN254_2a2a3mul_y)
120
+ 9n => C
121
+ 1n => D :CALL(mulFp2BN254)
122
+
123
+ E => A
124
+ C => B
125
+ $ => C :MLOAD(squareFp6BN254_a1square_x)
126
+ $ => D :MLOAD(squareFp6BN254_a1square_y), CALL(addFp2BN254)
127
+ E :MSTORE(squareFp6BN254_c1_x)
128
+ C :MSTORE(squareFp6BN254_c1_y)
129
+
130
+ ; 9] c3 = 2·a1·a2 - a3² + (a1 - a2 + a3)² + 2·a2·a3 - a1²
131
+ $ => A :MLOAD(squareFp6BN254_2a1a2a3sqsub_x)
132
+ $ => B :MLOAD(squareFp6BN254_2a1a2a3sqsub_y)
133
+ $ => C :MLOAD(squareFp6BN254_a1a2a3sub_x)
134
+ $ => D :MLOAD(squareFp6BN254_a1a2a3sub_y), CALL(addFp2BN254)
135
+ E => A
136
+ C => B
137
+ $ => C :MLOAD(squareFp6BN254_2a2a3mul_x)
138
+ $ => D :MLOAD(squareFp6BN254_2a2a3mul_y), CALL(addFp2BN254)
139
+ E => A
140
+ C => B
141
+ $ => C :MLOAD(squareFp6BN254_a1square_x)
142
+ $ => D :MLOAD(squareFp6BN254_a1square_y), CALL(subFp2BN254)
143
+ E :MSTORE(squareFp6BN254_c3_x)
144
+ C :MSTORE(squareFp6BN254_c3_y)
145
+
146
+ $ => RR :MLOAD(squareFp6BN254_RR)
147
+ :RETURN
@@ -0,0 +1,59 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; subFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²),(b1 + b2·v + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) = (a1-b1) + (a2-b2)·v + (a3-b3)·v² ∈ Fp6
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL subFp6BN254_a1_x
11
+ VAR GLOBAL subFp6BN254_a1_y
12
+ VAR GLOBAL subFp6BN254_a2_x
13
+ VAR GLOBAL subFp6BN254_a2_y
14
+ VAR GLOBAL subFp6BN254_a3_x
15
+ VAR GLOBAL subFp6BN254_a3_y
16
+ VAR GLOBAL subFp6BN254_b1_x
17
+ VAR GLOBAL subFp6BN254_b1_y
18
+ VAR GLOBAL subFp6BN254_b2_x
19
+ VAR GLOBAL subFp6BN254_b2_y
20
+ VAR GLOBAL subFp6BN254_b3_x
21
+ VAR GLOBAL subFp6BN254_b3_y
22
+ VAR GLOBAL subFp6BN254_c1_x
23
+ VAR GLOBAL subFp6BN254_c1_y
24
+ VAR GLOBAL subFp6BN254_c2_x
25
+ VAR GLOBAL subFp6BN254_c2_y
26
+ VAR GLOBAL subFp6BN254_c3_x
27
+ VAR GLOBAL subFp6BN254_c3_y
28
+
29
+ VAR GLOBAL subFp6BN254_RR
30
+
31
+ subFp6BN254:
32
+ RR :MSTORE(subFp6BN254_RR)
33
+
34
+ ; 1] c1 = a1-b1
35
+ $ => A :MLOAD(subFp6BN254_a1_x)
36
+ $ => B :MLOAD(subFp6BN254_a1_y)
37
+ $ => C :MLOAD(subFp6BN254_b1_x)
38
+ $ => D :MLOAD(subFp6BN254_b1_y), CALL(subFp2BN254)
39
+ E :MSTORE(subFp6BN254_c1_x)
40
+ C :MSTORE(subFp6BN254_c1_y)
41
+
42
+ ; 2] c2 = a2-b2
43
+ $ => A :MLOAD(subFp6BN254_a2_x)
44
+ $ => B :MLOAD(subFp6BN254_a2_y)
45
+ $ => C :MLOAD(subFp6BN254_b2_x)
46
+ $ => D :MLOAD(subFp6BN254_b2_y), CALL(subFp2BN254)
47
+ E :MSTORE(subFp6BN254_c2_x)
48
+ C :MSTORE(subFp6BN254_c2_y)
49
+
50
+ ; 3] c3 = a3-b3
51
+ $ => A :MLOAD(subFp6BN254_a3_x)
52
+ $ => B :MLOAD(subFp6BN254_a3_y)
53
+ $ => C :MLOAD(subFp6BN254_b3_x)
54
+ $ => D :MLOAD(subFp6BN254_b3_y), CALL(subFp2BN254)
55
+ E :MSTORE(subFp6BN254_c3_x)
56
+ C :MSTORE(subFp6BN254_c3_y)
57
+
58
+ $ => RR :MLOAD(subFp6BN254_RR)
59
+ :RETURN
@@ -0,0 +1,29 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; addFpBN254:
5
+ ;; in: A,C ∈ Fp
6
+ ;; out: C = A + C (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ addFpBN254:
11
+ ; 1] Compute and check the sum over Z
12
+ ; A·[1] + C = [D]·2²⁵⁶ + [E]
13
+ 1 => B
14
+ $${var _addFpBN254_AC = A + C}
15
+ ${_addFpBN254_AC >> 256} => D
16
+ ${_addFpBN254_AC} => E :ARITH
17
+
18
+ ; 2] Check it over Fp, that is, it must be satisfied that:
19
+ ; [BN254_P]·[(A+C) / p] + [(A+C) % p] = D·2²⁵⁶ + E
20
+ ; where C < BN254_P
21
+ %BN254_P => A
22
+ ${_addFpBN254_AC / const.BN254_P} => B ; quotient (256 bits)
23
+ ${_addFpBN254_AC % const.BN254_P} => C ; residue (256 bits)
24
+ E :ARITH
25
+
26
+ ; 3] Check that the result is lower than BN254_P
27
+ A => B
28
+ C => A
29
+ 1 :LT, RETURN
@@ -0,0 +1,55 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; invFpBN254:
5
+ ;; in: A ∈ Fp
6
+ ;; out: B = A⁻¹ (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;; NOTE: On input 0, it returns 0
9
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
+
11
+ VAR GLOBAL invFpBN254_tmp
12
+ VAR GLOBAL invFpBN254_RR
13
+
14
+ invFpBN254:
15
+ RR :MSTORE(invFpBN254_RR)
16
+
17
+ ; Normalization of A
18
+ %BN254_P => B
19
+ $ :LT, JMPC(invFpBN254_zero_check)
20
+ :CALL(reduceFpBN254)
21
+ ; From here, it is guaranteed that A ∈ [0,BN254_P)
22
+
23
+ invFpBN254_zero_check:
24
+ ; Check if A = 0, and if so, return 0
25
+ 0 => B
26
+ $ :EQ, JMPC(invFpBN254_A_is_zero)
27
+
28
+ invFpBN254_normalized:
29
+ ; 1] Compute and check the inverse over Z
30
+ ; A·A⁻¹ + [0] = [D]·2²⁵⁶ + [E]
31
+ 0 => C
32
+ ${var _invFpBN254_A = fpBN254inv(A)} => B :MSTORE(invFpBN254_tmp);
33
+ $${var _invFpBN254_AB = A * _invFpBN254_A}
34
+ ${_invFpBN254_AB >> 256} => D
35
+ ${_invFpBN254_AB} => E :ARITH
36
+
37
+ ; 2] Check it over Fp, that is, it must be satisfied that:
38
+ ; [BN254_P]·[(A·A⁻¹) / BN254_P] + [1] = D·2²⁵⁶ + E
39
+ %BN254_P => A
40
+ ${_invFpBN254_AB / const.BN254_P} => B ; quotient (256 bits)
41
+ 1n => C ; residue (1 bit)
42
+ E :ARITH
43
+
44
+ ; 3] Check that the result is lower than BN254_P
45
+ A => B
46
+ $ => A :MLOAD(invFpBN254_tmp)
47
+ 1 :LT
48
+ A => B :JMP(invFpBN254_end)
49
+
50
+ invFpBN254_A_is_zero:
51
+ 0 => B
52
+
53
+ invFpBN254_end:
54
+ $ => RR :MLOAD(invFpBN254_RR)
55
+ :RETURN
@@ -0,0 +1,29 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; mulFpBN254:
5
+ ;; in: A,B ∈ Fp
6
+ ;; out: C = A·B (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ mulFpBN254:
11
+ ; 1] Compute and check the sum over Z
12
+ ; A·B + [0] = [D]·2²⁵⁶ + [E]
13
+ 0 => C
14
+ $${var _mulFpBN254_AB = A*B}
15
+ ${_mulFpBN254_AB >> 256} => D
16
+ ${_mulFpBN254_AB} => E :ARITH
17
+
18
+ ; 2] Check it over Fp, that is, it must be satisfied that:
19
+ ; [BN254_P]·[(A·B) / p] + [C / p] = D·2²⁵⁶ + E
20
+ ; where C < BN254_P
21
+ %BN254_P => A
22
+ ${_mulFpBN254_AB / const.BN254_P} => B ; quotient (256 bits)
23
+ ${_mulFpBN254_AB % const.BN254_P} => C ; residue (256 bits)
24
+ E :ARITH
25
+
26
+ ; 3] Check that the result is lower than BN254_P
27
+ A => B
28
+ C => A
29
+ 1 :LT, RETURN
@@ -0,0 +1,25 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; reduceFpBN254:
5
+ ;; in: A ∈ [0, 2²⁵⁶-1]
6
+ ;; out: A (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL reduceFpBN254_tmp
11
+
12
+ reduceFpBN254:
13
+ ; 1] It must be satisfied that:
14
+ ; [BN254_P]·[A / p] + [A % p] = [0]·2²⁵⁶ + A
15
+ A :MSTORE(reduceFpBN254_tmp)
16
+ ${A / const.BN254_P} => B ; quotient (256 bits)
17
+ ${A % const.BN254_P} => C ; residue (256 bits)
18
+ %BN254_P => A
19
+ 0n => D
20
+ $ :MLOAD(reduceFpBN254_tmp), ARITH
21
+
22
+ ; 2] Check the the residue is less than p
23
+ A => B
24
+ C => A
25
+ 1 :LT, RETURN
@@ -0,0 +1,31 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; squareFpBN254:
5
+ ;; in: A ∈ Fp
6
+ ;; out: B = A² (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ squareFpBN254:
11
+ ; 1] Compute and check the inverse over Z
12
+ ; A·A + [0] = [D]·2²⁵⁶ + [E]
13
+ A => B
14
+ 0 => C
15
+ $${var _squareFpBN254_AA = A * A}
16
+ ${_squareFpBN254_AA >> 256} => D
17
+ ${_squareFpBN254_AA} => E :ARITH
18
+
19
+ ; 2] Check it over Fp, that is, it must be satisfied that:
20
+ ; [BN254_P]·[A² / p] + [A² % p] = D·2²⁵⁶ + E
21
+ ; where C < BN254_P
22
+ %BN254_P => A
23
+ ${_squareFpBN254_AA / const.BN254_P} => B ; quotient (256 bits)
24
+ ${_squareFpBN254_AA % const.BN254_P} => C ; residue (256 bits)
25
+ E :ARITH
26
+
27
+ ; 3] Check that the result is lower than BN254_P
28
+ A => B
29
+ C => A
30
+ 1 :LT
31
+ A => B :RETURN
@@ -0,0 +1,36 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; subFpBN254:
5
+ ;; in: A,C ∈ Fp
6
+ ;; out: C = A - C (mod BN254_P) ∈ Fp
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ subFpBN254:
11
+ ; 0] Negate C
12
+ A => D
13
+ %BN254_P => A
14
+ C => B
15
+ $ => C :SUB
16
+ D => A
17
+
18
+ ; 1] Compute and check the sub over Z
19
+ ; A·[1] + [BN254_P-C] = [D]·2²⁵⁶ + [E]
20
+ 1 => B
21
+ $${var _subFpBN254_AC = A + C}
22
+ ${_subFpBN254_AC >> 256} => D
23
+ ${_subFpBN254_AC} => E :ARITH
24
+
25
+ ; 2] Check it over Fp, that is, it must be satisfied that:
26
+ ; [BN254_P]·[(A - C) / p] + [(A - C) % p] = D·2²⁵⁶ + E
27
+ ; where C < BN254_P
28
+ %BN254_P => A
29
+ ${_subFpBN254_AC / const.BN254_P} => B ; quotient (256 bits)
30
+ ${_subFpBN254_AC % const.BN254_P} => C ; residue (256 bits)
31
+ E :ARITH
32
+
33
+ ; 3] Check that the result is lower than BN254_P
34
+ A => B
35
+ C => A
36
+ 1 :LT, RETURN
@@ -0,0 +1,25 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,r)
3
+ ;;
4
+ ;; reduceFrBN254:
5
+ ;; in: B ∈ [0, 2²⁵⁶-1]
6
+ ;; out: A = B (mod BN254_R) ∈ Fr
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL reduceFrBN254_tmp
11
+
12
+ reduceFrBN254:
13
+ ; 1] It must be satisfied that:
14
+ ; [BN254_R]·[B / r] + [B % r] = [0]·2²⁵⁶ + E
15
+ B :MSTORE(reduceFrBN254_tmp)
16
+ ${B % const.BN254_R} => C ; residue (256 bits)
17
+ ${B / const.BN254_R} => B ; quotient (256 bits)
18
+ %BN254_R => A
19
+ 0n => D
20
+ $ :MLOAD(reduceFrBN254_tmp), ARITH
21
+
22
+ ; 2] Check the the residue is less than r
23
+ A => B
24
+ C => A
25
+ 1 :LT, RETURN
@@ -0,0 +1,62 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;;
3
+ ;; Constants of the optimal Ate pairing over the BN254 curve
4
+ ;; e: G1 x G2 --> GT
5
+ ;; where G1 = E(Fp)[r] = E(Fp), G2 = E'(Fp2)[r] and GT = mu_r (the r-th roots of unity over Fp12* over the curves:
6
+ ;; E/Fp: y² = x³ + 3, E'/Fp2: y² = x³ + 3/(9+u)
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ ; Basic constants: X = "BN family parameter", P = "base field order", R = "scalar field order"
11
+ ; CONSTL %BN254_X = 4965661367192848881n ; Unused, just for reference
12
+ CONSTL %BN254_P = 21888242871839275222246405745257275088696311157297823662689037894645226208583n ; 36n * X ** 4n + 36n * X ** 3n + 24n * X ** 2n + 6n * X + 1n
13
+ ; NOTE: It is satisfied that 5·p < 2²⁵⁶ < 6·p
14
+ CONSTL %BN254_P_MINUS_ONE = 21888242871839275222246405745257275088696311157297823662689037894645226208582n
15
+ CONSTL %BN254_R = 21888242871839275222246405745257275088548364400416034343698204186575808495617n ; 36n * X ** 4n + 36n * X ** 3n + 18n * X ** 2n + 6n * X + 1n
16
+ CONSTL %BN254_R_MINUS_ONE = 21888242871839275222246405745257275088548364400416034343698204186575808495616n
17
+
18
+ ; Precomputed values: 3/(9+u) and 6x²
19
+ CONSTL %BN254_E_B = 3n
20
+ CONSTL %BN254_ETWISTED_B_X = 19485874751759354771024239261021720505790618469301721065564631296452457478373n
21
+ CONSTL %BN254_ETWISTED_B_Y = 266929791119991161246907387137283842545076965332900288569378510910307636690n
22
+ CONSTL %BN254_SIX_TIMES_X_SQ = 147946756881789318990833708069417712966n
23
+
24
+ ; Coordinates of the generator of the group G1
25
+ CONSTL %PAIRING_P1X = 1n
26
+ CONSTL %PAIRING_P1Y = 2n
27
+
28
+ ; Coordinates of the generator of the group G2
29
+ CONSTL %PAIRING_P2X1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781n
30
+ CONSTL %PAIRING_P2X2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634n
31
+ CONSTL %PAIRING_P2Y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930n
32
+ CONSTL %PAIRING_P2Y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531n
33
+
34
+ ; Precomputed frobenius operator constants. These are used to compute f^p, f^p2 and f^p3 cheaply, where f ∈ Fp12
35
+ ; See: https://hackmd.io/kcEJAWISQ56eE6YpBnurgw#Frobenius-Operator
36
+ CONSTL %FROBENIUS_GAMMA111 = 8376118865763821496583973867626364092589906065868298776909617916018768340080n
37
+ CONSTL %FROBENIUS_GAMMA112 = 16469823323077808223889137241176536799009286646108169935659301613961712198316n
38
+ CONSTL %FROBENIUS_GAMMA121 = 21575463638280843010398324269430826099269044274347216827212613867836435027261n
39
+ CONSTL %FROBENIUS_GAMMA122 = 10307601595873709700152284273816112264069230130616436755625194854815875713954n
40
+ CONSTL %FROBENIUS_GAMMA131 = 2821565182194536844548159561693502659359617185244120367078079554186484126554n
41
+ CONSTL %FROBENIUS_GAMMA132 = 3505843767911556378687030309984248845540243509899259641013678093033130930403n
42
+ CONSTL %FROBENIUS_GAMMA131_NEGATED = 19066677689644738377698246183563772429336693972053703295610958340458742082029n ;%BN254_P - %FROBENIUS_GAMMA131
43
+ CONSTL %FROBENIUS_GAMMA132_NEGATED = 18382399103927718843559375435273026243156067647398564021675359801612095278180n ;%BN254_P - %FROBENIUS_GAMMA132
44
+ CONSTL %FROBENIUS_GAMMA141 = 2581911344467009335267311115468803099551665605076196740867805258568234346338n
45
+ CONSTL %FROBENIUS_GAMMA142 = 19937756971775647987995932169929341994314640652964949448313374472400716661030n
46
+ CONSTL %FROBENIUS_GAMMA151 = 685108087231508774477564247770172212460312782337200605669322048753928464687n
47
+ CONSTL %FROBENIUS_GAMMA152 = 8447204650696766136447902020341177575205426561248465145919723016860428151883n
48
+ CONSTL %FROBENIUS_GAMMA21 = 21888242871839275220042445260109153167277707414472061641714758635765020556617n
49
+ CONSTL %FROBENIUS_GAMMA22 = 21888242871839275220042445260109153167277707414472061641714758635765020556616n
50
+ CONSTL %FROBENIUS_GAMMA23 = 21888242871839275222246405745257275088696311157297823662689037894645226208582n
51
+ CONSTL %FROBENIUS_GAMMA24 = 2203960485148121921418603742825762020974279258880205651966n
52
+ CONSTL %FROBENIUS_GAMMA25 = 2203960485148121921418603742825762020974279258880205651967n
53
+ CONSTL %FROBENIUS_GAMMA311 = 11697423496358154304825782922584725312912383441159505038794027105778954184319n
54
+ CONSTL %FROBENIUS_GAMMA312 = 303847389135065887422783454877609941456349188919719272345083954437860409601n
55
+ CONSTL %FROBENIUS_GAMMA321 = 3772000881919853776433695186713858239009073593817195771773381919316419345261n
56
+ CONSTL %FROBENIUS_GAMMA322 = 2236595495967245188281701248203181795121068902605861227855261137820944008926n
57
+ CONSTL %FROBENIUS_GAMMA331 = 19066677689644738377698246183563772429336693972053703295610958340458742082029n
58
+ CONSTL %FROBENIUS_GAMMA332 = 18382399103927718843559375435273026243156067647398564021675359801612095278180n
59
+ CONSTL %FROBENIUS_GAMMA341 = 5324479202449903542726783395506214481928257762400643279780343368557297135718n
60
+ CONSTL %FROBENIUS_GAMMA342 = 16208900380737693084919495127334387981393726419856888799917914180988844123039n
61
+ CONSTL %FROBENIUS_GAMMA351 = 8941241848238582420466759817324047081148088512956452953208002715982955420483n
62
+ CONSTL %FROBENIUS_GAMMA352 = 10338197737521362862238855242243140895517409139741313354160881284257516364953n