@zkasm/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 @zkasm/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,51 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; escalarMulFp6BN254:
5
+ ;; in: b ∈ Fp, (a1 + a2·v + a3·v²) ∈ Fp6, where ai ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) = (a1·b) + (a2·b)·v + (a3·b)·v² ∈ Fp6
7
+ ;;
8
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9
+
10
+ VAR GLOBAL escalarMulFp6BN254_a1_x
11
+ VAR GLOBAL escalarMulFp6BN254_a1_y
12
+ VAR GLOBAL escalarMulFp6BN254_a2_x
13
+ VAR GLOBAL escalarMulFp6BN254_a2_y
14
+ VAR GLOBAL escalarMulFp6BN254_a3_x
15
+ VAR GLOBAL escalarMulFp6BN254_a3_y
16
+ VAR GLOBAL escalarMulFp6BN254_b
17
+ VAR GLOBAL escalarMulFp6BN254_c1_x
18
+ VAR GLOBAL escalarMulFp6BN254_c1_y
19
+ VAR GLOBAL escalarMulFp6BN254_c2_x
20
+ VAR GLOBAL escalarMulFp6BN254_c2_y
21
+ VAR GLOBAL escalarMulFp6BN254_c3_x
22
+ VAR GLOBAL escalarMulFp6BN254_c3_y
23
+
24
+ VAR GLOBAL escalarMulFp6BN254_RR
25
+
26
+ escalarMulFp6BN254:
27
+ RR :MSTORE(escalarMulFp6BN254_RR)
28
+
29
+ ; 1] c1 = a1·b
30
+ $ => A :MLOAD(escalarMulFp6BN254_b)
31
+ $ => C :MLOAD(escalarMulFp6BN254_a1_x)
32
+ $ => D :MLOAD(escalarMulFp6BN254_a1_y), CALL(escalarMulFp2BN254)
33
+ E :MSTORE(escalarMulFp6BN254_c1_x)
34
+ C :MSTORE(escalarMulFp6BN254_c1_y)
35
+
36
+ ; 2] c2 = a2·b
37
+ $ => A :MLOAD(escalarMulFp6BN254_b)
38
+ $ => C :MLOAD(escalarMulFp6BN254_a2_x)
39
+ $ => D :MLOAD(escalarMulFp6BN254_a2_y), CALL(escalarMulFp2BN254)
40
+ E :MSTORE(escalarMulFp6BN254_c2_x)
41
+ C :MSTORE(escalarMulFp6BN254_c2_y)
42
+
43
+ ; 3] c3 = a3·b
44
+ $ => A :MLOAD(escalarMulFp6BN254_b)
45
+ $ => C :MLOAD(escalarMulFp6BN254_a3_x)
46
+ $ => D :MLOAD(escalarMulFp6BN254_a3_y), CALL(escalarMulFp2BN254)
47
+ E :MSTORE(escalarMulFp6BN254_c3_x)
48
+ C :MSTORE(escalarMulFp6BN254_c3_y)
49
+
50
+ $ => RR :MLOAD(escalarMulFp6BN254_RR)
51
+ :RETURN
@@ -0,0 +1,208 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; inverseFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²) ∈ Fp6, where ai ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = (a1² - (9 + u)·(a2·a3))·(a1·c1mid + xi·(a3·c2mid + a2·c3mid))⁻¹
8
+ ;; - c2 = ((9 + u)·a3² - (a1·a2))·(a1·c1mid + xi·(a3·c2mid + a2·c3mid))⁻¹
9
+ ;; - c3 = (a2²-a1·a3)·(a1·c1mid + xi·(a3·c2mid + a2·c3mid))⁻¹
10
+ ;; with
11
+ ;; * c1mid = a1² - (9 + u)·(a2·a3)
12
+ ;; * c2mid = (9 + u)·a3² - (a1·a2)
13
+ ;; * c3mid = a2² - (a1·a3)
14
+ ;;
15
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
+
17
+ VAR GLOBAL inverseFp6BN254_a1_x
18
+ VAR GLOBAL inverseFp6BN254_a1_y
19
+ VAR GLOBAL inverseFp6BN254_a2_x
20
+ VAR GLOBAL inverseFp6BN254_a2_y
21
+ VAR GLOBAL inverseFp6BN254_a3_x
22
+ VAR GLOBAL inverseFp6BN254_a3_y
23
+ VAR GLOBAL inverseFp6BN254_c1_x
24
+ VAR GLOBAL inverseFp6BN254_c1_y
25
+ VAR GLOBAL inverseFp6BN254_c2_x
26
+ VAR GLOBAL inverseFp6BN254_c2_y
27
+ VAR GLOBAL inverseFp6BN254_c3_x
28
+ VAR GLOBAL inverseFp6BN254_c3_y
29
+
30
+ VAR GLOBAL inverseFp6BN254_a1square_x
31
+ VAR GLOBAL inverseFp6BN254_a1square_y
32
+ VAR GLOBAL inverseFp6BN254_a2square_x
33
+ VAR GLOBAL inverseFp6BN254_a2square_y
34
+ VAR GLOBAL inverseFp6BN254_a3square_x
35
+ VAR GLOBAL inverseFp6BN254_a3square_y
36
+ VAR GLOBAL inverseFp6BN254_a1a2mul_x
37
+ VAR GLOBAL inverseFp6BN254_a1a2mul_y
38
+ VAR GLOBAL inverseFp6BN254_a1a3mul_x
39
+ VAR GLOBAL inverseFp6BN254_a1a3mul_y
40
+ VAR GLOBAL inverseFp6BN254_a2a3mul_x
41
+ VAR GLOBAL inverseFp6BN254_a2a3mul_y
42
+ VAR GLOBAL inverseFp6BN254_c1mid_x
43
+ VAR GLOBAL inverseFp6BN254_c1mid_y
44
+ VAR GLOBAL inverseFp6BN254_c2mid_x
45
+ VAR GLOBAL inverseFp6BN254_c2mid_y
46
+ VAR GLOBAL inverseFp6BN254_c3mid_x
47
+ VAR GLOBAL inverseFp6BN254_c3mid_y
48
+ VAR GLOBAL inverseFp6BN254_im_x
49
+ VAR GLOBAL inverseFp6BN254_im_y
50
+
51
+ VAR GLOBAL inverseFp6BN254_a3c2mid_x
52
+ VAR GLOBAL inverseFp6BN254_a3c2mid_y
53
+
54
+ VAR GLOBAL inverseFp6BN254_xia2c3mid_x
55
+ VAR GLOBAL inverseFp6BN254_xia2c3mid_y
56
+ VAR GLOBAL inverseFp6BN254_last_x
57
+ VAR GLOBAL inverseFp6BN254_last_y
58
+
59
+ VAR GLOBAL inverseFp6BN254_RR
60
+
61
+ inverseFp6BN254:
62
+ RR :MSTORE(inverseFp6BN254_RR)
63
+
64
+ ; 1] a1²
65
+ $ => A :MLOAD(inverseFp6BN254_a1_x)
66
+ $ => B :MLOAD(inverseFp6BN254_a1_y), CALL(squareFp2BN254)
67
+ E :MSTORE(inverseFp6BN254_a1square_x)
68
+ C :MSTORE(inverseFp6BN254_a1square_y)
69
+
70
+ ; 2] a2²
71
+ $ => A :MLOAD(inverseFp6BN254_a2_x)
72
+ $ => B :MLOAD(inverseFp6BN254_a2_y), CALL(squareFp2BN254)
73
+ E :MSTORE(inverseFp6BN254_a2square_x)
74
+ C :MSTORE(inverseFp6BN254_a2square_y)
75
+
76
+ ; 3] a3²
77
+ $ => A :MLOAD(inverseFp6BN254_a3_x)
78
+ $ => B :MLOAD(inverseFp6BN254_a3_y), CALL(squareFp2BN254)
79
+ E :MSTORE(inverseFp6BN254_a3square_x)
80
+ C :MSTORE(inverseFp6BN254_a3square_y)
81
+
82
+ ; 4] a1·a2
83
+ $ => A :MLOAD(inverseFp6BN254_a1_x)
84
+ $ => B :MLOAD(inverseFp6BN254_a1_y)
85
+ $ => C :MLOAD(inverseFp6BN254_a2_x)
86
+ $ => D :MLOAD(inverseFp6BN254_a2_y), CALL(mulFp2BN254)
87
+ E :MSTORE(inverseFp6BN254_a1a2mul_x)
88
+ C :MSTORE(inverseFp6BN254_a1a2mul_y)
89
+
90
+ ; 5] a1·a3
91
+ $ => A :MLOAD(inverseFp6BN254_a1_x)
92
+ $ => B :MLOAD(inverseFp6BN254_a1_y)
93
+ $ => C :MLOAD(inverseFp6BN254_a3_x)
94
+ $ => D :MLOAD(inverseFp6BN254_a3_y), CALL(mulFp2BN254)
95
+ E :MSTORE(inverseFp6BN254_a1a3mul_x)
96
+ C :MSTORE(inverseFp6BN254_a1a3mul_y)
97
+
98
+ ; 6] a2·a3
99
+ $ => A :MLOAD(inverseFp6BN254_a2_x)
100
+ $ => B :MLOAD(inverseFp6BN254_a2_y)
101
+ $ => C :MLOAD(inverseFp6BN254_a3_x)
102
+ $ => D :MLOAD(inverseFp6BN254_a3_y), CALL(mulFp2BN254)
103
+ E :MSTORE(inverseFp6BN254_a2a3mul_x)
104
+ C :MSTORE(inverseFp6BN254_a2a3mul_y)
105
+
106
+ ; 7] c1mid = a1² - (9 + u)·(a2·a3)
107
+ 9n => A
108
+ 1n => B
109
+ $ => C :MLOAD(inverseFp6BN254_a2a3mul_x)
110
+ $ => D :MLOAD(inverseFp6BN254_a2a3mul_y), CALL(mulFp2BN254)
111
+ $ => A :MLOAD(inverseFp6BN254_a1square_x)
112
+ $ => B :MLOAD(inverseFp6BN254_a1square_y)
113
+ C => D
114
+ E => C :CALL(subFp2BN254)
115
+
116
+ E :MSTORE(inverseFp6BN254_c1mid_x)
117
+ C :MSTORE(inverseFp6BN254_c1mid_y)
118
+
119
+ ; 8] c2mid = (9 + u)·a3² - (a1·a2)
120
+ 9n => A
121
+ 1n => B
122
+ $ => C :MLOAD(inverseFp6BN254_a3square_x)
123
+ $ => D :MLOAD(inverseFp6BN254_a3square_y), CALL(mulFp2BN254)
124
+ E => A
125
+ C => B
126
+ $ => C :MLOAD(inverseFp6BN254_a1a2mul_x)
127
+ $ => D :MLOAD(inverseFp6BN254_a1a2mul_y), CALL(subFp2BN254)
128
+ E :MSTORE(inverseFp6BN254_c2mid_x)
129
+ C :MSTORE(inverseFp6BN254_c2mid_y)
130
+
131
+ ; 9] c3mid = a2² - (a1·a3)
132
+ $ => A :MLOAD(inverseFp6BN254_a2square_x)
133
+ $ => B :MLOAD(inverseFp6BN254_a2square_y)
134
+ $ => C :MLOAD(inverseFp6BN254_a1a3mul_x)
135
+ $ => D :MLOAD(inverseFp6BN254_a1a3mul_y), CALL(subFp2BN254)
136
+ E :MSTORE(inverseFp6BN254_c3mid_x)
137
+ C :MSTORE(inverseFp6BN254_c3mid_y)
138
+
139
+ ; 10] im = a1·c1mid
140
+ $ => A :MLOAD(inverseFp6BN254_a1_x)
141
+ $ => B :MLOAD(inverseFp6BN254_a1_y)
142
+ $ => C :MLOAD(inverseFp6BN254_c1mid_x)
143
+ $ => D :MLOAD(inverseFp6BN254_c1mid_y), CALL(mulFp2BN254)
144
+ E :MSTORE(inverseFp6BN254_im_x)
145
+ C :MSTORE(inverseFp6BN254_im_y)
146
+
147
+ ; 11] last = (im + xi·(a3·c2mid + a2·c3mid))⁻¹
148
+ $ => A :MLOAD(inverseFp6BN254_a3_x)
149
+ $ => B :MLOAD(inverseFp6BN254_a3_y)
150
+ $ => C :MLOAD(inverseFp6BN254_c2mid_x)
151
+ $ => D :MLOAD(inverseFp6BN254_c2mid_y), CALL(mulFp2BN254)
152
+ E :MSTORE(inverseFp6BN254_a3c2mid_x)
153
+ C :MSTORE(inverseFp6BN254_a3c2mid_y)
154
+
155
+ $ => A :MLOAD(inverseFp6BN254_a2_x)
156
+ $ => B :MLOAD(inverseFp6BN254_a2_y)
157
+ $ => C :MLOAD(inverseFp6BN254_c3mid_x)
158
+ $ => D :MLOAD(inverseFp6BN254_c3mid_y), CALL(mulFp2BN254)
159
+
160
+ $ => A :MLOAD(inverseFp6BN254_a3c2mid_x)
161
+ $ => B :MLOAD(inverseFp6BN254_a3c2mid_y)
162
+ C => D
163
+ E => C :CALL(addFp2BN254)
164
+
165
+ 9n => A
166
+ 1n => B
167
+ C => D
168
+ E => C :CALL(mulFp2BN254)
169
+
170
+ $ => A :MLOAD(inverseFp6BN254_im_x)
171
+ $ => B :MLOAD(inverseFp6BN254_im_y)
172
+ C => D
173
+ E => C :CALL(addFp2BN254)
174
+
175
+ E => A
176
+ C => B
177
+ $ => C :MLOAD(inverseFp6BN254_xia2c3mid_x)
178
+ $ => D :MLOAD(inverseFp6BN254_xia2c3mid_y), CALL(addFp2BN254)
179
+ E => A
180
+ C => B :CALL(invFp2BN254)
181
+
182
+ C :MSTORE(inverseFp6BN254_last_x)
183
+ D :MSTORE(inverseFp6BN254_last_y)
184
+
185
+ ; 12] c1 = c1mid·last, c2 = c2mid·last, c3 = c3mid·last
186
+ $ => A :MLOAD(inverseFp6BN254_c1mid_x)
187
+ $ => B :MLOAD(inverseFp6BN254_c1mid_y)
188
+ $ => C :MLOAD(inverseFp6BN254_last_x)
189
+ $ => D :MLOAD(inverseFp6BN254_last_y), CALL(mulFp2BN254)
190
+ E :MSTORE(inverseFp6BN254_c1_x)
191
+ C :MSTORE(inverseFp6BN254_c1_y)
192
+
193
+ $ => A :MLOAD(inverseFp6BN254_c2mid_x)
194
+ $ => B :MLOAD(inverseFp6BN254_c2mid_y)
195
+ $ => C :MLOAD(inverseFp6BN254_last_x)
196
+ $ => D :MLOAD(inverseFp6BN254_last_y), CALL(mulFp2BN254)
197
+ E :MSTORE(inverseFp6BN254_c2_x)
198
+ C :MSTORE(inverseFp6BN254_c2_y)
199
+
200
+ $ => A :MLOAD(inverseFp6BN254_c3mid_x)
201
+ $ => B :MLOAD(inverseFp6BN254_c3mid_y)
202
+ $ => C :MLOAD(inverseFp6BN254_last_x)
203
+ $ => D :MLOAD(inverseFp6BN254_last_y), CALL(mulFp2BN254)
204
+ E :MSTORE(inverseFp6BN254_c3_x)
205
+ C :MSTORE(inverseFp6BN254_c3_y)
206
+
207
+ $ => RR :MLOAD(inverseFp6BN254_RR)
208
+ :RETURN
@@ -0,0 +1,201 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; mulFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²),(b1 + b2·v + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = [(a2+a3)·(b2+b3) - a2·b2 - a3·b3]·(9+u) + a1·b1
8
+ ;; - c2 = (a1+a2)·(b1+b2) - a1·b1 - a2·b2 + (9+u)·(a3·b3)
9
+ ;; - c3 = (a1+a3)·(b1+b3) - a1·b1 + a2·b2 - a3·b3
10
+ ;;
11
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
+
13
+ VAR GLOBAL mulFp6BN254_a1_x
14
+ VAR GLOBAL mulFp6BN254_a1_y
15
+ VAR GLOBAL mulFp6BN254_a2_x
16
+ VAR GLOBAL mulFp6BN254_a2_y
17
+ VAR GLOBAL mulFp6BN254_a3_x
18
+ VAR GLOBAL mulFp6BN254_a3_y
19
+ VAR GLOBAL mulFp6BN254_b1_x
20
+ VAR GLOBAL mulFp6BN254_b1_y
21
+ VAR GLOBAL mulFp6BN254_b2_x
22
+ VAR GLOBAL mulFp6BN254_b2_y
23
+ VAR GLOBAL mulFp6BN254_b3_x
24
+ VAR GLOBAL mulFp6BN254_b3_y
25
+ VAR GLOBAL mulFp6BN254_c1_x
26
+ VAR GLOBAL mulFp6BN254_c1_y
27
+ VAR GLOBAL mulFp6BN254_c2_x
28
+ VAR GLOBAL mulFp6BN254_c2_y
29
+ VAR GLOBAL mulFp6BN254_c3_x
30
+ VAR GLOBAL mulFp6BN254_c3_y
31
+
32
+ VAR GLOBAL mulFp6BN254_a1b1mul_x
33
+ VAR GLOBAL mulFp6BN254_a1b1mul_y
34
+ VAR GLOBAL mulFp6BN254_a2b2mul_x
35
+ VAR GLOBAL mulFp6BN254_a2b2mul_y
36
+ VAR GLOBAL mulFp6BN254_a3b3mul_x
37
+ VAR GLOBAL mulFp6BN254_a3b3mul_y
38
+ VAR GLOBAL mulFp6BN254_a3b3ximul_x
39
+ VAR GLOBAL mulFp6BN254_a3b3ximul_y
40
+
41
+ VAR GLOBAL mulFp6BN254_a2a3sum_x
42
+ VAR GLOBAL mulFp6BN254_a2a3sum_y
43
+ VAR GLOBAL mulFp6BN254_b2b3sum_x
44
+ VAR GLOBAL mulFp6BN254_b2b3sum_y
45
+ VAR GLOBAL mulFp6BN254_a1a2sum_x
46
+ VAR GLOBAL mulFp6BN254_a1a2sum_y
47
+ VAR GLOBAL mulFp6BN254_b1b2sum_x
48
+ VAR GLOBAL mulFp6BN254_b1b2sum_y
49
+ VAR GLOBAL mulFp6BN254_a1a3sum_x
50
+ VAR GLOBAL mulFp6BN254_a1a3sum_y
51
+ VAR GLOBAL mulFp6BN254_b1b3sum_x
52
+ VAR GLOBAL mulFp6BN254_b1b3sum_y
53
+
54
+ VAR GLOBAL mulFp6BN254_RR
55
+
56
+ mulFp6BN254:
57
+ RR :MSTORE(mulFp6BN254_RR)
58
+
59
+ ; 1] a1·b1, a2·b2, a3·b3, a3·b3·(9+u)
60
+ $ => A :MLOAD(mulFp6BN254_a1_x)
61
+ $ => B :MLOAD(mulFp6BN254_a1_y)
62
+ $ => C :MLOAD(mulFp6BN254_b1_x)
63
+ $ => D :MLOAD(mulFp6BN254_b1_y), CALL(mulFp2BN254)
64
+ E :MSTORE(mulFp6BN254_a1b1mul_x)
65
+ C :MSTORE(mulFp6BN254_a1b1mul_y)
66
+
67
+ $ => A :MLOAD(mulFp6BN254_a2_x)
68
+ $ => B :MLOAD(mulFp6BN254_a2_y)
69
+ $ => C :MLOAD(mulFp6BN254_b2_x)
70
+ $ => D :MLOAD(mulFp6BN254_b2_y), CALL(mulFp2BN254)
71
+ E :MSTORE(mulFp6BN254_a2b2mul_x)
72
+ C :MSTORE(mulFp6BN254_a2b2mul_y)
73
+
74
+ $ => A :MLOAD(mulFp6BN254_a3_x)
75
+ $ => B :MLOAD(mulFp6BN254_a3_y)
76
+ $ => C :MLOAD(mulFp6BN254_b3_x)
77
+ $ => D :MLOAD(mulFp6BN254_b3_y), CALL(mulFp2BN254)
78
+ E :MSTORE(mulFp6BN254_a3b3mul_x)
79
+ C :MSTORE(mulFp6BN254_a3b3mul_y)
80
+
81
+ E => A
82
+ C => B
83
+ 9n => C
84
+ 1n => D :CALL(mulFp2BN254)
85
+
86
+ E :MSTORE(mulFp6BN254_a3b3ximul_x)
87
+ C :MSTORE(mulFp6BN254_a3b3ximul_y)
88
+
89
+ ; 2] a2+a3, b2+b3, a1+a2, b1+b2, a1+a3, b1+b3
90
+ $ => A :MLOAD(mulFp6BN254_a2_x)
91
+ $ => B :MLOAD(mulFp6BN254_a2_y)
92
+ $ => C :MLOAD(mulFp6BN254_a3_x)
93
+ $ => D :MLOAD(mulFp6BN254_a3_y), CALL(addFp2BN254)
94
+ E :MSTORE(mulFp6BN254_a2a3sum_x)
95
+ C :MSTORE(mulFp6BN254_a2a3sum_y)
96
+
97
+ $ => A :MLOAD(mulFp6BN254_b2_x)
98
+ $ => B :MLOAD(mulFp6BN254_b2_y)
99
+ $ => C :MLOAD(mulFp6BN254_b3_x)
100
+ $ => D :MLOAD(mulFp6BN254_b3_y), CALL(addFp2BN254)
101
+ E :MSTORE(mulFp6BN254_b2b3sum_x)
102
+ C :MSTORE(mulFp6BN254_b2b3sum_y)
103
+
104
+ $ => A :MLOAD(mulFp6BN254_a1_x)
105
+ $ => B :MLOAD(mulFp6BN254_a1_y)
106
+ $ => C :MLOAD(mulFp6BN254_a2_x)
107
+ $ => D :MLOAD(mulFp6BN254_a2_y), CALL(addFp2BN254)
108
+ E :MSTORE(mulFp6BN254_a1a2sum_x)
109
+ C :MSTORE(mulFp6BN254_a1a2sum_y)
110
+
111
+ $ => A :MLOAD(mulFp6BN254_b1_x)
112
+ $ => B :MLOAD(mulFp6BN254_b1_y)
113
+ $ => C :MLOAD(mulFp6BN254_b2_x)
114
+ $ => D :MLOAD(mulFp6BN254_b2_y), CALL(addFp2BN254)
115
+ E :MSTORE(mulFp6BN254_b1b2sum_x)
116
+ C :MSTORE(mulFp6BN254_b1b2sum_y)
117
+
118
+ $ => A :MLOAD(mulFp6BN254_a1_x)
119
+ $ => B :MLOAD(mulFp6BN254_a1_y)
120
+ $ => C :MLOAD(mulFp6BN254_a3_x)
121
+ $ => D :MLOAD(mulFp6BN254_a3_y), CALL(addFp2BN254)
122
+ E :MSTORE(mulFp6BN254_a1a3sum_x)
123
+ C :MSTORE(mulFp6BN254_a1a3sum_y)
124
+
125
+ $ => A :MLOAD(mulFp6BN254_b1_x)
126
+ $ => B :MLOAD(mulFp6BN254_b1_y)
127
+ $ => C :MLOAD(mulFp6BN254_b3_x)
128
+ $ => D :MLOAD(mulFp6BN254_b3_y), CALL(addFp2BN254)
129
+ E :MSTORE(mulFp6BN254_b1b3sum_x)
130
+ C :MSTORE(mulFp6BN254_b1b3sum_y)
131
+
132
+ ; 3] c1
133
+ $ => A :MLOAD(mulFp6BN254_a2a3sum_x)
134
+ $ => B :MLOAD(mulFp6BN254_a2a3sum_y)
135
+ $ => C :MLOAD(mulFp6BN254_b2b3sum_x)
136
+ $ => D :MLOAD(mulFp6BN254_b2b3sum_y), CALL(mulFp2BN254)
137
+
138
+ E => A
139
+ C => B
140
+ $ => C :MLOAD(mulFp6BN254_a2b2mul_x)
141
+ $ => D :MLOAD(mulFp6BN254_a2b2mul_y), CALL(subFp2BN254)
142
+ E => A
143
+ C => B
144
+ $ => C :MLOAD(mulFp6BN254_a3b3mul_x)
145
+ $ => D :MLOAD(mulFp6BN254_a3b3mul_y), CALL(subFp2BN254)
146
+ E => A
147
+ C => B
148
+ 9n => C
149
+ 1n => D :CALL(mulFp2BN254)
150
+
151
+ E => A
152
+ C => B
153
+ $ => C :MLOAD(mulFp6BN254_a1b1mul_x)
154
+ $ => D :MLOAD(mulFp6BN254_a1b1mul_y), CALL(addFp2BN254)
155
+ E :MSTORE(mulFp6BN254_c1_x)
156
+ C :MSTORE(mulFp6BN254_c1_y)
157
+
158
+ ; 4] c2
159
+ $ => A :MLOAD(mulFp6BN254_a1a2sum_x)
160
+ $ => B :MLOAD(mulFp6BN254_a1a2sum_y)
161
+ $ => C :MLOAD(mulFp6BN254_b1b2sum_x)
162
+ $ => D :MLOAD(mulFp6BN254_b1b2sum_y), CALL(mulFp2BN254)
163
+
164
+ E => A
165
+ C => B
166
+ $ => C :MLOAD(mulFp6BN254_a1b1mul_x)
167
+ $ => D :MLOAD(mulFp6BN254_a1b1mul_y), CALL(subFp2BN254)
168
+ E => A
169
+ C => B
170
+ $ => C :MLOAD(mulFp6BN254_a2b2mul_x)
171
+ $ => D :MLOAD(mulFp6BN254_a2b2mul_y), CALL(subFp2BN254)
172
+ E => A
173
+ C => B
174
+ $ => C :MLOAD(mulFp6BN254_a3b3ximul_x)
175
+ $ => D :MLOAD(mulFp6BN254_a3b3ximul_y), CALL(addFp2BN254)
176
+ E :MSTORE(mulFp6BN254_c2_x)
177
+ C :MSTORE(mulFp6BN254_c2_y)
178
+
179
+ ; 5] c3
180
+ $ => A :MLOAD(mulFp6BN254_a1a3sum_x)
181
+ $ => B :MLOAD(mulFp6BN254_a1a3sum_y)
182
+ $ => C :MLOAD(mulFp6BN254_b1b3sum_x)
183
+ $ => D :MLOAD(mulFp6BN254_b1b3sum_y), CALL(mulFp2BN254)
184
+
185
+ E => A
186
+ C => B
187
+ $ => C :MLOAD(mulFp6BN254_a1b1mul_x)
188
+ $ => D :MLOAD(mulFp6BN254_a1b1mul_y), CALL(subFp2BN254)
189
+ E => A
190
+ C => B
191
+ $ => C :MLOAD(mulFp6BN254_a2b2mul_x)
192
+ $ => D :MLOAD(mulFp6BN254_a2b2mul_y), CALL(addFp2BN254)
193
+ E => A
194
+ C => B
195
+ $ => C :MLOAD(mulFp6BN254_a3b3mul_x)
196
+ $ => D :MLOAD(mulFp6BN254_a3b3mul_y), CALL(subFp2BN254)
197
+ E :MSTORE(mulFp6BN254_c3_x)
198
+ C :MSTORE(mulFp6BN254_c3_y)
199
+
200
+ $ => RR :MLOAD(mulFp6BN254_RR)
201
+ :RETURN
@@ -0,0 +1,65 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; sparseMulAFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²),b2·v ∈ Fp6, where ai,b2 ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = b2·a3·(9+u)
8
+ ;; - c2 = b2·a1
9
+ ;; - c3 = b2·a2
10
+ ;;
11
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
+
13
+ VAR GLOBAL sparseMulAFp6BN254_a1_x
14
+ VAR GLOBAL sparseMulAFp6BN254_a1_y
15
+ VAR GLOBAL sparseMulAFp6BN254_a2_x
16
+ VAR GLOBAL sparseMulAFp6BN254_a2_y
17
+ VAR GLOBAL sparseMulAFp6BN254_a3_x
18
+ VAR GLOBAL sparseMulAFp6BN254_a3_y
19
+
20
+ VAR GLOBAL sparseMulAFp6BN254_b2_x
21
+ VAR GLOBAL sparseMulAFp6BN254_b2_y
22
+
23
+ VAR GLOBAL sparseMulAFp6BN254_c1_x
24
+ VAR GLOBAL sparseMulAFp6BN254_c1_y
25
+ VAR GLOBAL sparseMulAFp6BN254_c2_x
26
+ VAR GLOBAL sparseMulAFp6BN254_c2_y
27
+ VAR GLOBAL sparseMulAFp6BN254_c3_x
28
+ VAR GLOBAL sparseMulAFp6BN254_c3_y
29
+
30
+ VAR GLOBAL sparseMulAFp6BN254_RR
31
+
32
+ sparseMulAFp6BN254:
33
+ RR :MSTORE(sparseMulAFp6BN254_RR)
34
+
35
+ ; 1] c1 = b2·a3·(9+u)
36
+ $ => A :MLOAD(sparseMulAFp6BN254_b2_x)
37
+ $ => B :MLOAD(sparseMulAFp6BN254_b2_y)
38
+ $ => C :MLOAD(sparseMulAFp6BN254_a3_x)
39
+ $ => D :MLOAD(sparseMulAFp6BN254_a3_y), CALL(mulFp2BN254)
40
+ E => A
41
+ C => B
42
+ 9n => C
43
+ 1n => D :CALL(mulFp2BN254)
44
+
45
+ E :MSTORE(sparseMulAFp6BN254_c1_x)
46
+ C :MSTORE(sparseMulAFp6BN254_c1_y)
47
+
48
+ ; 2] c2 = b2·a1
49
+ $ => A :MLOAD(sparseMulAFp6BN254_b2_x)
50
+ $ => B :MLOAD(sparseMulAFp6BN254_b2_y)
51
+ $ => C :MLOAD(sparseMulAFp6BN254_a1_x)
52
+ $ => D :MLOAD(sparseMulAFp6BN254_a1_y), CALL(mulFp2BN254)
53
+ E :MSTORE(sparseMulAFp6BN254_c2_x)
54
+ C :MSTORE(sparseMulAFp6BN254_c2_y)
55
+
56
+ ; 3] c3 = b2·a2
57
+ $ => A :MLOAD(sparseMulAFp6BN254_b2_x)
58
+ $ => B :MLOAD(sparseMulAFp6BN254_b2_y)
59
+ $ => C :MLOAD(sparseMulAFp6BN254_a2_x)
60
+ $ => D :MLOAD(sparseMulAFp6BN254_a2_y), CALL(mulFp2BN254)
61
+ E :MSTORE(sparseMulAFp6BN254_c3_x)
62
+ C :MSTORE(sparseMulAFp6BN254_c3_y)
63
+
64
+ $ => RR :MLOAD(sparseMulAFp6BN254_RR)
65
+ :RETURN
@@ -0,0 +1,134 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; sparseMulBFp6BN254:
5
+ ;; in: (a1 + a2·v + a3·v²),(b2·v + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
6
+ ;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
7
+ ;; - c1 = [(a2 + a3)·(b2 + b3) - a2·b2 - a3·b3]·(9+u)
8
+ ;; - c2 = a1·b2 + a3·b3·(9+u)
9
+ ;; - c3 = (a1 + a3)·b3 - a3·b3 + a2·b2
10
+ ;;
11
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
+
13
+ VAR GLOBAL sparseMulBFp6BN254_a1_x
14
+ VAR GLOBAL sparseMulBFp6BN254_a1_y
15
+ VAR GLOBAL sparseMulBFp6BN254_a2_x
16
+ VAR GLOBAL sparseMulBFp6BN254_a2_y
17
+ VAR GLOBAL sparseMulBFp6BN254_a3_x
18
+ VAR GLOBAL sparseMulBFp6BN254_a3_y
19
+
20
+ VAR GLOBAL sparseMulBFp6BN254_b2_x
21
+ VAR GLOBAL sparseMulBFp6BN254_b2_y
22
+ VAR GLOBAL sparseMulBFp6BN254_b3_x
23
+ VAR GLOBAL sparseMulBFp6BN254_b3_y
24
+
25
+ VAR GLOBAL sparseMulBFp6BN254_c1_x
26
+ VAR GLOBAL sparseMulBFp6BN254_c1_y
27
+ VAR GLOBAL sparseMulBFp6BN254_c2_x
28
+ VAR GLOBAL sparseMulBFp6BN254_c2_y
29
+ VAR GLOBAL sparseMulBFp6BN254_c3_x
30
+ VAR GLOBAL sparseMulBFp6BN254_c3_y
31
+
32
+ VAR GLOBAL sparseMulBFp6BN254_a2b2_x
33
+ VAR GLOBAL sparseMulBFp6BN254_a2b2_y
34
+ VAR GLOBAL sparseMulBFp6BN254_a3b3_x
35
+ VAR GLOBAL sparseMulBFp6BN254_a3b3_y
36
+ VAR GLOBAL sparseMulBFp6BN254_a2a3sum_x
37
+ VAR GLOBAL sparseMulBFp6BN254_a2a3sum_y
38
+ VAR GLOBAL sparseMulBFp6BN254_a1b2_x
39
+ VAR GLOBAL sparseMulBFp6BN254_a1b2_y
40
+
41
+ VAR GLOBAL sparseMulBFp6BN254_RR
42
+
43
+ sparseMulBFp6BN254:
44
+ RR :MSTORE(sparseMulBFp6BN254_RR)
45
+
46
+ ; 1] a2·b2, a3·b3
47
+ $ => A :MLOAD(sparseMulBFp6BN254_a2_x)
48
+ $ => B :MLOAD(sparseMulBFp6BN254_a2_y)
49
+ $ => C :MLOAD(sparseMulBFp6BN254_b2_x)
50
+ $ => D :MLOAD(sparseMulBFp6BN254_b2_y), CALL(mulFp2BN254)
51
+ E :MSTORE(sparseMulBFp6BN254_a2b2_x)
52
+ C :MSTORE(sparseMulBFp6BN254_a2b2_y)
53
+
54
+ $ => A :MLOAD(sparseMulBFp6BN254_a3_x)
55
+ $ => B :MLOAD(sparseMulBFp6BN254_a3_y)
56
+ $ => C :MLOAD(sparseMulBFp6BN254_b3_x)
57
+ $ => D :MLOAD(sparseMulBFp6BN254_b3_y), CALL(mulFp2BN254)
58
+ E :MSTORE(sparseMulBFp6BN254_a3b3_x)
59
+ C :MSTORE(sparseMulBFp6BN254_a3b3_y)
60
+
61
+ ; 2] c1 = ((a2 + a3)·(b2 + b3) - a2·b2 - a3·b3)·(9+u)
62
+ $ => A :MLOAD(sparseMulBFp6BN254_a2_x)
63
+ $ => B :MLOAD(sparseMulBFp6BN254_a2_y)
64
+ $ => C :MLOAD(sparseMulBFp6BN254_a3_x)
65
+ $ => D :MLOAD(sparseMulBFp6BN254_a3_y), CALL(addFp2BN254)
66
+ E :MSTORE(sparseMulBFp6BN254_a2a3sum_x)
67
+ C :MSTORE(sparseMulBFp6BN254_a2a3sum_y)
68
+
69
+ $ => A :MLOAD(sparseMulBFp6BN254_b2_x)
70
+ $ => B :MLOAD(sparseMulBFp6BN254_b2_y)
71
+ $ => C :MLOAD(sparseMulBFp6BN254_b3_x)
72
+ $ => D :MLOAD(sparseMulBFp6BN254_b3_y), CALL(addFp2BN254)
73
+ E => A
74
+ C => B
75
+ $ => C :MLOAD(sparseMulBFp6BN254_a2a3sum_x)
76
+ $ => D :MLOAD(sparseMulBFp6BN254_a2a3sum_y), CALL(mulFp2BN254)
77
+ E => A
78
+ C => B
79
+ $ => C :MLOAD(sparseMulBFp6BN254_a2b2_x)
80
+ $ => D :MLOAD(sparseMulBFp6BN254_a2b2_y), CALL(subFp2BN254)
81
+ E => A
82
+ C => B
83
+ $ => C :MLOAD(sparseMulBFp6BN254_a3b3_x)
84
+ $ => D :MLOAD(sparseMulBFp6BN254_a3b3_y), CALL(subFp2BN254)
85
+ E => A
86
+ C => B
87
+ 9n => C
88
+ 1n => D :CALL(mulFp2BN254)
89
+
90
+ E :MSTORE(sparseMulBFp6BN254_c1_x)
91
+ C :MSTORE(sparseMulBFp6BN254_c1_y)
92
+
93
+ ; 3] c2 = a1·b2 + a3·b3·(9+u)
94
+ $ => A :MLOAD(sparseMulBFp6BN254_a1_x)
95
+ $ => B :MLOAD(sparseMulBFp6BN254_a1_y)
96
+ $ => C :MLOAD(sparseMulBFp6BN254_b2_x)
97
+ $ => D :MLOAD(sparseMulBFp6BN254_b2_y), CALL(mulFp2BN254)
98
+ E :MSTORE(sparseMulBFp6BN254_a1b2_x)
99
+ C :MSTORE(sparseMulBFp6BN254_a1b2_y)
100
+
101
+ $ => A :MLOAD(sparseMulBFp6BN254_a3b3_x)
102
+ $ => B :MLOAD(sparseMulBFp6BN254_a3b3_y)
103
+ 9n => C
104
+ 1n => D :CALL(mulFp2BN254)
105
+
106
+ E => A
107
+ C => B
108
+ $ => C :MLOAD(sparseMulBFp6BN254_a1b2_x)
109
+ $ => D :MLOAD(sparseMulBFp6BN254_a1b2_y), CALL(addFp2BN254)
110
+ E :MSTORE(sparseMulBFp6BN254_c2_x)
111
+ C :MSTORE(sparseMulBFp6BN254_c2_y)
112
+
113
+ ; 4] c3 = (a1 + a3)·b3 - a3·b3 + a2·b2
114
+ $ => A :MLOAD(sparseMulBFp6BN254_a1_x)
115
+ $ => B :MLOAD(sparseMulBFp6BN254_a1_y)
116
+ $ => C :MLOAD(sparseMulBFp6BN254_a3_x)
117
+ $ => D :MLOAD(sparseMulBFp6BN254_a3_y), CALL(addFp2BN254)
118
+ E => A
119
+ C => B
120
+ $ => C :MLOAD(sparseMulBFp6BN254_b3_x)
121
+ $ => D :MLOAD(sparseMulBFp6BN254_b3_y), CALL(mulFp2BN254)
122
+ E => A
123
+ C => B
124
+ $ => C :MLOAD(sparseMulBFp6BN254_a3b3_x)
125
+ $ => D :MLOAD(sparseMulBFp6BN254_a3b3_y), CALL(subFp2BN254)
126
+ E => A
127
+ C => B
128
+ $ => C :MLOAD(sparseMulBFp6BN254_a2b2_x)
129
+ $ => D :MLOAD(sparseMulBFp6BN254_a2b2_y), CALL(addFp2BN254)
130
+ E :MSTORE(sparseMulBFp6BN254_c3_x)
131
+ C :MSTORE(sparseMulBFp6BN254_c3_y)
132
+
133
+ $ => RR :MLOAD(sparseMulBFp6BN254_RR)
134
+ :RETURN