@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,228 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP4/FP2 arithmetic
3
+ ;;
4
+ ;; squareCycloFp12BN254:
5
+ ;; in: (a1 + a2·w) ∈ GΦ6(p²), where ai ∈ Fp6
6
+ ;; out: (c1 + c2·w) = (a1 + a2·w)² ∈ GΦ6(p²)
7
+ ;;
8
+ ;; NOTE: The output is not guaranteed to be in GΦ6(p²), if the input isn't.
9
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
+
11
+ VAR GLOBAL squareCycloFp12BN254_a11_x
12
+ VAR GLOBAL squareCycloFp12BN254_a11_y
13
+ VAR GLOBAL squareCycloFp12BN254_a12_x
14
+ VAR GLOBAL squareCycloFp12BN254_a12_y
15
+ VAR GLOBAL squareCycloFp12BN254_a13_x
16
+ VAR GLOBAL squareCycloFp12BN254_a13_y
17
+ VAR GLOBAL squareCycloFp12BN254_a21_x
18
+ VAR GLOBAL squareCycloFp12BN254_a21_y
19
+ VAR GLOBAL squareCycloFp12BN254_a22_x
20
+ VAR GLOBAL squareCycloFp12BN254_a22_y
21
+ VAR GLOBAL squareCycloFp12BN254_a23_x
22
+ VAR GLOBAL squareCycloFp12BN254_a23_y
23
+ VAR GLOBAL squareCycloFp12BN254_c11_x
24
+ VAR GLOBAL squareCycloFp12BN254_c11_y
25
+ VAR GLOBAL squareCycloFp12BN254_c12_x
26
+ VAR GLOBAL squareCycloFp12BN254_c12_y
27
+ VAR GLOBAL squareCycloFp12BN254_c13_x
28
+ VAR GLOBAL squareCycloFp12BN254_c13_y
29
+ VAR GLOBAL squareCycloFp12BN254_c21_x
30
+ VAR GLOBAL squareCycloFp12BN254_c21_y
31
+ VAR GLOBAL squareCycloFp12BN254_c22_x
32
+ VAR GLOBAL squareCycloFp12BN254_c22_y
33
+ VAR GLOBAL squareCycloFp12BN254_c23_x
34
+ VAR GLOBAL squareCycloFp12BN254_c23_y
35
+
36
+ VAR GLOBAL squareCycloFp12BN254_t11_x
37
+ VAR GLOBAL squareCycloFp12BN254_t11_y
38
+ VAR GLOBAL squareCycloFp12BN254_t22_x
39
+ VAR GLOBAL squareCycloFp12BN254_t22_y
40
+ VAR GLOBAL squareCycloFp12BN254_t23_x
41
+ VAR GLOBAL squareCycloFp12BN254_t23_y
42
+ VAR GLOBAL squareCycloFp12BN254_t12_x
43
+ VAR GLOBAL squareCycloFp12BN254_t12_y
44
+ VAR GLOBAL squareCycloFp12BN254_t13_x
45
+ VAR GLOBAL squareCycloFp12BN254_t13_y
46
+ VAR GLOBAL squareCycloFp12BN254_aux_x
47
+ VAR GLOBAL squareCycloFp12BN254_aux_y
48
+ VAR GLOBAL squareCycloFp12BN254_t21_x
49
+ VAR GLOBAL squareCycloFp12BN254_t21_y
50
+
51
+ VAR GLOBAL squareCycloFp12BN254_RR
52
+
53
+ squareCycloFp12BN254:
54
+ RR :MSTORE(squareCycloFp12BN254_RR)
55
+
56
+ ; 1] [t11,t22] = (a11 + a22·V)²
57
+ $ => A :MLOAD(squareCycloFp12BN254_a11_x)
58
+ $ => B :MLOAD(squareCycloFp12BN254_a11_y)
59
+ $ => C :MLOAD(squareCycloFp12BN254_a22_x)
60
+ $ => D :MLOAD(squareCycloFp12BN254_a22_y)
61
+ A :MSTORE(squareFp4BN254_a1_x)
62
+ B :MSTORE(squareFp4BN254_a1_y)
63
+ C :MSTORE(squareFp4BN254_a2_x)
64
+ D :MSTORE(squareFp4BN254_a2_y), CALL(squareFp4BN254)
65
+ $ => A :MLOAD(squareFp4BN254_c1_x)
66
+ $ => B :MLOAD(squareFp4BN254_c1_y)
67
+ $ => C :MLOAD(squareFp4BN254_c2_x)
68
+ $ => D :MLOAD(squareFp4BN254_c2_y)
69
+ A :MSTORE(squareCycloFp12BN254_t11_x)
70
+ B :MSTORE(squareCycloFp12BN254_t11_y)
71
+ C :MSTORE(squareCycloFp12BN254_t22_x)
72
+ D :MSTORE(squareCycloFp12BN254_t22_y)
73
+
74
+ ; 2] [t23,t12] = (a21 + a13·V)²
75
+ $ => A :MLOAD(squareCycloFp12BN254_a21_x)
76
+ $ => B :MLOAD(squareCycloFp12BN254_a21_y)
77
+ $ => C :MLOAD(squareCycloFp12BN254_a13_x)
78
+ $ => D :MLOAD(squareCycloFp12BN254_a13_y)
79
+ A :MSTORE(squareFp4BN254_a1_x)
80
+ B :MSTORE(squareFp4BN254_a1_y)
81
+ C :MSTORE(squareFp4BN254_a2_x)
82
+ D :MSTORE(squareFp4BN254_a2_y), CALL(squareFp4BN254)
83
+ $ => A :MLOAD(squareFp4BN254_c1_x)
84
+ $ => B :MLOAD(squareFp4BN254_c1_y)
85
+ $ => C :MLOAD(squareFp4BN254_c2_x)
86
+ $ => D :MLOAD(squareFp4BN254_c2_y)
87
+ A :MSTORE(squareCycloFp12BN254_t23_x)
88
+ B :MSTORE(squareCycloFp12BN254_t23_y)
89
+ C :MSTORE(squareCycloFp12BN254_t12_x)
90
+ D :MSTORE(squareCycloFp12BN254_t12_y)
91
+
92
+ ; 3] [t13,aux] = (a12 + a23·V)²
93
+ $ => A :MLOAD(squareCycloFp12BN254_a12_x)
94
+ $ => B :MLOAD(squareCycloFp12BN254_a12_y)
95
+ $ => C :MLOAD(squareCycloFp12BN254_a23_x)
96
+ $ => D :MLOAD(squareCycloFp12BN254_a23_y)
97
+ A :MSTORE(squareFp4BN254_a1_x)
98
+ B :MSTORE(squareFp4BN254_a1_y)
99
+ C :MSTORE(squareFp4BN254_a2_x)
100
+ D :MSTORE(squareFp4BN254_a2_y), CALL(squareFp4BN254)
101
+ $ => A :MLOAD(squareFp4BN254_c1_x)
102
+ $ => B :MLOAD(squareFp4BN254_c1_y)
103
+ $ => C :MLOAD(squareFp4BN254_c2_x)
104
+ $ => D :MLOAD(squareFp4BN254_c2_y)
105
+ A :MSTORE(squareCycloFp12BN254_t13_x)
106
+ B :MSTORE(squareCycloFp12BN254_t13_y)
107
+ C :MSTORE(squareCycloFp12BN254_aux_x)
108
+ D :MSTORE(squareCycloFp12BN254_aux_y)
109
+
110
+ ; 4] t21 = aux·(9+u)
111
+ $ => A :MLOAD(squareCycloFp12BN254_aux_x)
112
+ $ => B :MLOAD(squareCycloFp12BN254_aux_y)
113
+ 9n => C
114
+ 1n => D :CALL(mulFp2BN254)
115
+ E :MSTORE(squareCycloFp12BN254_t21_x)
116
+ C :MSTORE(squareCycloFp12BN254_t21_y)
117
+
118
+ ; 5] c11 = -2·a11 + 3·t11
119
+ %BN254_P - 2n => A
120
+ $ => C :MLOAD(squareCycloFp12BN254_a11_x)
121
+ $ => D :MLOAD(squareCycloFp12BN254_a11_y), CALL(escalarMulFp2BN254)
122
+ E :MSTORE(squareCycloFp12BN254_a11_x)
123
+ C :MSTORE(squareCycloFp12BN254_a11_y)
124
+
125
+ 3n => A
126
+ $ => C :MLOAD(squareCycloFp12BN254_t11_x)
127
+ $ => D :MLOAD(squareCycloFp12BN254_t11_y), CALL(escalarMulFp2BN254)
128
+
129
+ E => A
130
+ C => B
131
+ $ => C :MLOAD(squareCycloFp12BN254_a11_x)
132
+ $ => D :MLOAD(squareCycloFp12BN254_a11_y), CALL(addFp2BN254)
133
+ E :MSTORE(squareCycloFp12BN254_c11_x)
134
+ C :MSTORE(squareCycloFp12BN254_c11_y)
135
+
136
+ ; 6] c12 = -2·a12 + 3·t23
137
+ %BN254_P - 2n => A
138
+ $ => C :MLOAD(squareCycloFp12BN254_a12_x)
139
+ $ => D :MLOAD(squareCycloFp12BN254_a12_y), CALL(escalarMulFp2BN254)
140
+ E :MSTORE(squareCycloFp12BN254_a12_x)
141
+ C :MSTORE(squareCycloFp12BN254_a12_y)
142
+
143
+ 3n => A
144
+ $ => C :MLOAD(squareCycloFp12BN254_t23_x)
145
+ $ => D :MLOAD(squareCycloFp12BN254_t23_y), CALL(escalarMulFp2BN254)
146
+
147
+ E => A
148
+ C => B
149
+ $ => C :MLOAD(squareCycloFp12BN254_a12_x)
150
+ $ => D :MLOAD(squareCycloFp12BN254_a12_y), CALL(addFp2BN254)
151
+ E :MSTORE(squareCycloFp12BN254_c12_x)
152
+ C :MSTORE(squareCycloFp12BN254_c12_y)
153
+
154
+ ; 7] c13 = -2·a13 + 3·t13
155
+ %BN254_P - 2n => A
156
+ $ => C :MLOAD(squareCycloFp12BN254_a13_x)
157
+ $ => D :MLOAD(squareCycloFp12BN254_a13_y), CALL(escalarMulFp2BN254)
158
+ E :MSTORE(squareCycloFp12BN254_a13_x)
159
+ C :MSTORE(squareCycloFp12BN254_a13_y)
160
+
161
+ 3n => A
162
+ $ => C :MLOAD(squareCycloFp12BN254_t13_x)
163
+ $ => D :MLOAD(squareCycloFp12BN254_t13_y), CALL(escalarMulFp2BN254)
164
+
165
+ E => A
166
+ C => B
167
+ $ => C :MLOAD(squareCycloFp12BN254_a13_x)
168
+ $ => D :MLOAD(squareCycloFp12BN254_a13_y), CALL(addFp2BN254)
169
+ E :MSTORE(squareCycloFp12BN254_c13_x)
170
+ C :MSTORE(squareCycloFp12BN254_c13_y)
171
+
172
+ ; 8] c21 = 2·a21 + 3·t21
173
+ 2n => A
174
+ $ => C :MLOAD(squareCycloFp12BN254_a21_x)
175
+ $ => D :MLOAD(squareCycloFp12BN254_a21_y), CALL(escalarMulFp2BN254)
176
+ E :MSTORE(squareCycloFp12BN254_a21_x)
177
+ C :MSTORE(squareCycloFp12BN254_a21_y)
178
+
179
+ 3n => A
180
+ $ => C :MLOAD(squareCycloFp12BN254_t21_x)
181
+ $ => D :MLOAD(squareCycloFp12BN254_t21_y), CALL(escalarMulFp2BN254)
182
+
183
+ E => A
184
+ C => B
185
+ $ => C :MLOAD(squareCycloFp12BN254_a21_x)
186
+ $ => D :MLOAD(squareCycloFp12BN254_a21_y), CALL(addFp2BN254)
187
+ E :MSTORE(squareCycloFp12BN254_c21_x)
188
+ C :MSTORE(squareCycloFp12BN254_c21_y)
189
+
190
+ ; 9] c22 = 2·a22 + 3·t22
191
+ 2n => A
192
+ $ => C :MLOAD(squareCycloFp12BN254_a22_x)
193
+ $ => D :MLOAD(squareCycloFp12BN254_a22_y), CALL(escalarMulFp2BN254)
194
+ E :MSTORE(squareCycloFp12BN254_a22_x)
195
+ C :MSTORE(squareCycloFp12BN254_a22_y)
196
+
197
+ 3n => A
198
+ $ => C :MLOAD(squareCycloFp12BN254_t22_x)
199
+ $ => D :MLOAD(squareCycloFp12BN254_t22_y), CALL(escalarMulFp2BN254)
200
+
201
+ E => A
202
+ C => B
203
+ $ => C :MLOAD(squareCycloFp12BN254_a22_x)
204
+ $ => D :MLOAD(squareCycloFp12BN254_a22_y), CALL(addFp2BN254)
205
+ E :MSTORE(squareCycloFp12BN254_c22_x)
206
+ C :MSTORE(squareCycloFp12BN254_c22_y)
207
+
208
+ ; 9] c23 = 2·a23 + 3·t12
209
+ 2n => A
210
+ $ => C :MLOAD(squareCycloFp12BN254_a23_x)
211
+ $ => D :MLOAD(squareCycloFp12BN254_a23_y), CALL(escalarMulFp2BN254)
212
+ E :MSTORE(squareCycloFp12BN254_a23_x)
213
+ C :MSTORE(squareCycloFp12BN254_a23_y)
214
+
215
+ 3n => A
216
+ $ => C :MLOAD(squareCycloFp12BN254_t12_x)
217
+ $ => D :MLOAD(squareCycloFp12BN254_t12_y), CALL(escalarMulFp2BN254)
218
+
219
+ E => A
220
+ C => B
221
+ $ => C :MLOAD(squareCycloFp12BN254_a23_x)
222
+ $ => D :MLOAD(squareCycloFp12BN254_a23_y), CALL(addFp2BN254)
223
+ E :MSTORE(squareCycloFp12BN254_c23_x)
224
+ C :MSTORE(squareCycloFp12BN254_c23_y)
225
+
226
+
227
+ $ => RR :MLOAD(squareCycloFp12BN254_RR)
228
+ :RETURN
@@ -0,0 +1,64 @@
1
+ ;;
2
+ ;; parameter of BN254 x = 4965661367192848881, which can be expressed in (little-endian) binary as:
3
+ ;; 100011111001000010010110010100100010110101001001100101110010001
4
+ ;;
5
+
6
+ xBinDecompBN254:
7
+ 1 => B :RETURN
8
+ 0 => B :RETURN
9
+ 0 => B :RETURN
10
+ 0 => B :RETURN
11
+ 1 => B :RETURN
12
+ 0 => B :RETURN
13
+ 0 => B :RETURN
14
+ 1 => B :RETURN
15
+ 1 => B :RETURN
16
+ 1 => B :RETURN
17
+ 0 => B :RETURN
18
+ 1 => B :RETURN
19
+ 0 => B :RETURN
20
+ 0 => B :RETURN
21
+ 1 => B :RETURN
22
+ 1 => B :RETURN
23
+ 0 => B :RETURN
24
+ 0 => B :RETURN
25
+ 1 => B :RETURN
26
+ 0 => B :RETURN
27
+ 0 => B :RETURN
28
+ 1 => B :RETURN
29
+ 0 => B :RETURN
30
+ 1 => B :RETURN
31
+ 0 => B :RETURN
32
+ 1 => B :RETURN
33
+ 1 => B :RETURN
34
+ 0 => B :RETURN
35
+ 1 => B :RETURN
36
+ 0 => B :RETURN
37
+ 0 => B :RETURN
38
+ 0 => B :RETURN
39
+ 1 => B :RETURN
40
+ 0 => B :RETURN
41
+ 0 => B :RETURN
42
+ 1 => B :RETURN
43
+ 0 => B :RETURN
44
+ 1 => B :RETURN
45
+ 0 => B :RETURN
46
+ 0 => B :RETURN
47
+ 1 => B :RETURN
48
+ 1 => B :RETURN
49
+ 0 => B :RETURN
50
+ 1 => B :RETURN
51
+ 0 => B :RETURN
52
+ 0 => B :RETURN
53
+ 1 => B :RETURN
54
+ 0 => B :RETURN
55
+ 0 => B :RETURN
56
+ 0 => B :RETURN
57
+ 0 => B :RETURN
58
+ 1 => B :RETURN
59
+ 0 => B :RETURN
60
+ 0 => B :RETURN
61
+ 1 => B :RETURN
62
+ 1 => B :RETURN
63
+ 1 => B :RETURN
64
+ 1 => B :RETURN
@@ -0,0 +1,80 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; frob2Fp12BN254:
5
+ ;; in: (a1 + a2·w) = ((a11 + a12v + a13v²) + (a21 + a22v + a23v²)) ∈ Fp12, where ai ∈ Fp6 and aij ∈ Fp2
6
+ ;; out: (a1 + a2·w)ᵖ˙ᵖ = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a11 + a12·γ22·v + a13·γ24·v²
8
+ ;; - c2 = a21·γ21 + a22·γ23·v + a23·γ25·v²
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL frob2Fp12BN254_a11_x
13
+ VAR GLOBAL frob2Fp12BN254_a11_y
14
+ VAR GLOBAL frob2Fp12BN254_a12_x
15
+ VAR GLOBAL frob2Fp12BN254_a12_y
16
+ VAR GLOBAL frob2Fp12BN254_a13_x
17
+ VAR GLOBAL frob2Fp12BN254_a13_y
18
+ VAR GLOBAL frob2Fp12BN254_a21_x
19
+ VAR GLOBAL frob2Fp12BN254_a21_y
20
+ VAR GLOBAL frob2Fp12BN254_a22_x
21
+ VAR GLOBAL frob2Fp12BN254_a22_y
22
+ VAR GLOBAL frob2Fp12BN254_a23_x
23
+ VAR GLOBAL frob2Fp12BN254_a23_y
24
+ VAR GLOBAL frob2Fp12BN254_c11_x
25
+ VAR GLOBAL frob2Fp12BN254_c11_y
26
+ VAR GLOBAL frob2Fp12BN254_c12_x
27
+ VAR GLOBAL frob2Fp12BN254_c12_y
28
+ VAR GLOBAL frob2Fp12BN254_c13_x
29
+ VAR GLOBAL frob2Fp12BN254_c13_y
30
+ VAR GLOBAL frob2Fp12BN254_c21_x
31
+ VAR GLOBAL frob2Fp12BN254_c21_y
32
+ VAR GLOBAL frob2Fp12BN254_c22_x
33
+ VAR GLOBAL frob2Fp12BN254_c22_y
34
+ VAR GLOBAL frob2Fp12BN254_c23_x
35
+ VAR GLOBAL frob2Fp12BN254_c23_y
36
+
37
+ VAR GLOBAL frob2Fp12BN254_RR
38
+
39
+ frob2Fp12BN254:
40
+ RR :MSTORE(frob2Fp12BN254_RR)
41
+
42
+ ; 1] c1 = a11 + a12·γ22·v + a13·γ24·v²
43
+ $ => A :MLOAD(frob2Fp12BN254_a11_x)
44
+ $ => B :MLOAD(frob2Fp12BN254_a11_y)
45
+ A :MSTORE(frob2Fp12BN254_c11_x)
46
+ B :MSTORE(frob2Fp12BN254_c11_y)
47
+
48
+ %FROBENIUS_GAMMA22 => A
49
+ $ => C :MLOAD(frob2Fp12BN254_a12_x)
50
+ $ => D :MLOAD(frob2Fp12BN254_a12_y), CALL(escalarMulFp2BN254)
51
+ E :MSTORE(frob2Fp12BN254_c12_x)
52
+ C :MSTORE(frob2Fp12BN254_c12_y)
53
+
54
+ %FROBENIUS_GAMMA24 => A
55
+ $ => C :MLOAD(frob2Fp12BN254_a13_x)
56
+ $ => D :MLOAD(frob2Fp12BN254_a13_y), CALL(escalarMulFp2BN254)
57
+ E :MSTORE(frob2Fp12BN254_c13_x)
58
+ C :MSTORE(frob2Fp12BN254_c13_y)
59
+
60
+ ; 2] c2 = a21·γ21 + a22·γ23·v + a23·γ25·v²
61
+ %FROBENIUS_GAMMA21 => A
62
+ $ => C :MLOAD(frob2Fp12BN254_a21_x)
63
+ $ => D :MLOAD(frob2Fp12BN254_a21_y), CALL(escalarMulFp2BN254)
64
+ E :MSTORE(frob2Fp12BN254_c21_x)
65
+ C :MSTORE(frob2Fp12BN254_c21_y)
66
+
67
+ %FROBENIUS_GAMMA23 => A
68
+ $ => C :MLOAD(frob2Fp12BN254_a22_x)
69
+ $ => D :MLOAD(frob2Fp12BN254_a22_y), CALL(escalarMulFp2BN254)
70
+ E :MSTORE(frob2Fp12BN254_c22_x)
71
+ C :MSTORE(frob2Fp12BN254_c22_y)
72
+
73
+ %FROBENIUS_GAMMA25 => A
74
+ $ => C :MLOAD(frob2Fp12BN254_a23_x)
75
+ $ => D :MLOAD(frob2Fp12BN254_a23_y), CALL(escalarMulFp2BN254)
76
+ E :MSTORE(frob2Fp12BN254_c23_x)
77
+ C :MSTORE(frob2Fp12BN254_c23_y)
78
+
79
+ $ => RR :MLOAD(frob2Fp12BN254_RR)
80
+ :RETURN
@@ -0,0 +1,96 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; frob3Fp12BN254:
5
+ ;; in: (a1 + a2·w) = ((a11 + a12v + a13v²) + (a21 + a22v + a23v²)) ∈ Fp12, where ai ∈ Fp6 and aij ∈ Fp2
6
+ ;; out: (a1 + a2·w)ᵖ˙ᵖ˙ᵖ = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a̅11 + a̅12·γ32·v + a̅13·γ34·v²
8
+ ;; - c2 = a̅21·γ31 + a̅22·γ33·v + a̅23·γ35·v²
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL frob3Fp12BN254_a11_x
13
+ VAR GLOBAL frob3Fp12BN254_a11_y
14
+ VAR GLOBAL frob3Fp12BN254_a12_x
15
+ VAR GLOBAL frob3Fp12BN254_a12_y
16
+ VAR GLOBAL frob3Fp12BN254_a13_x
17
+ VAR GLOBAL frob3Fp12BN254_a13_y
18
+ VAR GLOBAL frob3Fp12BN254_a21_x
19
+ VAR GLOBAL frob3Fp12BN254_a21_y
20
+ VAR GLOBAL frob3Fp12BN254_a22_x
21
+ VAR GLOBAL frob3Fp12BN254_a22_y
22
+ VAR GLOBAL frob3Fp12BN254_a23_x
23
+ VAR GLOBAL frob3Fp12BN254_a23_y
24
+ VAR GLOBAL frob3Fp12BN254_c11_x
25
+ VAR GLOBAL frob3Fp12BN254_c11_y
26
+ VAR GLOBAL frob3Fp12BN254_c12_x
27
+ VAR GLOBAL frob3Fp12BN254_c12_y
28
+ VAR GLOBAL frob3Fp12BN254_c13_x
29
+ VAR GLOBAL frob3Fp12BN254_c13_y
30
+ VAR GLOBAL frob3Fp12BN254_c21_x
31
+ VAR GLOBAL frob3Fp12BN254_c21_y
32
+ VAR GLOBAL frob3Fp12BN254_c22_x
33
+ VAR GLOBAL frob3Fp12BN254_c22_y
34
+ VAR GLOBAL frob3Fp12BN254_c23_x
35
+ VAR GLOBAL frob3Fp12BN254_c23_y
36
+
37
+ VAR GLOBAL frob3Fp12BN254_RR
38
+
39
+ frob3Fp12BN254:
40
+ RR :MSTORE(frob3Fp12BN254_RR)
41
+
42
+ ; 1] c1 = a̅11 + a̅12·γ32·v + a̅13·γ34·v²
43
+ $ => A :MLOAD(frob3Fp12BN254_a11_x)
44
+ A :MSTORE(frob3Fp12BN254_c11_x)
45
+ %BN254_P => A
46
+ $ => B :MLOAD(frob3Fp12BN254_a11_y)
47
+ $ :SUB, MSTORE(frob3Fp12BN254_c11_y)
48
+
49
+ %BN254_P => A
50
+ $ => B :MLOAD(frob3Fp12BN254_a12_y)
51
+ $ => B :SUB
52
+ $ => A :MLOAD(frob3Fp12BN254_a12_x)
53
+ %FROBENIUS_GAMMA321 => C
54
+ %FROBENIUS_GAMMA322 => D :CALL(mulFp2BN254)
55
+ E :MSTORE(frob3Fp12BN254_c12_x)
56
+ C :MSTORE(frob3Fp12BN254_c12_y)
57
+
58
+ %BN254_P => A
59
+ $ => B :MLOAD(frob3Fp12BN254_a13_y)
60
+ $ => B :SUB
61
+ $ => A :MLOAD(frob3Fp12BN254_a13_x)
62
+ %FROBENIUS_GAMMA341 => C
63
+ %FROBENIUS_GAMMA342 => D :CALL(mulFp2BN254)
64
+ E :MSTORE(frob3Fp12BN254_c13_x)
65
+ C :MSTORE(frob3Fp12BN254_c13_y)
66
+
67
+ ; 2] c2 = a̅21·γ11 + a̅22·γ13·v + a̅23·γ15·v²
68
+ %BN254_P => A
69
+ $ => B :MLOAD(frob3Fp12BN254_a21_y)
70
+ $ => B :SUB
71
+ $ => A :MLOAD(frob3Fp12BN254_a21_x)
72
+ %FROBENIUS_GAMMA311 => C
73
+ %FROBENIUS_GAMMA312 => D :CALL(mulFp2BN254)
74
+ E :MSTORE(frob3Fp12BN254_c21_x)
75
+ C :MSTORE(frob3Fp12BN254_c21_y)
76
+
77
+ %BN254_P => A
78
+ $ => B :MLOAD(frob3Fp12BN254_a22_y)
79
+ $ => B :SUB
80
+ $ => A :MLOAD(frob3Fp12BN254_a22_x)
81
+ %FROBENIUS_GAMMA331 => C
82
+ %FROBENIUS_GAMMA332 => D :CALL(mulFp2BN254)
83
+ E :MSTORE(frob3Fp12BN254_c22_x)
84
+ C :MSTORE(frob3Fp12BN254_c22_y)
85
+
86
+ %BN254_P => A
87
+ $ => B :MLOAD(frob3Fp12BN254_a23_y)
88
+ $ => B :SUB
89
+ $ => A :MLOAD(frob3Fp12BN254_a23_x)
90
+ %FROBENIUS_GAMMA351 => C
91
+ %FROBENIUS_GAMMA352 => D :CALL(mulFp2BN254)
92
+ E :MSTORE(frob3Fp12BN254_c23_x)
93
+ C :MSTORE(frob3Fp12BN254_c23_y)
94
+
95
+ $ => RR :MLOAD(frob3Fp12BN254_RR)
96
+ :RETURN
@@ -0,0 +1,96 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; frobFp12BN254:
5
+ ;; in: (a1 + a2·w) = ((a11 + a12v + a13v²) + (a21 + a22v + a23v²)·w) ∈ Fp12, where ai ∈ Fp6 and aij ∈ Fp2
6
+ ;; out: (a1 + a2·w)ᵖ = (c1 + c2·w) ∈ Fp12, where:
7
+ ;; - c1 = a̅11 + a̅12·γ12·v + a̅13·γ14·v²
8
+ ;; - c2 = a̅21·γ11 + a̅22·γ13·v + a̅23·γ15·v²
9
+ ;;
10
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
+
12
+ VAR GLOBAL frobFp12BN254_a11_x
13
+ VAR GLOBAL frobFp12BN254_a11_y
14
+ VAR GLOBAL frobFp12BN254_a12_x
15
+ VAR GLOBAL frobFp12BN254_a12_y
16
+ VAR GLOBAL frobFp12BN254_a13_x
17
+ VAR GLOBAL frobFp12BN254_a13_y
18
+ VAR GLOBAL frobFp12BN254_a21_x
19
+ VAR GLOBAL frobFp12BN254_a21_y
20
+ VAR GLOBAL frobFp12BN254_a22_x
21
+ VAR GLOBAL frobFp12BN254_a22_y
22
+ VAR GLOBAL frobFp12BN254_a23_x
23
+ VAR GLOBAL frobFp12BN254_a23_y
24
+ VAR GLOBAL frobFp12BN254_c11_x
25
+ VAR GLOBAL frobFp12BN254_c11_y
26
+ VAR GLOBAL frobFp12BN254_c12_x
27
+ VAR GLOBAL frobFp12BN254_c12_y
28
+ VAR GLOBAL frobFp12BN254_c13_x
29
+ VAR GLOBAL frobFp12BN254_c13_y
30
+ VAR GLOBAL frobFp12BN254_c21_x
31
+ VAR GLOBAL frobFp12BN254_c21_y
32
+ VAR GLOBAL frobFp12BN254_c22_x
33
+ VAR GLOBAL frobFp12BN254_c22_y
34
+ VAR GLOBAL frobFp12BN254_c23_x
35
+ VAR GLOBAL frobFp12BN254_c23_y
36
+
37
+ VAR GLOBAL frobFp12BN254_RR
38
+
39
+ frobFp12BN254:
40
+ RR :MSTORE(frobFp12BN254_RR)
41
+
42
+ ; 1] c1 = a̅11 + a̅12·γ12·v + a̅13·γ14·v²
43
+ $ => A :MLOAD(frobFp12BN254_a11_x)
44
+ A :MSTORE(frobFp12BN254_c11_x)
45
+ %BN254_P => A
46
+ $ => B :MLOAD(frobFp12BN254_a11_y)
47
+ $ :SUB, MSTORE(frobFp12BN254_c11_y)
48
+
49
+ %BN254_P => A
50
+ $ => B :MLOAD(frobFp12BN254_a12_y)
51
+ $ => B :SUB
52
+ $ => A :MLOAD(frobFp12BN254_a12_x)
53
+ %FROBENIUS_GAMMA121 => C
54
+ %FROBENIUS_GAMMA122 => D :CALL(mulFp2BN254)
55
+ E :MSTORE(frobFp12BN254_c12_x)
56
+ C :MSTORE(frobFp12BN254_c12_y)
57
+
58
+ %BN254_P => A
59
+ $ => B :MLOAD(frobFp12BN254_a13_y)
60
+ $ => B :SUB
61
+ $ => A :MLOAD(frobFp12BN254_a13_x)
62
+ %FROBENIUS_GAMMA141 => C
63
+ %FROBENIUS_GAMMA142 => D :CALL(mulFp2BN254)
64
+ E :MSTORE(frobFp12BN254_c13_x)
65
+ C :MSTORE(frobFp12BN254_c13_y)
66
+
67
+ ; 2] c2 = a̅21·γ11 + a̅22·γ13·v + a̅23·γ15·v²
68
+ %BN254_P => A
69
+ $ => B :MLOAD(frobFp12BN254_a21_y)
70
+ $ => B :SUB
71
+ $ => A :MLOAD(frobFp12BN254_a21_x)
72
+ %FROBENIUS_GAMMA111 => C
73
+ %FROBENIUS_GAMMA112 => D :CALL(mulFp2BN254)
74
+ E :MSTORE(frobFp12BN254_c21_x)
75
+ C :MSTORE(frobFp12BN254_c21_y)
76
+
77
+ %BN254_P => A
78
+ $ => B :MLOAD(frobFp12BN254_a22_y)
79
+ $ => B :SUB
80
+ $ => A :MLOAD(frobFp12BN254_a22_x)
81
+ %FROBENIUS_GAMMA131 => C
82
+ %FROBENIUS_GAMMA132 => D :CALL(mulFp2BN254)
83
+ E :MSTORE(frobFp12BN254_c22_x)
84
+ C :MSTORE(frobFp12BN254_c22_y)
85
+
86
+ %BN254_P => A
87
+ $ => B :MLOAD(frobFp12BN254_a23_y)
88
+ $ => B :SUB
89
+ $ => A :MLOAD(frobFp12BN254_a23_x)
90
+ %FROBENIUS_GAMMA151 => C
91
+ %FROBENIUS_GAMMA152 => D :CALL(mulFp2BN254)
92
+ E :MSTORE(frobFp12BN254_c23_x)
93
+ C :MSTORE(frobFp12BN254_c23_y)
94
+
95
+ $ => RR :MLOAD(frobFp12BN254_RR)
96
+ :RETURN