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,333 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;;
3
+ ;; expFp12BN254:
4
+ ;; in: e, (a1 + a2·w) ∈ Fp12, where e ∈ [0,p¹²-2] ai ∈ Fp6
5
+ ;; out: (a1 + a2·w)^e = (c1 + c2·w) ∈ Fp12
6
+ ;;
7
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
+
9
+ ; Comment: We use this algorithm with a very small e (i.e., it fits in 32 bits), but it must be adpated to use it with a bigger e
10
+ ; Comment: In some cases, we can speed this algorithm up by using pseudobinary encoding instead of binary encoding
11
+
12
+ VAR GLOBAL expFp12BN254_e
13
+ VAR GLOBAL expFp12BN254_a11_x
14
+ VAR GLOBAL expFp12BN254_a11_y
15
+ VAR GLOBAL expFp12BN254_a12_x
16
+ VAR GLOBAL expFp12BN254_a12_y
17
+ VAR GLOBAL expFp12BN254_a13_x
18
+ VAR GLOBAL expFp12BN254_a13_y
19
+ VAR GLOBAL expFp12BN254_a21_x
20
+ VAR GLOBAL expFp12BN254_a21_y
21
+ VAR GLOBAL expFp12BN254_a22_x
22
+ VAR GLOBAL expFp12BN254_a22_y
23
+ VAR GLOBAL expFp12BN254_a23_x
24
+ VAR GLOBAL expFp12BN254_a23_y
25
+ VAR GLOBAL expFp12BN254_c11_x
26
+ VAR GLOBAL expFp12BN254_c11_y
27
+ VAR GLOBAL expFp12BN254_c12_x
28
+ VAR GLOBAL expFp12BN254_c12_y
29
+ VAR GLOBAL expFp12BN254_c13_x
30
+ VAR GLOBAL expFp12BN254_c13_y
31
+ VAR GLOBAL expFp12BN254_c21_x
32
+ VAR GLOBAL expFp12BN254_c21_y
33
+ VAR GLOBAL expFp12BN254_c22_x
34
+ VAR GLOBAL expFp12BN254_c22_y
35
+ VAR GLOBAL expFp12BN254_c23_x
36
+ VAR GLOBAL expFp12BN254_c23_y
37
+
38
+ VAR GLOBAL expFp12BN254_RR
39
+
40
+ expFp12BN254:
41
+ RR :MSTORE(expFp12BN254_RR)
42
+
43
+ ; Trivial cases:
44
+ ; 1] Is a = 0?
45
+ 0n => B
46
+ $ => A :MLOAD(expFp12BN254_a11_x)
47
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
48
+ $ => A :MLOAD(expFp12BN254_a11_y)
49
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
50
+ $ => A :MLOAD(expFp12BN254_a12_x)
51
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
52
+ $ => A :MLOAD(expFp12BN254_a12_y)
53
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
54
+ $ => A :MLOAD(expFp12BN254_a13_x)
55
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
56
+ $ => A :MLOAD(expFp12BN254_a13_y)
57
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
58
+ $ => A :MLOAD(expFp12BN254_a21_x)
59
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
60
+ $ => A :MLOAD(expFp12BN254_a21_y)
61
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
62
+ $ => A :MLOAD(expFp12BN254_a22_x)
63
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
64
+ $ => A :MLOAD(expFp12BN254_a22_y)
65
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
66
+ $ => A :MLOAD(expFp12BN254_a23_x)
67
+ $ :EQ, JMPNC(__expFp12BN254_a_continue1)
68
+ $ => A :MLOAD(expFp12BN254_a23_y)
69
+ $ :EQ, JMPC(expFp12BN254_a_is_zero)
70
+ __expFp12BN254_a_continue1:
71
+
72
+ ; 2] Is a = 1?
73
+ 1n => B
74
+ $ => A :MLOAD(expFp12BN254_a11_x)
75
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
76
+ 0n => B
77
+ $ => A :MLOAD(expFp12BN254_a11_y)
78
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
79
+ $ => A :MLOAD(expFp12BN254_a12_x)
80
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
81
+ $ => A :MLOAD(expFp12BN254_a12_y)
82
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
83
+ $ => A :MLOAD(expFp12BN254_a13_x)
84
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
85
+ $ => A :MLOAD(expFp12BN254_a13_y)
86
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
87
+ $ => A :MLOAD(expFp12BN254_a21_x)
88
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
89
+ $ => A :MLOAD(expFp12BN254_a21_y)
90
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
91
+ $ => A :MLOAD(expFp12BN254_a22_x)
92
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
93
+ $ => A :MLOAD(expFp12BN254_a22_y)
94
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
95
+ $ => A :MLOAD(expFp12BN254_a23_x)
96
+ $ :EQ, JMPNC(__expFp12BN254_a_continue2)
97
+ $ => A :MLOAD(expFp12BN254_a23_y)
98
+ $ :EQ, JMPC(expFp12BN254_a_is_one)
99
+ __expFp12BN254_a_continue2:
100
+
101
+ ; 3] Is e = 0?
102
+ $ => A :MLOAD(expFp12BN254_e)
103
+ 0n => B
104
+ $ :EQ, JMPC(expFp12BN254_e_is_zero)
105
+
106
+ 257 => RCX
107
+
108
+ $ => A :MLOAD(expFp12BN254_a11_x)
109
+ $ => B :MLOAD(expFp12BN254_a11_y)
110
+ A :MSTORE(expFp12BN254_c11_x)
111
+ B :MSTORE(expFp12BN254_c11_y)
112
+ $ => A :MLOAD(expFp12BN254_a12_x)
113
+ $ => B :MLOAD(expFp12BN254_a12_y)
114
+ A :MSTORE(expFp12BN254_c12_x)
115
+ B :MSTORE(expFp12BN254_c12_y)
116
+ $ => A :MLOAD(expFp12BN254_a13_x)
117
+ $ => B :MLOAD(expFp12BN254_a13_y)
118
+ A :MSTORE(expFp12BN254_c13_x)
119
+ B :MSTORE(expFp12BN254_c13_y)
120
+ $ => A :MLOAD(expFp12BN254_a21_x)
121
+ $ => B :MLOAD(expFp12BN254_a21_y)
122
+ A :MSTORE(expFp12BN254_c21_x)
123
+ B :MSTORE(expFp12BN254_c21_y)
124
+ $ => A :MLOAD(expFp12BN254_a22_x)
125
+ $ => B :MLOAD(expFp12BN254_a22_y)
126
+ A :MSTORE(expFp12BN254_c22_x)
127
+ B :MSTORE(expFp12BN254_c22_y)
128
+ $ => A :MLOAD(expFp12BN254_a23_x)
129
+ $ => B :MLOAD(expFp12BN254_a23_y)
130
+ A :MSTORE(expFp12BN254_c23_x)
131
+ B :MSTORE(expFp12BN254_c23_y)
132
+
133
+ :JMP(expFp12BN254_find_MSB_e)
134
+
135
+ expFp12BN254_a_is_zero:
136
+ ; I define 0^0 = 0 for simplicity
137
+ 0n :MSTORE(expFp12BN254_c11_x)
138
+ 0n :MSTORE(expFp12BN254_c11_y)
139
+ 0n :MSTORE(expFp12BN254_c12_x)
140
+ 0n :MSTORE(expFp12BN254_c12_y)
141
+ 0n :MSTORE(expFp12BN254_c13_x)
142
+ 0n :MSTORE(expFp12BN254_c13_y)
143
+ 0n :MSTORE(expFp12BN254_c21_x)
144
+ 0n :MSTORE(expFp12BN254_c21_y)
145
+ 0n :MSTORE(expFp12BN254_c22_x)
146
+ 0n :MSTORE(expFp12BN254_c22_y)
147
+ 0n :MSTORE(expFp12BN254_c23_x)
148
+ 0n :MSTORE(expFp12BN254_c23_y)
149
+
150
+ :JMP(expFp12BN254_end)
151
+
152
+ expFp12BN254_a_is_one:
153
+ ; 1^e = 1
154
+ 1n :MSTORE(expFp12BN254_c11_x)
155
+ 0n :MSTORE(expFp12BN254_c11_y)
156
+ 0n :MSTORE(expFp12BN254_c12_x)
157
+ 0n :MSTORE(expFp12BN254_c12_y)
158
+ 0n :MSTORE(expFp12BN254_c13_x)
159
+ 0n :MSTORE(expFp12BN254_c13_y)
160
+ 0n :MSTORE(expFp12BN254_c21_x)
161
+ 0n :MSTORE(expFp12BN254_c21_y)
162
+ 0n :MSTORE(expFp12BN254_c22_x)
163
+ 0n :MSTORE(expFp12BN254_c22_y)
164
+ 0n :MSTORE(expFp12BN254_c23_x)
165
+ 0n :MSTORE(expFp12BN254_c23_y)
166
+
167
+ :JMP(expFp12BN254_end)
168
+
169
+ expFp12BN254_e_is_zero:
170
+ ; a^0 = 1
171
+ 1n :MSTORE(expFp12BN254_c11_x)
172
+ 0n :MSTORE(expFp12BN254_c11_y)
173
+ 0n :MSTORE(expFp12BN254_c12_x)
174
+ 0n :MSTORE(expFp12BN254_c12_y)
175
+ 0n :MSTORE(expFp12BN254_c13_x)
176
+ 0n :MSTORE(expFp12BN254_c13_y)
177
+ 0n :MSTORE(expFp12BN254_c21_x)
178
+ 0n :MSTORE(expFp12BN254_c21_y)
179
+ 0n :MSTORE(expFp12BN254_c22_x)
180
+ 0n :MSTORE(expFp12BN254_c22_y)
181
+ 0n :MSTORE(expFp12BN254_c23_x)
182
+ 0n :MSTORE(expFp12BN254_c23_y)
183
+
184
+ :JMP(expFp12BN254_end)
185
+
186
+ expFp12BN254_find_MSB_e:
187
+ RCX - 1 => RCX
188
+ $ => A,B :MLOAD(expFp12BN254_e)
189
+ ; E = 2A
190
+ $ => E :ADD,MSTORE(expFp12BN254_e), JMPNC(expFp12BN254_find_MSB_e)
191
+
192
+
193
+ expFp12BN254_loop:
194
+ RCX - 1 => RCX :JMPZ(expFp12BN254_end)
195
+
196
+ ; We always square: c = c^2
197
+ $ => A :MLOAD(expFp12BN254_c11_x)
198
+ $ => B :MLOAD(expFp12BN254_c11_y)
199
+ A :MSTORE(squareFp12BN254_a11_x)
200
+ B :MSTORE(squareFp12BN254_a11_y)
201
+ $ => A :MLOAD(expFp12BN254_c12_x)
202
+ $ => B :MLOAD(expFp12BN254_c12_y)
203
+ A :MSTORE(squareFp12BN254_a12_x)
204
+ B :MSTORE(squareFp12BN254_a12_y)
205
+ $ => A :MLOAD(expFp12BN254_c13_x)
206
+ $ => B :MLOAD(expFp12BN254_c13_y)
207
+ A :MSTORE(squareFp12BN254_a13_x)
208
+ B :MSTORE(squareFp12BN254_a13_y)
209
+ $ => A :MLOAD(expFp12BN254_c21_x)
210
+ $ => B :MLOAD(expFp12BN254_c21_y)
211
+ A :MSTORE(squareFp12BN254_a21_x)
212
+ B :MSTORE(squareFp12BN254_a21_y)
213
+ $ => A :MLOAD(expFp12BN254_c22_x)
214
+ $ => B :MLOAD(expFp12BN254_c22_y)
215
+ A :MSTORE(squareFp12BN254_a22_x)
216
+ B :MSTORE(squareFp12BN254_a22_y)
217
+ $ => A :MLOAD(expFp12BN254_c23_x)
218
+ $ => B :MLOAD(expFp12BN254_c23_y)
219
+ A :MSTORE(squareFp12BN254_a23_x)
220
+ B :MSTORE(squareFp12BN254_a23_y), CALL(squareFp12BN254)
221
+
222
+ ; c = c^2
223
+ $ => A :MLOAD(squareFp12BN254_c11_x)
224
+ $ => B :MLOAD(squareFp12BN254_c11_y)
225
+ A :MSTORE(expFp12BN254_c11_x)
226
+ B :MSTORE(expFp12BN254_c11_y)
227
+ $ => A :MLOAD(squareFp12BN254_c12_x)
228
+ $ => B :MLOAD(squareFp12BN254_c12_y)
229
+ A :MSTORE(expFp12BN254_c12_x)
230
+ B :MSTORE(expFp12BN254_c12_y)
231
+ $ => A :MLOAD(squareFp12BN254_c13_x)
232
+ $ => B :MLOAD(squareFp12BN254_c13_y)
233
+ A :MSTORE(expFp12BN254_c13_x)
234
+ B :MSTORE(expFp12BN254_c13_y)
235
+ $ => A :MLOAD(squareFp12BN254_c21_x)
236
+ $ => B :MLOAD(squareFp12BN254_c21_y)
237
+ A :MSTORE(expFp12BN254_c21_x)
238
+ B :MSTORE(expFp12BN254_c21_y)
239
+ $ => A :MLOAD(squareFp12BN254_c22_x)
240
+ $ => B :MLOAD(squareFp12BN254_c22_y)
241
+ A :MSTORE(expFp12BN254_c22_x)
242
+ B :MSTORE(expFp12BN254_c22_y)
243
+ $ => A :MLOAD(squareFp12BN254_c23_x)
244
+ $ => B :MLOAD(squareFp12BN254_c23_y)
245
+ A :MSTORE(expFp12BN254_c23_x)
246
+ B :MSTORE(expFp12BN254_c23_y)
247
+
248
+ ; 2] We check if the MSB b of e is either 1 or 0. If b==1, we should multiply a to c.
249
+ ; Then, update the value of e.
250
+ $ => A,B :MLOAD(expFp12BN254_e)
251
+ ; E = 2A
252
+ $ => E :ADD,MSTORE(expFp12BN254_e), JMPNC(expFp12BN254_loop)
253
+
254
+ expFp12BN254_multiply:
255
+ $ => A :MLOAD(expFp12BN254_a11_x)
256
+ $ => B :MLOAD(expFp12BN254_a11_y)
257
+ A :MSTORE(mulFp12BN254_a11_x)
258
+ B :MSTORE(mulFp12BN254_a11_y)
259
+ $ => A :MLOAD(expFp12BN254_a12_x)
260
+ $ => B :MLOAD(expFp12BN254_a12_y)
261
+ A :MSTORE(mulFp12BN254_a12_x)
262
+ B :MSTORE(mulFp12BN254_a12_y)
263
+ $ => A :MLOAD(expFp12BN254_a13_x)
264
+ $ => B :MLOAD(expFp12BN254_a13_y)
265
+ A :MSTORE(mulFp12BN254_a13_x)
266
+ B :MSTORE(mulFp12BN254_a13_y)
267
+ $ => A :MLOAD(expFp12BN254_a21_x)
268
+ $ => B :MLOAD(expFp12BN254_a21_y)
269
+ A :MSTORE(mulFp12BN254_a21_x)
270
+ B :MSTORE(mulFp12BN254_a21_y)
271
+ $ => A :MLOAD(expFp12BN254_a22_x)
272
+ $ => B :MLOAD(expFp12BN254_a22_y)
273
+ A :MSTORE(mulFp12BN254_a22_x)
274
+ B :MSTORE(mulFp12BN254_a22_y)
275
+ $ => A :MLOAD(expFp12BN254_a23_x)
276
+ $ => B :MLOAD(expFp12BN254_a23_y)
277
+ A :MSTORE(mulFp12BN254_a23_x)
278
+ B :MSTORE(mulFp12BN254_a23_y)
279
+ $ => A :MLOAD(expFp12BN254_c11_x)
280
+ $ => B :MLOAD(expFp12BN254_c11_y)
281
+ A :MSTORE(mulFp12BN254_b11_x)
282
+ B :MSTORE(mulFp12BN254_b11_y)
283
+ $ => A :MLOAD(expFp12BN254_c12_x)
284
+ $ => B :MLOAD(expFp12BN254_c12_y)
285
+ A :MSTORE(mulFp12BN254_b12_x)
286
+ B :MSTORE(mulFp12BN254_b12_y)
287
+ $ => A :MLOAD(expFp12BN254_c13_x)
288
+ $ => B :MLOAD(expFp12BN254_c13_y)
289
+ A :MSTORE(mulFp12BN254_b13_x)
290
+ B :MSTORE(mulFp12BN254_b13_y)
291
+ $ => A :MLOAD(expFp12BN254_c21_x)
292
+ $ => B :MLOAD(expFp12BN254_c21_y)
293
+ A :MSTORE(mulFp12BN254_b21_x)
294
+ B :MSTORE(mulFp12BN254_b21_y)
295
+ $ => A :MLOAD(expFp12BN254_c22_x)
296
+ $ => B :MLOAD(expFp12BN254_c22_y)
297
+ A :MSTORE(mulFp12BN254_b22_x)
298
+ B :MSTORE(mulFp12BN254_b22_y)
299
+ $ => A :MLOAD(expFp12BN254_c23_x)
300
+ $ => B :MLOAD(expFp12BN254_c23_y)
301
+ A :MSTORE(mulFp12BN254_b23_x)
302
+ B :MSTORE(mulFp12BN254_b23_y), CALL(mulFp12BN254)
303
+
304
+ ; c = c·a
305
+ $ => A :MLOAD(mulFp12BN254_c11_x)
306
+ $ => B :MLOAD(mulFp12BN254_c11_y)
307
+ A :MSTORE(expFp12BN254_c11_x)
308
+ B :MSTORE(expFp12BN254_c11_y)
309
+ $ => A :MLOAD(mulFp12BN254_c12_x)
310
+ $ => B :MLOAD(mulFp12BN254_c12_y)
311
+ A :MSTORE(expFp12BN254_c12_x)
312
+ B :MSTORE(expFp12BN254_c12_y)
313
+ $ => A :MLOAD(mulFp12BN254_c13_x)
314
+ $ => B :MLOAD(mulFp12BN254_c13_y)
315
+ A :MSTORE(expFp12BN254_c13_x)
316
+ B :MSTORE(expFp12BN254_c13_y)
317
+ $ => A :MLOAD(mulFp12BN254_c21_x)
318
+ $ => B :MLOAD(mulFp12BN254_c21_y)
319
+ A :MSTORE(expFp12BN254_c21_x)
320
+ B :MSTORE(expFp12BN254_c21_y)
321
+ $ => A :MLOAD(mulFp12BN254_c22_x)
322
+ $ => B :MLOAD(mulFp12BN254_c22_y)
323
+ A :MSTORE(expFp12BN254_c22_x)
324
+ B :MSTORE(expFp12BN254_c22_y)
325
+ $ => A :MLOAD(mulFp12BN254_c23_x)
326
+ $ => B :MLOAD(mulFp12BN254_c23_y)
327
+ A :MSTORE(expFp12BN254_c23_x)
328
+ B :MSTORE(expFp12BN254_c23_y)
329
+ :JMP(expFp12BN254_loop)
330
+
331
+ expFp12BN254_end:
332
+ $ => RR :MLOAD(expFp12BN254_RR)
333
+ :RETURN
@@ -0,0 +1,130 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;;
3
+ ;; subFp12BN254:
4
+ ;; in: (a1 + a2·w),(b1 + b2·w) ∈ Fp12, where ai,bi ∈ Fp6
5
+ ;; out: (c1 + c2·w) = (a1-b1) + (a2-b2)·w ∈ Fp12
6
+ ;;
7
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
+
9
+ VAR GLOBAL subFp12BN254_a11_x
10
+ VAR GLOBAL subFp12BN254_a11_y
11
+ VAR GLOBAL subFp12BN254_a12_x
12
+ VAR GLOBAL subFp12BN254_a12_y
13
+ VAR GLOBAL subFp12BN254_a13_x
14
+ VAR GLOBAL subFp12BN254_a13_y
15
+ VAR GLOBAL subFp12BN254_a21_x
16
+ VAR GLOBAL subFp12BN254_a21_y
17
+ VAR GLOBAL subFp12BN254_a22_x
18
+ VAR GLOBAL subFp12BN254_a22_y
19
+ VAR GLOBAL subFp12BN254_a23_x
20
+ VAR GLOBAL subFp12BN254_a23_y
21
+ VAR GLOBAL subFp12BN254_b11_x
22
+ VAR GLOBAL subFp12BN254_b11_y
23
+ VAR GLOBAL subFp12BN254_b12_x
24
+ VAR GLOBAL subFp12BN254_b12_y
25
+ VAR GLOBAL subFp12BN254_b13_x
26
+ VAR GLOBAL subFp12BN254_b13_y
27
+ VAR GLOBAL subFp12BN254_b21_x
28
+ VAR GLOBAL subFp12BN254_b21_y
29
+ VAR GLOBAL subFp12BN254_b22_x
30
+ VAR GLOBAL subFp12BN254_b22_y
31
+ VAR GLOBAL subFp12BN254_b23_x
32
+ VAR GLOBAL subFp12BN254_b23_y
33
+ VAR GLOBAL subFp12BN254_c11_x
34
+ VAR GLOBAL subFp12BN254_c11_y
35
+ VAR GLOBAL subFp12BN254_c12_x
36
+ VAR GLOBAL subFp12BN254_c12_y
37
+ VAR GLOBAL subFp12BN254_c13_x
38
+ VAR GLOBAL subFp12BN254_c13_y
39
+ VAR GLOBAL subFp12BN254_c21_x
40
+ VAR GLOBAL subFp12BN254_c21_y
41
+ VAR GLOBAL subFp12BN254_c22_x
42
+ VAR GLOBAL subFp12BN254_c22_y
43
+ VAR GLOBAL subFp12BN254_c23_x
44
+ VAR GLOBAL subFp12BN254_c23_y
45
+
46
+ VAR GLOBAL subFp12BN254_RR
47
+
48
+ subFp12BN254:
49
+ RR :MSTORE(subFp12BN254_RR)
50
+
51
+ ; 1] c1 = a1 - b1
52
+ $ => A :MLOAD(subFp12BN254_a11_x)
53
+ $ => B :MLOAD(subFp12BN254_a11_y)
54
+ A :MSTORE(subFp6BN254_a1_x)
55
+ B :MSTORE(subFp6BN254_a1_y)
56
+ $ => A :MLOAD(subFp12BN254_a12_x)
57
+ $ => B :MLOAD(subFp12BN254_a12_y)
58
+ A :MSTORE(subFp6BN254_a2_x)
59
+ B :MSTORE(subFp6BN254_a2_y)
60
+ $ => A :MLOAD(subFp12BN254_a13_x)
61
+ $ => B :MLOAD(subFp12BN254_a13_y)
62
+ A :MSTORE(subFp6BN254_a3_x)
63
+ B :MSTORE(subFp6BN254_a3_y)
64
+
65
+ $ => A :MLOAD(subFp12BN254_b11_x)
66
+ $ => B :MLOAD(subFp12BN254_b11_y)
67
+ A :MSTORE(subFp6BN254_b1_x)
68
+ B :MSTORE(subFp6BN254_b1_y)
69
+ $ => A :MLOAD(subFp12BN254_b12_x)
70
+ $ => B :MLOAD(subFp12BN254_b12_y)
71
+ A :MSTORE(subFp6BN254_b2_x)
72
+ B :MSTORE(subFp6BN254_b2_y)
73
+ $ => A :MLOAD(subFp12BN254_b13_x)
74
+ $ => B :MLOAD(subFp12BN254_b13_y)
75
+ A :MSTORE(subFp6BN254_b3_x)
76
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
77
+ $ => A :MLOAD(subFp6BN254_c1_x)
78
+ $ => B :MLOAD(subFp6BN254_c1_y)
79
+ A :MSTORE(subFp12BN254_c11_x)
80
+ B :MSTORE(subFp12BN254_c11_y)
81
+ $ => A :MLOAD(subFp6BN254_c2_x)
82
+ $ => B :MLOAD(subFp6BN254_c2_y)
83
+ A :MSTORE(subFp12BN254_c12_x)
84
+ B :MSTORE(subFp12BN254_c12_y)
85
+ $ => A :MLOAD(subFp6BN254_c3_x)
86
+ $ => B :MLOAD(subFp6BN254_c3_y)
87
+ A :MSTORE(subFp12BN254_c13_x)
88
+ B :MSTORE(subFp12BN254_c13_y)
89
+
90
+ ; 2] c2 = a2 - b2
91
+ $ => A :MLOAD(subFp12BN254_a21_x)
92
+ $ => B :MLOAD(subFp12BN254_a21_y)
93
+ A :MSTORE(subFp6BN254_a1_x)
94
+ B :MSTORE(subFp6BN254_a1_y)
95
+ $ => A :MLOAD(subFp12BN254_a22_x)
96
+ $ => B :MLOAD(subFp12BN254_a22_y)
97
+ A :MSTORE(subFp6BN254_a2_x)
98
+ B :MSTORE(subFp6BN254_a2_y)
99
+ $ => A :MLOAD(subFp12BN254_a23_x)
100
+ $ => B :MLOAD(subFp12BN254_a23_y)
101
+ A :MSTORE(subFp6BN254_a3_x)
102
+ B :MSTORE(subFp6BN254_a3_y)
103
+
104
+ $ => A :MLOAD(subFp12BN254_b21_x)
105
+ $ => B :MLOAD(subFp12BN254_b21_y)
106
+ A :MSTORE(subFp6BN254_b1_x)
107
+ B :MSTORE(subFp6BN254_b1_y)
108
+ $ => A :MLOAD(subFp12BN254_b22_x)
109
+ $ => B :MLOAD(subFp12BN254_b22_y)
110
+ A :MSTORE(subFp6BN254_b2_x)
111
+ B :MSTORE(subFp6BN254_b2_y)
112
+ $ => A :MLOAD(subFp12BN254_b23_x)
113
+ $ => B :MLOAD(subFp12BN254_b23_y)
114
+ A :MSTORE(subFp6BN254_b3_x)
115
+ B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
116
+ $ => A :MLOAD(subFp6BN254_c1_x)
117
+ $ => B :MLOAD(subFp6BN254_c1_y)
118
+ A :MSTORE(subFp12BN254_c21_x)
119
+ B :MSTORE(subFp12BN254_c21_y)
120
+ $ => A :MLOAD(subFp6BN254_c2_x)
121
+ $ => B :MLOAD(subFp6BN254_c2_y)
122
+ A :MSTORE(subFp12BN254_c22_x)
123
+ B :MSTORE(subFp12BN254_c22_y)
124
+ $ => A :MLOAD(subFp6BN254_c3_x)
125
+ $ => B :MLOAD(subFp6BN254_c3_y)
126
+ A :MSTORE(subFp12BN254_c23_x)
127
+ B :MSTORE(subFp12BN254_c23_y)
128
+
129
+ $ => RR :MLOAD(subFp12BN254_RR)
130
+ :RETURN
@@ -0,0 +1,68 @@
1
+ ;;
2
+ ;; parameter of BN254 x = 4965661367192848881, which can be expressed in (little-endian) pseudobinary as:
3
+ ;; 1000-1000010100001001011001010010001011010100100110010-1001010001
4
+ ;;
5
+
6
+ xPseudoBinDecompBN254:
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
+ 0 => B :RETURN
15
+ 0 => B :RETURN
16
+ 1 => B :RETURN
17
+ 0 => B :RETURN
18
+ 1 => B :RETURN
19
+ 0 => B :RETURN
20
+ 0 => B :RETURN
21
+ 0 => B :RETURN
22
+ 0 => B :RETURN
23
+ 1 => B :RETURN
24
+ 0 => B :RETURN
25
+ 0 => B :RETURN
26
+ 1 => B :RETURN
27
+ 0 => B :RETURN
28
+ 1 => B :RETURN
29
+ 1 => B :RETURN
30
+ 0 => B :RETURN
31
+ 0 => B :RETURN
32
+ 1 => B :RETURN
33
+ 0 => B :RETURN
34
+ 1 => B :RETURN
35
+ 0 => B :RETURN
36
+ 0 => B :RETURN
37
+ 1 => B :RETURN
38
+ 0 => B :RETURN
39
+ 0 => B :RETURN
40
+ 0 => B :RETURN
41
+ 1 => B :RETURN
42
+ 0 => B :RETURN
43
+ 1 => B :RETURN
44
+ 1 => B :RETURN
45
+ 0 => B :RETURN
46
+ 1 => B :RETURN
47
+ 0 => B :RETURN
48
+ 1 => B :RETURN
49
+ 0 => B :RETURN
50
+ 0 => B :RETURN
51
+ 1 => B :RETURN
52
+ 0 => B :RETURN
53
+ 0 => B :RETURN
54
+ 1 => B :RETURN
55
+ 1 => B :RETURN
56
+ 0 => B :RETURN
57
+ 0 => B :RETURN
58
+ 1 => B :RETURN
59
+ 0 => B :RETURN
60
+ -1 => B :RETURN
61
+ 0 => B :RETURN
62
+ 0 => B :RETURN
63
+ 1 => B :RETURN
64
+ 0 => B :RETURN
65
+ 1 => B :RETURN
66
+ 0 => B :RETURN
67
+ 0 => B :RETURN
68
+ 0 => B :RETURN