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,376 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP6 arithmetic
3
+ ;;
4
+ ;; squareFp12BN254:
5
+ ;; in: (a1 + a2·w) ∈ Fp12, where ai ∈ Fp6
6
+ ;; out: (a1 + a2·w)² = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = (a1-a2)·(a1-a2·v) + a1·a2 + a1·a2·v
8
+ ;; - c2 = 2·a1·a2
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL squareFp12BN254_a11_x
13
+ VAR GLOBAL squareFp12BN254_a11_y
14
+ VAR GLOBAL squareFp12BN254_a12_x
15
+ VAR GLOBAL squareFp12BN254_a12_y
16
+ VAR GLOBAL squareFp12BN254_a13_x
17
+ VAR GLOBAL squareFp12BN254_a13_y
18
+ VAR GLOBAL squareFp12BN254_a21_x
19
+ VAR GLOBAL squareFp12BN254_a21_y
20
+ VAR GLOBAL squareFp12BN254_a22_x
21
+ VAR GLOBAL squareFp12BN254_a22_y
22
+ VAR GLOBAL squareFp12BN254_a23_x
23
+ VAR GLOBAL squareFp12BN254_a23_y
24
+ VAR GLOBAL squareFp12BN254_c11_x
25
+ VAR GLOBAL squareFp12BN254_c11_y
26
+ VAR GLOBAL squareFp12BN254_c12_x
27
+ VAR GLOBAL squareFp12BN254_c12_y
28
+ VAR GLOBAL squareFp12BN254_c13_x
29
+ VAR GLOBAL squareFp12BN254_c13_y
30
+ VAR GLOBAL squareFp12BN254_c21_x
31
+ VAR GLOBAL squareFp12BN254_c21_y
32
+ VAR GLOBAL squareFp12BN254_c22_x
33
+ VAR GLOBAL squareFp12BN254_c22_y
34
+ VAR GLOBAL squareFp12BN254_c23_x
35
+ VAR GLOBAL squareFp12BN254_c23_y
36
+
37
+ VAR GLOBAL squareFp12BN254_a1a2mul1_x
38
+ VAR GLOBAL squareFp12BN254_a1a2mul1_y
39
+ VAR GLOBAL squareFp12BN254_a1a2mul2_x
40
+ VAR GLOBAL squareFp12BN254_a1a2mul2_y
41
+ VAR GLOBAL squareFp12BN254_a1a2mul3_x
42
+ VAR GLOBAL squareFp12BN254_a1a2mul3_y
43
+
44
+ VAR GLOBAL squareFp12BN254_a2vmul1_x
45
+ VAR GLOBAL squareFp12BN254_a2vmul1_y
46
+ VAR GLOBAL squareFp12BN254_a2vmul2_x
47
+ VAR GLOBAL squareFp12BN254_a2vmul2_y
48
+ VAR GLOBAL squareFp12BN254_a2vmul3_x
49
+ VAR GLOBAL squareFp12BN254_a2vmul3_y
50
+
51
+ VAR GLOBAL squareFp12BN254_a1a2vmul1_x
52
+ VAR GLOBAL squareFp12BN254_a1a2vmul1_y
53
+ VAR GLOBAL squareFp12BN254_a1a2vmul2_x
54
+ VAR GLOBAL squareFp12BN254_a1a2vmul2_y
55
+ VAR GLOBAL squareFp12BN254_a1a2vmul3_x
56
+ VAR GLOBAL squareFp12BN254_a1a2vmul3_y
57
+
58
+ VAR GLOBAL squareFp12BN254_a1a2sub1_x
59
+ VAR GLOBAL squareFp12BN254_a1a2sub1_y
60
+ VAR GLOBAL squareFp12BN254_a1a2sub2_x
61
+ VAR GLOBAL squareFp12BN254_a1a2sub2_y
62
+ VAR GLOBAL squareFp12BN254_a1a2sub3_x
63
+ VAR GLOBAL squareFp12BN254_a1a2sub3_y
64
+ VAR GLOBAL squareFp12BN254_a1a2vsub1_x
65
+ VAR GLOBAL squareFp12BN254_a1a2vsub1_y
66
+ VAR GLOBAL squareFp12BN254_a1a2vsub2_x
67
+ VAR GLOBAL squareFp12BN254_a1a2vsub2_y
68
+ VAR GLOBAL squareFp12BN254_a1a2vsub3_x
69
+ VAR GLOBAL squareFp12BN254_a1a2vsub3_y
70
+
71
+ VAR GLOBAL squareFp12BN254_RR
72
+
73
+ squareFp12BN254:
74
+ RR :MSTORE(squareFp12BN254_RR)
75
+
76
+ ; 1] a1·a2
77
+ $ => A :MLOAD(squareFp12BN254_a11_x)
78
+ $ => B :MLOAD(squareFp12BN254_a11_y)
79
+ A :MSTORE(mulFp6BN254_a1_x)
80
+ B :MSTORE(mulFp6BN254_a1_y)
81
+ $ => A :MLOAD(squareFp12BN254_a12_x)
82
+ $ => B :MLOAD(squareFp12BN254_a12_y)
83
+ A :MSTORE(mulFp6BN254_a2_x)
84
+ B :MSTORE(mulFp6BN254_a2_y)
85
+ $ => A :MLOAD(squareFp12BN254_a13_x)
86
+ $ => B :MLOAD(squareFp12BN254_a13_y)
87
+ A :MSTORE(mulFp6BN254_a3_x)
88
+ B :MSTORE(mulFp6BN254_a3_y)
89
+
90
+ $ => A :MLOAD(squareFp12BN254_a21_x)
91
+ $ => B :MLOAD(squareFp12BN254_a21_y)
92
+ A :MSTORE(mulFp6BN254_b1_x)
93
+ B :MSTORE(mulFp6BN254_b1_y)
94
+ $ => A :MLOAD(squareFp12BN254_a22_x)
95
+ $ => B :MLOAD(squareFp12BN254_a22_y)
96
+ A :MSTORE(mulFp6BN254_b2_x)
97
+ B :MSTORE(mulFp6BN254_b2_y)
98
+ $ => A :MLOAD(squareFp12BN254_a23_x)
99
+ $ => B :MLOAD(squareFp12BN254_a23_y)
100
+ A :MSTORE(mulFp6BN254_b3_x)
101
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
102
+ $ => A :MLOAD(mulFp6BN254_c1_x)
103
+ $ => B :MLOAD(mulFp6BN254_c1_y)
104
+ A :MSTORE(squareFp12BN254_a1a2mul1_x)
105
+ B :MSTORE(squareFp12BN254_a1a2mul1_y)
106
+ $ => A :MLOAD(mulFp6BN254_c2_x)
107
+ $ => B :MLOAD(mulFp6BN254_c2_y)
108
+ A :MSTORE(squareFp12BN254_a1a2mul2_x)
109
+ B :MSTORE(squareFp12BN254_a1a2mul2_y)
110
+ $ => A :MLOAD(mulFp6BN254_c3_x)
111
+ $ => B :MLOAD(mulFp6BN254_c3_y)
112
+ A :MSTORE(squareFp12BN254_a1a2mul3_x)
113
+ B :MSTORE(squareFp12BN254_a1a2mul3_y)
114
+
115
+ ; 2] a2·v
116
+ $ => A :MLOAD(squareFp12BN254_a21_x)
117
+ $ => B :MLOAD(squareFp12BN254_a21_y)
118
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
119
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
120
+ $ => A :MLOAD(squareFp12BN254_a22_x)
121
+ $ => B :MLOAD(squareFp12BN254_a22_y)
122
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
123
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
124
+ $ => A :MLOAD(squareFp12BN254_a23_x)
125
+ $ => B :MLOAD(squareFp12BN254_a23_y)
126
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
127
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
128
+
129
+ 1n :MSTORE(sparseMulAFp6BN254_b2_x)
130
+ 0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
131
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
132
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
133
+ A :MSTORE(squareFp12BN254_a2vmul1_x)
134
+ B :MSTORE(squareFp12BN254_a2vmul1_y)
135
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
136
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
137
+ A :MSTORE(squareFp12BN254_a2vmul2_x)
138
+ B :MSTORE(squareFp12BN254_a2vmul2_y)
139
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
140
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
141
+ A :MSTORE(squareFp12BN254_a2vmul3_x)
142
+ B :MSTORE(squareFp12BN254_a2vmul3_y)
143
+
144
+ ; 2] a1·a2·v
145
+ $ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
146
+ $ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
147
+ A :MSTORE(sparseMulAFp6BN254_a1_x)
148
+ B :MSTORE(sparseMulAFp6BN254_a1_y)
149
+ $ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
150
+ $ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
151
+ A :MSTORE(sparseMulAFp6BN254_a2_x)
152
+ B :MSTORE(sparseMulAFp6BN254_a2_y)
153
+ $ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
154
+ $ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
155
+ A :MSTORE(sparseMulAFp6BN254_a3_x)
156
+ B :MSTORE(sparseMulAFp6BN254_a3_y)
157
+
158
+ 1n :MSTORE(sparseMulAFp6BN254_b2_x)
159
+ 0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
160
+ $ => A :MLOAD(sparseMulAFp6BN254_c1_x)
161
+ $ => B :MLOAD(sparseMulAFp6BN254_c1_y)
162
+ A :MSTORE(squareFp12BN254_a1a2vmul1_x)
163
+ B :MSTORE(squareFp12BN254_a1a2vmul1_y)
164
+ $ => A :MLOAD(sparseMulAFp6BN254_c2_x)
165
+ $ => B :MLOAD(sparseMulAFp6BN254_c2_y)
166
+ A :MSTORE(squareFp12BN254_a1a2vmul2_x)
167
+ B :MSTORE(squareFp12BN254_a1a2vmul2_y)
168
+ $ => A :MLOAD(sparseMulAFp6BN254_c3_x)
169
+ $ => B :MLOAD(sparseMulAFp6BN254_c3_y)
170
+ A :MSTORE(squareFp12BN254_a1a2vmul3_x)
171
+ B :MSTORE(squareFp12BN254_a1a2vmul3_y)
172
+
173
+ ; 3] c2 = 2·a1·a2
174
+ $ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
175
+ $ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
176
+ A :MSTORE(escalarMulFp6BN254_a1_x)
177
+ B :MSTORE(escalarMulFp6BN254_a1_y)
178
+ $ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
179
+ $ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
180
+ A :MSTORE(escalarMulFp6BN254_a2_x)
181
+ B :MSTORE(escalarMulFp6BN254_a2_y)
182
+ $ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
183
+ $ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
184
+ A :MSTORE(escalarMulFp6BN254_a3_x)
185
+ B :MSTORE(escalarMulFp6BN254_a3_y)
186
+
187
+ 2n :MSTORE(escalarMulFp6BN254_b), CALL(escalarMulFp6BN254)
188
+ $ => A :MLOAD(escalarMulFp6BN254_c1_x)
189
+ $ => B :MLOAD(escalarMulFp6BN254_c1_y)
190
+ A :MSTORE(squareFp12BN254_c21_x)
191
+ B :MSTORE(squareFp12BN254_c21_y)
192
+ $ => A :MLOAD(escalarMulFp6BN254_c2_x)
193
+ $ => B :MLOAD(escalarMulFp6BN254_c2_y)
194
+ A :MSTORE(squareFp12BN254_c22_x)
195
+ B :MSTORE(squareFp12BN254_c22_y)
196
+ $ => A :MLOAD(escalarMulFp6BN254_c3_x)
197
+ $ => B :MLOAD(escalarMulFp6BN254_c3_y)
198
+ A :MSTORE(squareFp12BN254_c23_x)
199
+ B :MSTORE(squareFp12BN254_c23_y)
200
+
201
+ ; 4] a1-a2
202
+ $ => A :MLOAD(squareFp12BN254_a11_x)
203
+ $ => B :MLOAD(squareFp12BN254_a11_y)
204
+ A :MSTORE(subFp6BN254_a1_x)
205
+ B :MSTORE(subFp6BN254_a1_y)
206
+ $ => A :MLOAD(squareFp12BN254_a12_x)
207
+ $ => B :MLOAD(squareFp12BN254_a12_y)
208
+ A :MSTORE(subFp6BN254_a2_x)
209
+ B :MSTORE(subFp6BN254_a2_y)
210
+ $ => A :MLOAD(squareFp12BN254_a13_x)
211
+ $ => B :MLOAD(squareFp12BN254_a13_y)
212
+ A :MSTORE(subFp6BN254_a3_x)
213
+ B :MSTORE(subFp6BN254_a3_y)
214
+
215
+ $ => A :MLOAD(squareFp12BN254_a21_x)
216
+ $ => B :MLOAD(squareFp12BN254_a21_y)
217
+ A :MSTORE(subFp6BN254_b1_x)
218
+ B :MSTORE(subFp6BN254_b1_y)
219
+ $ => A :MLOAD(squareFp12BN254_a22_x)
220
+ $ => B :MLOAD(squareFp12BN254_a22_y)
221
+ A :MSTORE(subFp6BN254_b2_x)
222
+ B :MSTORE(subFp6BN254_b2_y)
223
+ $ => A :MLOAD(squareFp12BN254_a23_x)
224
+ $ => B :MLOAD(squareFp12BN254_a23_y)
225
+ A :MSTORE(subFp6BN254_b3_x)
226
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
227
+
228
+ $ => A :MLOAD(subFp6BN254_c1_x)
229
+ $ => B :MLOAD(subFp6BN254_c1_y)
230
+ A :MSTORE(squareFp12BN254_a1a2sub1_x)
231
+ B :MSTORE(squareFp12BN254_a1a2sub1_y)
232
+ $ => A :MLOAD(subFp6BN254_c2_x)
233
+ $ => B :MLOAD(subFp6BN254_c2_y)
234
+ A :MSTORE(squareFp12BN254_a1a2sub2_x)
235
+ B :MSTORE(squareFp12BN254_a1a2sub2_y)
236
+ $ => A :MLOAD(subFp6BN254_c3_x)
237
+ $ => B :MLOAD(subFp6BN254_c3_y)
238
+ A :MSTORE(squareFp12BN254_a1a2sub3_x)
239
+ B :MSTORE(squareFp12BN254_a1a2sub3_y)
240
+
241
+
242
+ ; 5] a1-a2·v
243
+ $ => A :MLOAD(squareFp12BN254_a11_x)
244
+ $ => B :MLOAD(squareFp12BN254_a11_y)
245
+ A :MSTORE(subFp6BN254_a1_x)
246
+ B :MSTORE(subFp6BN254_a1_y)
247
+ $ => A :MLOAD(squareFp12BN254_a12_x)
248
+ $ => B :MLOAD(squareFp12BN254_a12_y)
249
+ A :MSTORE(subFp6BN254_a2_x)
250
+ B :MSTORE(subFp6BN254_a2_y)
251
+ $ => A :MLOAD(squareFp12BN254_a13_x)
252
+ $ => B :MLOAD(squareFp12BN254_a13_y)
253
+ A :MSTORE(subFp6BN254_a3_x)
254
+ B :MSTORE(subFp6BN254_a3_y)
255
+
256
+ $ => A :MLOAD(squareFp12BN254_a2vmul1_x)
257
+ $ => B :MLOAD(squareFp12BN254_a2vmul1_y)
258
+ A :MSTORE(subFp6BN254_b1_x)
259
+ B :MSTORE(subFp6BN254_b1_y)
260
+ $ => A :MLOAD(squareFp12BN254_a2vmul2_x)
261
+ $ => B :MLOAD(squareFp12BN254_a2vmul2_y)
262
+ A :MSTORE(subFp6BN254_b2_x)
263
+ B :MSTORE(subFp6BN254_b2_y)
264
+ $ => A :MLOAD(squareFp12BN254_a2vmul3_x)
265
+ $ => B :MLOAD(squareFp12BN254_a2vmul3_y)
266
+ A :MSTORE(subFp6BN254_b3_x)
267
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
268
+
269
+ $ => A :MLOAD(subFp6BN254_c1_x)
270
+ $ => B :MLOAD(subFp6BN254_c1_y)
271
+ A :MSTORE(squareFp12BN254_a1a2vsub1_x)
272
+ B :MSTORE(squareFp12BN254_a1a2vsub1_y)
273
+ $ => A :MLOAD(subFp6BN254_c2_x)
274
+ $ => B :MLOAD(subFp6BN254_c2_y)
275
+ A :MSTORE(squareFp12BN254_a1a2vsub2_x)
276
+ B :MSTORE(squareFp12BN254_a1a2vsub2_y)
277
+ $ => A :MLOAD(subFp6BN254_c3_x)
278
+ $ => B :MLOAD(subFp6BN254_c3_y)
279
+ A :MSTORE(squareFp12BN254_a1a2vsub3_x)
280
+ B :MSTORE(squareFp12BN254_a1a2vsub3_y)
281
+
282
+ ; 7] c1 = (a1-a2)·(a1-a2·v) + a1·a2 + a1·a2·v
283
+ $ => A :MLOAD(squareFp12BN254_a1a2sub1_x)
284
+ $ => B :MLOAD(squareFp12BN254_a1a2sub1_y)
285
+ A :MSTORE(mulFp6BN254_a1_x)
286
+ B :MSTORE(mulFp6BN254_a1_y)
287
+ $ => A :MLOAD(squareFp12BN254_a1a2sub2_x)
288
+ $ => B :MLOAD(squareFp12BN254_a1a2sub2_y)
289
+ A :MSTORE(mulFp6BN254_a2_x)
290
+ B :MSTORE(mulFp6BN254_a2_y)
291
+ $ => A :MLOAD(squareFp12BN254_a1a2sub3_x)
292
+ $ => B :MLOAD(squareFp12BN254_a1a2sub3_y)
293
+ A :MSTORE(mulFp6BN254_a3_x)
294
+ B :MSTORE(mulFp6BN254_a3_y)
295
+
296
+
297
+ $ => A :MLOAD(squareFp12BN254_a1a2vsub1_x)
298
+ $ => B :MLOAD(squareFp12BN254_a1a2vsub1_y)
299
+ A :MSTORE(mulFp6BN254_b1_x)
300
+ B :MSTORE(mulFp6BN254_b1_y)
301
+ $ => A :MLOAD(squareFp12BN254_a1a2vsub2_x)
302
+ $ => B :MLOAD(squareFp12BN254_a1a2vsub2_y)
303
+ A :MSTORE(mulFp6BN254_b2_x)
304
+ B :MSTORE(mulFp6BN254_b2_y)
305
+ $ => A :MLOAD(squareFp12BN254_a1a2vsub3_x)
306
+ $ => B :MLOAD(squareFp12BN254_a1a2vsub3_y)
307
+ A :MSTORE(mulFp6BN254_b3_x)
308
+ B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
309
+
310
+ $ => A :MLOAD(mulFp6BN254_c1_x)
311
+ $ => B :MLOAD(mulFp6BN254_c1_y)
312
+ A :MSTORE(addFp6BN254_a1_x)
313
+ B :MSTORE(addFp6BN254_a1_y)
314
+ $ => A :MLOAD(mulFp6BN254_c2_x)
315
+ $ => B :MLOAD(mulFp6BN254_c2_y)
316
+ A :MSTORE(addFp6BN254_a2_x)
317
+ B :MSTORE(addFp6BN254_a2_y)
318
+ $ => A :MLOAD(mulFp6BN254_c3_x)
319
+ $ => B :MLOAD(mulFp6BN254_c3_y)
320
+ A :MSTORE(addFp6BN254_a3_x)
321
+ B :MSTORE(addFp6BN254_a3_y)
322
+
323
+ $ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
324
+ $ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
325
+ A :MSTORE(addFp6BN254_b1_x)
326
+ B :MSTORE(addFp6BN254_b1_y)
327
+ $ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
328
+ $ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
329
+ A :MSTORE(addFp6BN254_b2_x)
330
+ B :MSTORE(addFp6BN254_b2_y)
331
+ $ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
332
+ $ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
333
+ A :MSTORE(addFp6BN254_b3_x)
334
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
335
+
336
+ $ => A :MLOAD(addFp6BN254_c1_x)
337
+ $ => B :MLOAD(addFp6BN254_c1_y)
338
+ A :MSTORE(addFp6BN254_a1_x)
339
+ B :MSTORE(addFp6BN254_a1_y)
340
+ $ => A :MLOAD(addFp6BN254_c2_x)
341
+ $ => B :MLOAD(addFp6BN254_c2_y)
342
+ A :MSTORE(addFp6BN254_a2_x)
343
+ B :MSTORE(addFp6BN254_a2_y)
344
+ $ => A :MLOAD(addFp6BN254_c3_x)
345
+ $ => B :MLOAD(addFp6BN254_c3_y)
346
+ A :MSTORE(addFp6BN254_a3_x)
347
+ B :MSTORE(addFp6BN254_a3_y)
348
+
349
+ $ => A :MLOAD(squareFp12BN254_a1a2vmul1_x)
350
+ $ => B :MLOAD(squareFp12BN254_a1a2vmul1_y)
351
+ A :MSTORE(addFp6BN254_b1_x)
352
+ B :MSTORE(addFp6BN254_b1_y)
353
+ $ => A :MLOAD(squareFp12BN254_a1a2vmul2_x)
354
+ $ => B :MLOAD(squareFp12BN254_a1a2vmul2_y)
355
+ A :MSTORE(addFp6BN254_b2_x)
356
+ B :MSTORE(addFp6BN254_b2_y)
357
+ $ => A :MLOAD(squareFp12BN254_a1a2vmul3_x)
358
+ $ => B :MLOAD(squareFp12BN254_a1a2vmul3_y)
359
+ A :MSTORE(addFp6BN254_b3_x)
360
+ B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
361
+
362
+ $ => A :MLOAD(addFp6BN254_c1_x)
363
+ $ => B :MLOAD(addFp6BN254_c1_y)
364
+ A :MSTORE(squareFp12BN254_c11_x)
365
+ B :MSTORE(squareFp12BN254_c11_y)
366
+ $ => A :MLOAD(addFp6BN254_c2_x)
367
+ $ => B :MLOAD(addFp6BN254_c2_y)
368
+ A :MSTORE(squareFp12BN254_c12_x)
369
+ B :MSTORE(squareFp12BN254_c12_y)
370
+ $ => A :MLOAD(addFp6BN254_c3_x)
371
+ $ => B :MLOAD(addFp6BN254_c3_y)
372
+ A :MSTORE(squareFp12BN254_c13_x)
373
+ B :MSTORE(squareFp12BN254_c13_y)
374
+
375
+ $ => RR :MLOAD(squareFp12BN254_RR)
376
+ :RETURN
@@ -0,0 +1,19 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: ARITH_BN254_ADDFP2 ensures that the result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; addFp2BN254:
5
+ ;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
6
+ ;; out: E + C·u = (A + C) + (B + D)·u ∈ Fp2
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL addFp2BN254_i
11
+
12
+ addFp2BN254:
13
+ ; Compute and check the mul
14
+ ; A + C = [E] + (q0·BN254_P)
15
+ ; B + D = [OP] + (q1·BN254_P)
16
+ ${ARITH_BN254_ADDFP2(A,C)} => E
17
+ ${ARITH_BN254_ADDFP2(B,D)} :MSTORE(addFp2BN254_i), ARITH_BN254_ADDFP2
18
+
19
+ $ => C :MLOAD(addFp2BN254_i), RETURN
@@ -0,0 +1,20 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; escalarMulFp2BN254:
5
+ ;; in: A ∈ Fp, (C + D·u) ∈ Fp2, where C,D ∈ Fp
6
+ ;; out: E + C·u = (A·C) + (A·D)·u ∈ Fp2
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL escalarMulFp2BN254_i
11
+
12
+ escalarMulFp2BN254:
13
+ ; Compute and check the mul
14
+ ; A·C - 0·D = [E] + (q0·BN254_P)
15
+ ; A·D + 0·C = [OP] + (q1·BN254_P)
16
+ 0n => B
17
+ ${ARITH_BN254_MULFP2_X(A,B,C,D)} => E
18
+ ${ARITH_BN254_MULFP2_Y(A,B,C,D)} :MSTORE(escalarMulFp2BN254_i), ARITH_BN254_MULFP2
19
+
20
+ $ => C :MLOAD(escalarMulFp2BN254_i), RETURN
@@ -0,0 +1,66 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; invFp2BN254
5
+ ;; in: (A + B·u) ∈ Fp2, where A,B ∈ Fp
6
+ ;; out: C + D·u = (A·(A² + B²)⁻¹) + (-B·(A² + B²)⁻¹)·u ∈ Fp2
7
+ ;;
8
+ ;; NOTE: On input 0, it returns 0
9
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
+
11
+ VAR GLOBAL invFp2BN254_x
12
+ VAR GLOBAL invFp2BN254_y
13
+
14
+ VAR GLOBAL invFp2BN254_RR
15
+
16
+ invFp2BN254:
17
+ RR :MSTORE(invFp2BN254_RR)
18
+
19
+ B :MSTORE(invFp2BN254_y)
20
+ ; Normalization of A,B
21
+ %BN254_P => B
22
+ $ :LT, JMPC(__invFp2BN254_reduce_A_continue)
23
+ :CALL(reduceFpBN254)
24
+ __invFp2BN254_reduce_A_continue:
25
+ A :MSTORE(invFp2BN254_x)
26
+ $ => A :MLOAD(invFp2BN254_y)
27
+ %BN254_P => B
28
+ $ :LT, JMPC(__invFp2BN254_reduce_B_continue)
29
+ :CALL(reduceFpBN254)
30
+ __invFp2BN254_reduce_B_continue:
31
+ A :MSTORE(invFp2BN254_y)
32
+ ; From here, it is guaranteed that A,B ∈ [0,BN254_P)
33
+
34
+ invFp2BN254_zero_check:
35
+ ; Check if A = B = 0, and if so, return 0
36
+ $ => B :MLOAD(invFp2BN254_x)
37
+ 0 => A
38
+ $ :EQ, JMPNC(invFp2BN254_normalized)
39
+ $ => B :MLOAD(invFp2BN254_y)
40
+ $ :EQ, JMPC(invFp2BN254_input_is_zero)
41
+
42
+ invFp2BN254_normalized:
43
+ $ => A :MLOAD(invFp2BN254_x)
44
+ $ => B :MLOAD(invFp2BN254_y)
45
+ ; Remember that an element y ∈ Fp2 is the inverse of x ∈ Fp2 if and only if x·y = 1 in Fp2
46
+ ; We therefore check that (A + B·u)·(C + D·u) = 1 + 0·u
47
+ ; A·[C] - B·[D] = 1 + (q0·BN254_P)
48
+ ; A·[D] + B·[C] = 0 + (q1·BN254_P)
49
+ ${fp2InvBN254_x(mem.invFp2BN254_x,mem.invFp2BN254_y)} => C
50
+ ${fp2InvBN254_y(mem.invFp2BN254_x,mem.invFp2BN254_y)} => D
51
+ 1n => E
52
+ 0n :ARITH_BN254_MULFP2
53
+
54
+ ; Check that the resulting elements are lower than BN254_P
55
+ %BN254_P => B
56
+ C => A
57
+ 1 :LT
58
+ D => A
59
+ 1 :LT, JMP(invFp2BN254_end)
60
+
61
+ invFp2BN254_input_is_zero:
62
+ 0 => C,D
63
+
64
+ invFp2BN254_end:
65
+ $ => RR :MLOAD(invFp2BN254_RR)
66
+ :RETURN
@@ -0,0 +1,19 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; mulFp2BN254:
5
+ ;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
6
+ ;; out: E + C·u = (A·C - B·D) + (A·D + B·C)·u ∈ Fp2
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL mulFp2BN254_i
11
+
12
+ mulFp2BN254:
13
+ ; Compute and check the mul
14
+ ; A·C - B·D = [E] + (q0·BN254_P)
15
+ ; A·D + B·C = [OP] + (q1·BN254_P)
16
+ ${ARITH_BN254_MULFP2_X(A,B,C,D)} => E
17
+ ${ARITH_BN254_MULFP2_Y(A,B,C,D)} :MSTORE(mulFp2BN254_i), ARITH_BN254_MULFP2
18
+
19
+ $ => C :MLOAD(mulFp2BN254_i), RETURN
@@ -0,0 +1,21 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; squareFp2BN254:
5
+ ;; in: (A + B·u) ∈ Fp2, where A,B ∈ Fp
6
+ ;; out: E + C·u = (A - B)·(A + B) + (2·A·B)·u ∈ Fp2
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL squareFp2BN254_i
11
+
12
+ squareFp2BN254:
13
+ ; Compute and check the squaring
14
+ ; A·A - B·B = [E] + (q0·BN254_P)
15
+ ; A·B + B·A = [OP] + (q1·BN254_P)
16
+ A => C
17
+ B => D
18
+ ${ARITH_BN254_MULFP2_X(A,B,A,B)} => E
19
+ ${ARITH_BN254_MULFP2_Y(A,B,A,B)} :MSTORE(squareFp2BN254_i), ARITH_BN254_MULFP2
20
+
21
+ $ => C :MLOAD(squareFp2BN254_i), RETURN
@@ -0,0 +1,19 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: ARITH_BN254_SUBFP2 ensures that the result is in the range [0,BN254_P)
3
+ ;;
4
+ ;; subFp2BN254:
5
+ ;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
6
+ ;; out: E + C·u = (A - C) + (B - D)·u ∈ Fp2
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL subFp2BN254_i
11
+
12
+ subFp2BN254:
13
+ ; Compute and check the mul
14
+ ; A - C = [E] + (q0·BN254_P)
15
+ ; B - D = [OP] + (q1·BN254_P)
16
+ ${ARITH_BN254_SUBFP2(A,C)} => E
17
+ ${ARITH_BN254_SUBFP2(B,D)} :MSTORE(subFp2BN254_i), ARITH_BN254_SUBFP2
18
+
19
+ $ => C :MLOAD(subFp2BN254_i), RETURN
@@ -0,0 +1,76 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; squareFp4BN254:
5
+ ;; in: (a1 + a2·V) ∈ Fp4, where ai ∈ Fp2
6
+ ;; out: (c1 + c2·V) ∈ Fp4, where:
7
+ ;; - c1 = a2²·(9 + u) + a1²
8
+ ;; - c2 = (a1 + a2)² - a1² - a2²
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL squareFp4BN254_a1_x
13
+ VAR GLOBAL squareFp4BN254_a1_y
14
+ VAR GLOBAL squareFp4BN254_a2_x
15
+ VAR GLOBAL squareFp4BN254_a2_y
16
+ VAR GLOBAL squareFp4BN254_c1_x
17
+ VAR GLOBAL squareFp4BN254_c1_y
18
+ VAR GLOBAL squareFp4BN254_c2_x
19
+ VAR GLOBAL squareFp4BN254_c2_y
20
+
21
+ VAR GLOBAL squareFp4BN254_a1square_x
22
+ VAR GLOBAL squareFp4BN254_a1square_y
23
+ VAR GLOBAL squareFp4BN254_a2square_x
24
+ VAR GLOBAL squareFp4BN254_a2square_y
25
+
26
+ VAR GLOBAL squareFp4BN254_RR
27
+
28
+ squareFp4BN254:
29
+ RR :MSTORE(squareFp4BN254_RR)
30
+
31
+ ; 1] a1²
32
+ $ => A :MLOAD(squareFp4BN254_a1_x)
33
+ $ => B :MLOAD(squareFp4BN254_a1_y), CALL(squareFp2BN254)
34
+ E :MSTORE(squareFp4BN254_a1square_x)
35
+ C :MSTORE(squareFp4BN254_a1square_y)
36
+
37
+ ; 2] a2²
38
+ $ => A :MLOAD(squareFp4BN254_a2_x)
39
+ $ => B :MLOAD(squareFp4BN254_a2_y), CALL(squareFp2BN254)
40
+ E :MSTORE(squareFp4BN254_a2square_x)
41
+ C :MSTORE(squareFp4BN254_a2square_y)
42
+
43
+ ; 3] c1 = a2²·(9 + u) + a1²
44
+ $ => A :MLOAD(squareFp4BN254_a2square_x)
45
+ $ => B :MLOAD(squareFp4BN254_a2square_y)
46
+ 9n => C
47
+ 1n => D :CALL(mulFp2BN254)
48
+
49
+ E => A
50
+ C => B
51
+ $ => C :MLOAD(squareFp4BN254_a1square_x)
52
+ $ => D :MLOAD(squareFp4BN254_a1square_y), CALL(addFp2BN254)
53
+ E :MSTORE(squareFp4BN254_c1_x)
54
+ C :MSTORE(squareFp4BN254_c1_y)
55
+
56
+ ; 4] c2 = (a1 + a2)² - a1² - a2²
57
+ $ => A :MLOAD(squareFp4BN254_a1_x)
58
+ $ => B :MLOAD(squareFp4BN254_a1_y)
59
+ $ => C :MLOAD(squareFp4BN254_a2_x)
60
+ $ => D :MLOAD(squareFp4BN254_a2_y), CALL(addFp2BN254)
61
+ E => A
62
+ C => B :CALL(squareFp2BN254)
63
+
64
+ E => A
65
+ C => B
66
+ $ => C :MLOAD(squareFp4BN254_a1square_x)
67
+ $ => D :MLOAD(squareFp4BN254_a1square_y), CALL(subFp2BN254)
68
+ E => A
69
+ C => B
70
+ $ => C :MLOAD(squareFp4BN254_a2square_x)
71
+ $ => D :MLOAD(squareFp4BN254_a2square_y), CALL(subFp2BN254)
72
+ E :MSTORE(squareFp4BN254_c2_x)
73
+ C :MSTORE(squareFp4BN254_c2_y)
74
+
75
+ $ => RR :MLOAD(squareFp4BN254_RR)
76
+ :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
+ ;; addFp6BN254:
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 addFp6BN254_a1_x
11
+ VAR GLOBAL addFp6BN254_a1_y
12
+ VAR GLOBAL addFp6BN254_a2_x
13
+ VAR GLOBAL addFp6BN254_a2_y
14
+ VAR GLOBAL addFp6BN254_a3_x
15
+ VAR GLOBAL addFp6BN254_a3_y
16
+ VAR GLOBAL addFp6BN254_b1_x
17
+ VAR GLOBAL addFp6BN254_b1_y
18
+ VAR GLOBAL addFp6BN254_b2_x
19
+ VAR GLOBAL addFp6BN254_b2_y
20
+ VAR GLOBAL addFp6BN254_b3_x
21
+ VAR GLOBAL addFp6BN254_b3_y
22
+ VAR GLOBAL addFp6BN254_c1_x
23
+ VAR GLOBAL addFp6BN254_c1_y
24
+ VAR GLOBAL addFp6BN254_c2_x
25
+ VAR GLOBAL addFp6BN254_c2_y
26
+ VAR GLOBAL addFp6BN254_c3_x
27
+ VAR GLOBAL addFp6BN254_c3_y
28
+
29
+ VAR GLOBAL addFp6BN254_RR
30
+
31
+ addFp6BN254:
32
+ RR :MSTORE(addFp6BN254_RR)
33
+
34
+ ; 1] c1 = a1+b1
35
+ $ => A :MLOAD(addFp6BN254_a1_x)
36
+ $ => B :MLOAD(addFp6BN254_a1_y)
37
+ $ => C :MLOAD(addFp6BN254_b1_x)
38
+ $ => D :MLOAD(addFp6BN254_b1_y), CALL(addFp2BN254)
39
+ E :MSTORE(addFp6BN254_c1_x)
40
+ C :MSTORE(addFp6BN254_c1_y)
41
+
42
+ ; 2] c2 = a2+b2
43
+ $ => A :MLOAD(addFp6BN254_a2_x)
44
+ $ => B :MLOAD(addFp6BN254_a2_y)
45
+ $ => C :MLOAD(addFp6BN254_b2_x)
46
+ $ => D :MLOAD(addFp6BN254_b2_y), CALL(addFp2BN254)
47
+ E :MSTORE(addFp6BN254_c2_x)
48
+ C :MSTORE(addFp6BN254_c2_y)
49
+
50
+ ; 3] c3 = a3+b3
51
+ $ => A :MLOAD(addFp6BN254_a3_x)
52
+ $ => B :MLOAD(addFp6BN254_a3_y)
53
+ $ => C :MLOAD(addFp6BN254_b3_x)
54
+ $ => D :MLOAD(addFp6BN254_b3_y), CALL(addFp2BN254)
55
+ E :MSTORE(addFp6BN254_c3_x)
56
+ C :MSTORE(addFp6BN254_c3_y)
57
+
58
+ $ => RR :MLOAD(addFp6BN254_RR)
59
+ :RETURN