@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,96 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; PRE: P ∈ E'(Fp2) and Q ∈ E(Fp)
3
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
4
+ ;;
5
+ ;; lineSamePointsBN254:
6
+ ;; in: P = (P.x1 + P.x2·u, P.y1 + P.y2·u) ∈ E'(Fp2) and Q = (Q.x,Q.y) ∈ E(Fp)
7
+ ;; out: line_{twist(P), twist(P)}(Q) = (3·P.x1³ - 2·P.y1²)·(9 + u) + (2·Q.y·P.y1)·w³ + (-3·Q.x·P.x1²)·w⁴ ∈ Fp12
8
+ ;;
9
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
+
11
+ ; The precondition is ensured by the pairing.
12
+ ; However, it must be implemented if lineSamePointsBN254 wants to be used independently.
13
+
14
+ VAR GLOBAL lineSamePointsBN254_P_x1
15
+ VAR GLOBAL lineSamePointsBN254_P_x2
16
+ VAR GLOBAL lineSamePointsBN254_P_y1
17
+ VAR GLOBAL lineSamePointsBN254_P_y2
18
+ VAR GLOBAL lineSamePointsBN254_Q_x
19
+ VAR GLOBAL lineSamePointsBN254_Q_y
20
+
21
+ VAR GLOBAL lineSamePointsBN254_P_x1_square
22
+ VAR GLOBAL lineSamePointsBN254_P_x2_square
23
+ VAR GLOBAL lineSamePointsBN254_P_y1_square
24
+ VAR GLOBAL lineSamePointsBN254_P_y2_square
25
+
26
+ VAR GLOBAL lineSamePointsBN254_l11_x
27
+ VAR GLOBAL lineSamePointsBN254_l11_y
28
+ VAR GLOBAL lineSamePointsBN254_l13_x
29
+ VAR GLOBAL lineSamePointsBN254_l13_y
30
+ VAR GLOBAL lineSamePointsBN254_l22_x
31
+ VAR GLOBAL lineSamePointsBN254_l22_y
32
+
33
+ VAR GLOBAL lineSamePointsBN254_RR
34
+
35
+ lineSamePointsBN254:
36
+ RR :MSTORE(lineSamePointsBN254_RR)
37
+
38
+ ; 1] (3·P.x1³ - 2·P.y1²)·(9 + u)
39
+ $ => A :MLOAD(lineSamePointsBN254_P_y1)
40
+ $ => B :MLOAD(lineSamePointsBN254_P_y2), CALL(squareFp2BN254)
41
+ C => D
42
+ E => C
43
+ 2n => A :CALL(escalarMulFp2BN254)
44
+ E :MSTORE(lineSamePointsBN254_P_y1_square)
45
+ C :MSTORE(lineSamePointsBN254_P_y2_square)
46
+
47
+ $ => A :MLOAD(lineSamePointsBN254_P_x1)
48
+ $ => B :MLOAD(lineSamePointsBN254_P_x2), CALL(squareFp2BN254)
49
+ ; save it for the last step
50
+ E :MSTORE(lineSamePointsBN254_P_x1_square)
51
+ C :MSTORE(lineSamePointsBN254_P_x2_square)
52
+ E => A
53
+ C => B
54
+ $ => C :MLOAD(lineSamePointsBN254_P_x1)
55
+ $ => D :MLOAD(lineSamePointsBN254_P_x2), CALL(mulFp2BN254)
56
+ C => D
57
+ E => C
58
+ 3n => A :CALL(escalarMulFp2BN254)
59
+
60
+ E => A
61
+ C => B
62
+ $ => C :MLOAD(lineSamePointsBN254_P_y1_square)
63
+ $ => D :MLOAD(lineSamePointsBN254_P_y2_square), CALL(subFp2BN254)
64
+
65
+ E => A
66
+ C => B
67
+ 9n => C
68
+ 1n => D :CALL(mulFp2BN254)
69
+
70
+ E :MSTORE(lineSamePointsBN254_l11_x)
71
+ C :MSTORE(lineSamePointsBN254_l11_y)
72
+
73
+
74
+ ; 2] 2·Q.y·P.y1
75
+ 2n => A
76
+ $ => B :MLOAD(lineSamePointsBN254_Q_y), CALL(mulFpBN254)
77
+
78
+ C => A
79
+ $ => C :MLOAD(lineSamePointsBN254_P_y1)
80
+ $ => D :MLOAD(lineSamePointsBN254_P_y2), CALL(escalarMulFp2BN254)
81
+
82
+ E :MSTORE(lineSamePointsBN254_l22_x)
83
+ C :MSTORE(lineSamePointsBN254_l22_y)
84
+
85
+ ; 3] -3·Q.x·P.x1²
86
+ %BN254_P - 3n => A ; This clearly assumes that %BN254_P >= 3n
87
+ $ => B :MLOAD(lineSamePointsBN254_Q_x), CALL(mulFpBN254)
88
+ C => A
89
+ $ => C :MLOAD(lineSamePointsBN254_P_x1_square)
90
+ $ => D :MLOAD(lineSamePointsBN254_P_x2_square), CALL(escalarMulFp2BN254)
91
+
92
+ E :MSTORE(lineSamePointsBN254_l13_x)
93
+ C :MSTORE(lineSamePointsBN254_l13_y)
94
+
95
+ $ => RR :MLOAD(lineSamePointsBN254_RR)
96
+ :RETURN
@@ -0,0 +1,49 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;;
3
+ ;; compressFp12BN254:
4
+ ;; in: a = a0 + a2·w + a4·w² + a1·w³ + a3·w⁴ + a5·w⁵ ∈ GΦ6(p²), where ai ∈ Fp2
5
+ ;; out: C(a) = [a2,a3,a4,a5] ∈ Fp2⁴
6
+ ;;
7
+ ;; NOTE: If the input does not belong to the cyclotomic subgroup GΦ6(p²), then the compression-decompression
8
+ ;; technique is not well defined. This means that D(C(a)) != a.
9
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10
+
11
+ VAR GLOBAL compressFp12BN254_a0_x
12
+ VAR GLOBAL compressFp12BN254_a0_y
13
+ VAR GLOBAL compressFp12BN254_a2_x
14
+ VAR GLOBAL compressFp12BN254_a2_y
15
+ VAR GLOBAL compressFp12BN254_a4_x
16
+ VAR GLOBAL compressFp12BN254_a4_y
17
+ VAR GLOBAL compressFp12BN254_a1_x
18
+ VAR GLOBAL compressFp12BN254_a1_y
19
+ VAR GLOBAL compressFp12BN254_a3_x
20
+ VAR GLOBAL compressFp12BN254_a3_y
21
+ VAR GLOBAL compressFp12BN254_a5_x
22
+ VAR GLOBAL compressFp12BN254_a5_y
23
+ VAR GLOBAL compressFp12BN254_Ca2_x
24
+ VAR GLOBAL compressFp12BN254_Ca2_y
25
+ VAR GLOBAL compressFp12BN254_Ca3_x
26
+ VAR GLOBAL compressFp12BN254_Ca3_y
27
+ VAR GLOBAL compressFp12BN254_Ca4_x
28
+ VAR GLOBAL compressFp12BN254_Ca4_y
29
+ VAR GLOBAL compressFp12BN254_Ca5_x
30
+ VAR GLOBAL compressFp12BN254_Ca5_y
31
+
32
+ compressFp12BN254:
33
+ $ => A :MLOAD(compressFp12BN254_a2_x)
34
+ $ => B :MLOAD(compressFp12BN254_a2_y)
35
+ A :MSTORE(compressFp12BN254_Ca2_x)
36
+ B :MSTORE(compressFp12BN254_Ca2_y)
37
+ $ => A :MLOAD(compressFp12BN254_a3_x)
38
+ $ => B :MLOAD(compressFp12BN254_a3_y)
39
+ A :MSTORE(compressFp12BN254_Ca3_x)
40
+ B :MSTORE(compressFp12BN254_Ca3_y)
41
+ $ => A :MLOAD(compressFp12BN254_a4_x)
42
+ $ => B :MLOAD(compressFp12BN254_a4_y)
43
+ A :MSTORE(compressFp12BN254_Ca4_x)
44
+ B :MSTORE(compressFp12BN254_Ca4_y)
45
+ $ => A :MLOAD(compressFp12BN254_a5_x)
46
+ $ => B :MLOAD(compressFp12BN254_a5_y)
47
+ A :MSTORE(compressFp12BN254_Ca5_x)
48
+ B :MSTORE(compressFp12BN254_Ca5_y)
49
+ :RETURN
@@ -0,0 +1,236 @@
1
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
+ ;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
3
+ ;;
4
+ ;; decompressFp12BN254:
5
+ ;; in: [a2,a3,a4,a5] ∈ Fp2⁴, where ai ∈ Fp2
6
+ ;; out: D(a) = a0 + a2·w + a4·w² + a1·w³ + a3·w⁴ + a5·w⁵ ∈ GΦ6(p²), where:
7
+ ;; - if a2 != 0, then:
8
+ ;; · a1 = (a5²·(9+u) + 3·a4² - 2·a3)/(4·a2)
9
+ ;; · a0 = (2·a1² + a2·a5 - 3·a3·a4)(9+u) + 1
10
+ ;; - if a2 == 0, then:
11
+ ;; · a1 = (2·a4·a5)/a3
12
+ ;; · a0 = (2·a1² - 3·a3·a4)(9+u) + 1
13
+ ;;
14
+ ;; NOTE: If the input is not of the form C(a), where a ∈ GΦ6(p²), then the compression-decompression
15
+ ;; technique is not well defined. This means that D(C(a)) != a.
16
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17
+
18
+ VAR GLOBAL decompressFp12BN254_Ca2_x
19
+ VAR GLOBAL decompressFp12BN254_Ca2_y
20
+ VAR GLOBAL decompressFp12BN254_Ca3_x
21
+ VAR GLOBAL decompressFp12BN254_Ca3_y
22
+ VAR GLOBAL decompressFp12BN254_Ca4_x
23
+ VAR GLOBAL decompressFp12BN254_Ca4_y
24
+ VAR GLOBAL decompressFp12BN254_Ca5_x
25
+ VAR GLOBAL decompressFp12BN254_Ca5_y
26
+ VAR GLOBAL decompressFp12BN254_a0_x
27
+ VAR GLOBAL decompressFp12BN254_a0_y
28
+ VAR GLOBAL decompressFp12BN254_a2_x
29
+ VAR GLOBAL decompressFp12BN254_a2_y
30
+ VAR GLOBAL decompressFp12BN254_a4_x
31
+ VAR GLOBAL decompressFp12BN254_a4_y
32
+ VAR GLOBAL decompressFp12BN254_a1_x
33
+ VAR GLOBAL decompressFp12BN254_a1_y
34
+ VAR GLOBAL decompressFp12BN254_a3_x
35
+ VAR GLOBAL decompressFp12BN254_a3_y
36
+ VAR GLOBAL decompressFp12BN254_a5_x
37
+ VAR GLOBAL decompressFp12BN254_a5_y
38
+
39
+ VAR GLOBAL decompressFp12BN254_Ca3inv_x
40
+ VAR GLOBAL decompressFp12BN254_Ca3inv_y
41
+ VAR GLOBAL decompressFp12BN254_twoCa1sq_x
42
+ VAR GLOBAL decompressFp12BN254_twoCa1sq_y
43
+ VAR GLOBAL decompressFp12BN254_threeCa3Ca4_x
44
+ VAR GLOBAL decompressFp12BN254_threeCa3Ca4_y
45
+
46
+ VAR GLOBAL decompressFp12BN254_fourCa2inv_x
47
+ VAR GLOBAL decompressFp12BN254_fourCa2inv_y
48
+ VAR GLOBAL decompressFp12BN254_twoCa1sq2_x
49
+ VAR GLOBAL decompressFp12BN254_twoCa1sq2_y
50
+ VAR GLOBAL decompressFp12BN254_Ca5sq_x
51
+ VAR GLOBAL decompressFp12BN254_Ca5sq_y
52
+ VAR GLOBAL decompressFp12BN254_threeCa4sq_x
53
+ VAR GLOBAL decompressFp12BN254_threeCa4sq_y
54
+ VAR GLOBAL decompressFp12BN254_sum_x
55
+ VAR GLOBAL decompressFp12BN254_sum_y
56
+
57
+ VAR GLOBAL decompressFp12BN254_RR
58
+
59
+ decompressFp12BN254:
60
+ RR :MSTORE(decompressFp12BN254_RR)
61
+
62
+ ; Move Ca2, Ca3, Ca4, Ca5 to a2, a3, a4, a5
63
+ $ => A :MLOAD(decompressFp12BN254_Ca2_x)
64
+ $ => B :MLOAD(decompressFp12BN254_Ca2_y)
65
+ A :MSTORE(decompressFp12BN254_a2_x)
66
+ B :MSTORE(decompressFp12BN254_a2_y)
67
+ $ => A :MLOAD(decompressFp12BN254_Ca3_x)
68
+ $ => B :MLOAD(decompressFp12BN254_Ca3_y)
69
+ A :MSTORE(decompressFp12BN254_a3_x)
70
+ B :MSTORE(decompressFp12BN254_a3_y)
71
+ $ => A :MLOAD(decompressFp12BN254_Ca4_x)
72
+ $ => B :MLOAD(decompressFp12BN254_Ca4_y)
73
+ A :MSTORE(decompressFp12BN254_a4_x)
74
+ B :MSTORE(decompressFp12BN254_a4_y)
75
+ $ => A :MLOAD(decompressFp12BN254_Ca5_x)
76
+ $ => B :MLOAD(decompressFp12BN254_Ca5_y)
77
+ A :MSTORE(decompressFp12BN254_a5_x)
78
+ B :MSTORE(decompressFp12BN254_a5_y)
79
+
80
+ ; Is Ca2 = 0?
81
+ 0n => B
82
+ $ => A :MLOAD(decompressFp12BN254_Ca2_x)
83
+ $ :EQ, JMPNC(__decompressFp12BN254_Ca2_continue)
84
+ $ => A :MLOAD(decompressFp12BN254_Ca2_y)
85
+ $ :EQ, JMPC(decompressFp12BN254_Ca2_is_zero)
86
+ __decompressFp12BN254_Ca2_continue:
87
+
88
+ :JMP(decompressFp12BN254_Ca2_is_not_zero)
89
+
90
+ decompressFp12BN254_Ca2_is_zero:
91
+ ; 1] Compute a1 = (2·a4·a5)/a3
92
+ $ => A :MLOAD(decompressFp12BN254_Ca3_x)
93
+ $ => B :MLOAD(decompressFp12BN254_Ca3_y), CALL(invFp2BN254)
94
+ C :MSTORE(decompressFp12BN254_Ca3inv_x)
95
+ D :MSTORE(decompressFp12BN254_Ca3inv_y)
96
+
97
+ 2n => A
98
+ $ => C :MLOAD(decompressFp12BN254_Ca4_x)
99
+ $ => D :MLOAD(decompressFp12BN254_Ca4_y), CALL(escalarMulFp2BN254)
100
+ E => A
101
+ C => B
102
+ $ => C :MLOAD(decompressFp12BN254_Ca5_x)
103
+ $ => D :MLOAD(decompressFp12BN254_Ca5_y), CALL(mulFp2BN254)
104
+ E => A
105
+ C => B
106
+ $ => C :MLOAD(decompressFp12BN254_Ca3inv_x)
107
+ $ => D :MLOAD(decompressFp12BN254_Ca3inv_y), CALL(mulFp2BN254)
108
+ E :MSTORE(decompressFp12BN254_a1_x)
109
+ C :MSTORE(decompressFp12BN254_a1_y)
110
+
111
+ ; 2] Compute a0 = (2·a1² - 3·a3·a4)(9+u) + 1
112
+ $ => A :MLOAD(decompressFp12BN254_a1_x)
113
+ $ => B :MLOAD(decompressFp12BN254_a1_y), CALL(squareFp2BN254)
114
+ 2n => A
115
+ C => D
116
+ E => C :CALL(escalarMulFp2BN254)
117
+ E :MSTORE(decompressFp12BN254_twoCa1sq_x)
118
+ C :MSTORE(decompressFp12BN254_twoCa1sq_y)
119
+
120
+ 3n => A
121
+ $ => C :MLOAD(decompressFp12BN254_Ca3_x)
122
+ $ => D :MLOAD(decompressFp12BN254_Ca3_y), CALL(escalarMulFp2BN254)
123
+ E => A
124
+ C => B
125
+ $ => C :MLOAD(decompressFp12BN254_Ca4_x)
126
+ $ => D :MLOAD(decompressFp12BN254_Ca4_y), CALL(mulFp2BN254)
127
+ E :MSTORE(decompressFp12BN254_threeCa3Ca4_x)
128
+ C :MSTORE(decompressFp12BN254_threeCa3Ca4_y)
129
+
130
+ $ => A :MLOAD(decompressFp12BN254_twoCa1sq_x)
131
+ $ => B :MLOAD(decompressFp12BN254_twoCa1sq_y)
132
+ C => D
133
+ E => C :CALL(subFp2BN254)
134
+ E => A
135
+ C => B
136
+ 9n => C
137
+ 1n => D :CALL(mulFp2BN254)
138
+ C :MSTORE(decompressFp12BN254_a0_y)
139
+ E => A
140
+ 1n => C :CALL(addFpBN254)
141
+ C :MSTORE(decompressFp12BN254_a0_x)
142
+
143
+ :JMP(decompressFp12BN254_end)
144
+
145
+
146
+ decompressFp12BN254_Ca2_is_not_zero:
147
+ ; 1] Compute a1 = (a5²·(9+u) + 3·a4² - 2·a3)/(4·a2)
148
+ 4n => A
149
+ $ => C :MLOAD(decompressFp12BN254_Ca2_x)
150
+ $ => D :MLOAD(decompressFp12BN254_Ca2_y), CALL(escalarMulFp2BN254)
151
+ E => A
152
+ C => B :CALL(invFp2BN254)
153
+ C :MSTORE(decompressFp12BN254_fourCa2inv_x)
154
+ D :MSTORE(decompressFp12BN254_fourCa2inv_y)
155
+
156
+ $ => A :MLOAD(decompressFp12BN254_Ca5_x)
157
+ $ => B :MLOAD(decompressFp12BN254_Ca5_y), CALL(squareFp2BN254)
158
+ E => A
159
+ C => B
160
+ 9n => C
161
+ 1n => D :CALL(mulFp2BN254)
162
+ E :MSTORE(decompressFp12BN254_Ca5sq_x)
163
+ C :MSTORE(decompressFp12BN254_Ca5sq_y)
164
+
165
+ $ => A :MLOAD(decompressFp12BN254_Ca4_x)
166
+ $ => B :MLOAD(decompressFp12BN254_Ca4_y), CALL(squareFp2BN254)
167
+ 3n => A
168
+ C => D
169
+ E => C :CALL(escalarMulFp2BN254)
170
+ E :MSTORE(decompressFp12BN254_threeCa4sq_x)
171
+ C :MSTORE(decompressFp12BN254_threeCa4sq_y)
172
+
173
+ 2n => A
174
+ $ => C :MLOAD(decompressFp12BN254_Ca3_x)
175
+ $ => D :MLOAD(decompressFp12BN254_Ca3_y), CALL(escalarMulFp2BN254)
176
+ $ => A :MLOAD(decompressFp12BN254_threeCa4sq_x)
177
+ $ => B :MLOAD(decompressFp12BN254_threeCa4sq_y)
178
+ C => D
179
+ E => C :CALL(subFp2BN254)
180
+ E => A
181
+ C => B
182
+ $ => C :MLOAD(decompressFp12BN254_Ca5sq_x)
183
+ $ => D :MLOAD(decompressFp12BN254_Ca5sq_y), CALL(addFp2BN254)
184
+ E => A
185
+ C => B
186
+ $ => C :MLOAD(decompressFp12BN254_fourCa2inv_x)
187
+ $ => D :MLOAD(decompressFp12BN254_fourCa2inv_y), CALL(mulFp2BN254)
188
+ E :MSTORE(decompressFp12BN254_a1_x)
189
+ C :MSTORE(decompressFp12BN254_a1_y)
190
+
191
+ ; 2] Compute a0 = (2·a1² + a2·a5 - 3·a3·a4)(9+u) + 1
192
+ $ => A :MLOAD(decompressFp12BN254_a1_x)
193
+ $ => B :MLOAD(decompressFp12BN254_a1_y), CALL(squareFp2BN254)
194
+ 2n => A
195
+ C => D
196
+ E => C :CALL(escalarMulFp2BN254)
197
+ E :MSTORE(decompressFp12BN254_twoCa1sq2_x)
198
+ C :MSTORE(decompressFp12BN254_twoCa1sq2_y)
199
+
200
+ $ => A :MLOAD(decompressFp12BN254_Ca2_x)
201
+ $ => B :MLOAD(decompressFp12BN254_Ca2_y)
202
+ $ => C :MLOAD(decompressFp12BN254_Ca5_x)
203
+ $ => D :MLOAD(decompressFp12BN254_Ca5_y), CALL(mulFp2BN254)
204
+ E => A
205
+ C => B
206
+ $ => C :MLOAD(decompressFp12BN254_twoCa1sq2_x)
207
+ $ => D :MLOAD(decompressFp12BN254_twoCa1sq2_y), CALL(addFp2BN254)
208
+
209
+ E :MSTORE(decompressFp12BN254_sum_x)
210
+ C :MSTORE(decompressFp12BN254_sum_y)
211
+
212
+ $ => A :MLOAD(decompressFp12BN254_Ca3_x)
213
+ $ => B :MLOAD(decompressFp12BN254_Ca3_y)
214
+ $ => C :MLOAD(decompressFp12BN254_Ca4_x)
215
+ $ => D :MLOAD(decompressFp12BN254_Ca4_y), CALL(mulFp2BN254)
216
+ 3n => A
217
+ C => D
218
+ E => C :CALL(escalarMulFp2BN254)
219
+ $ => A :MLOAD(decompressFp12BN254_sum_x)
220
+ $ => B :MLOAD(decompressFp12BN254_sum_y)
221
+ C => D
222
+ E => C :CALL(subFp2BN254)
223
+ E => A
224
+ C => B
225
+ 9n => C
226
+ 1n => D :CALL(mulFp2BN254)
227
+ C :MSTORE(decompressFp12BN254_a0_y)
228
+ E => A
229
+ 1n => C :CALL(addFpBN254)
230
+ C :MSTORE(decompressFp12BN254_a0_x)
231
+
232
+ :JMP(decompressFp12BN254_end)
233
+
234
+ decompressFp12BN254_end:
235
+ $ => RR :MLOAD(decompressFp12BN254_RR)
236
+ :RETURN