@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.
- package/.eslintrc.js +33 -0
- package/.github/CODEOWNERS +14 -0
- package/.github/ISSUE_TEMPLATE/bug.yml +38 -0
- package/.github/ISSUE_TEMPLATE/feature.yml +26 -0
- package/.github/ISSUE_TEMPLATE/question.yml +26 -0
- package/.github/workflows/main.yaml +40 -0
- package/LICENSE +636 -0
- package/README.md +23 -5
- package/audits/Hexens_Polygon_zkEVM_PUBLIC_27.02.23.pdf +0 -0
- package/audits/Polygon-zkEVM-Public-v1.1-verichains-19-03-2024.pdf +0 -0
- package/audits/zkEVM-ROM-upgrade-1-Spearbit-30-May.pdf +0 -0
- package/audits/zkEVM-ROM-upgrade-2-Spearbit-21-August.pdf +0 -0
- package/audits/zkEVM-engagement-1-Spearbit-27-March.pdf +0 -0
- package/audits/zkEVM-engagement-2-Spearbit-27-March.pdf +0 -0
- package/audits/zkEVM-engagement-3-Spearbit-6-April.pdf +0 -0
- package/counters/README.md +45 -0
- package/counters/counters-executor.js +80 -0
- package/counters/countersConstants.zkasm +370 -0
- package/counters/endIncludes.zkasm +18 -0
- package/counters/initIncludes.zkasm +2 -0
- package/counters/tests/MLOAD32.zkasm +27 -0
- package/counters/tests/MLOADX.zkasm +30 -0
- package/counters/tests/MSTORE32.zkasm +32 -0
- package/counters/tests/MSTOREX.zkasm +36 -0
- package/counters/tests/SHLarith.zkasm +28 -0
- package/counters/tests/SHLarithBit.zkasm +28 -0
- package/counters/tests/SHRarith.zkasm +28 -0
- package/counters/tests/SHRarithBit.zkasm +28 -0
- package/counters/tests/abs.zkasm +29 -0
- package/counters/tests/addBatchHashByteByByte.zkasm +31 -0
- package/counters/tests/computeGasSendCall.zkasm +30 -0
- package/counters/tests/divArith.zkasm +27 -0
- package/counters/tests/expAD.zkasm +30 -0
- package/counters/tests/getLenBits.zkasm +30 -0
- package/counters/tests/getLenBytes.zkasm +32 -0
- package/counters/tests/isEmptyAccount.zkasm +30 -0
- package/counters/tests/mulARITH.zkasm +28 -0
- package/counters/tests/offsetUtil.zkasm +29 -0
- package/counters/tests/opADDMOD.zkasm +28 -0
- package/counters/tests/opAdd.zkasm +27 -0
- package/counters/tests/opBLOCKHASH.zkasm +28 -0
- package/counters/tests/opCALL.zkasm +41 -0
- package/counters/tests/opCALLCODE.zkasm +41 -0
- package/counters/tests/opCALLDATACOPY.zkasm +28 -0
- package/counters/tests/opCALLDATALOAD.zkasm +27 -0
- package/counters/tests/opCODECOPY.zkasm +28 -0
- package/counters/tests/opCREATE.zkasm +35 -0
- package/counters/tests/opCREATE2.zkasm +35 -0
- package/counters/tests/opDELEGATECALL.zkasm +35 -0
- package/counters/tests/opDIV.zkasm +27 -0
- package/counters/tests/opEXP.zkasm +29 -0
- package/counters/tests/opEXTCODECOPY.zkasm +29 -0
- package/counters/tests/opMOD.zkasm +27 -0
- package/counters/tests/opMUL.zkasm +27 -0
- package/counters/tests/opMULMOD.zkasm +28 -0
- package/counters/tests/opRETURN.zkasm +32 -0
- package/counters/tests/opRETURNDATACOPY.zkasm +29 -0
- package/counters/tests/opREVERT.zkasm +32 -0
- package/counters/tests/opSDIV.zkasm +28 -0
- package/counters/tests/opSHA3.zkasm +28 -0
- package/counters/tests/opSIGNEXTEND.zkasm +27 -0
- package/counters/tests/opSMOD.zkasm +28 -0
- package/counters/tests/opSTATICCALL.zkasm +35 -0
- package/counters/tests/opSUB.zkasm +27 -0
- package/counters/tests/saveMem.zkasm +31 -0
- package/docs/opcode-cost-zk-counters.md +315 -0
- package/docs/usage-ecrecover.md +51 -0
- package/index.js +43 -0
- package/main/block-info.zkasm +204 -0
- package/main/constants.zkasm +145 -0
- package/main/ecrecover/addFpEc.zkasm +31 -0
- package/main/ecrecover/checkSqrtFpEc.zkasm +1558 -0
- package/main/ecrecover/constEc.zkasm +13 -0
- package/main/ecrecover/ecrecover.zkasm +280 -0
- package/main/ecrecover/invFnEc.zkasm +44 -0
- package/main/ecrecover/invFpEc.zkasm +45 -0
- package/main/ecrecover/mulFnEc.zkasm +36 -0
- package/main/ecrecover/mulFpEc.zkasm +36 -0
- package/main/ecrecover/mulPointEc.zkasm +311 -0
- package/main/ecrecover/sqFpEc.zkasm +38 -0
- package/main/ecrecover/sqrtFpEc.zkasm +70 -0
- package/main/end.zkasm +4 -0
- package/main/l2-tx-hash.zkasm +159 -0
- package/main/load-change-l2-block-utils.zkasm +11 -0
- package/main/load-change-l2-block.zkasm +28 -0
- package/main/load-tx-rlp-utils.zkasm +72 -0
- package/main/load-tx-rlp.zkasm +431 -0
- package/main/main.zkasm +237 -0
- package/main/map-opcodes.zkasm +274 -0
- package/main/modexp/array_lib/array_add_AGTB.zkasm +123 -0
- package/main/modexp/array_lib/array_add_short.zkasm +85 -0
- package/main/modexp/array_lib/array_div.zkasm +215 -0
- package/main/modexp/array_lib/array_div_long.zkasm +284 -0
- package/main/modexp/array_lib/array_div_short.zkasm +222 -0
- package/main/modexp/array_lib/array_mul.zkasm +97 -0
- package/main/modexp/array_lib/array_mul_long.zkasm +156 -0
- package/main/modexp/array_lib/array_mul_short.zkasm +127 -0
- package/main/modexp/array_lib/array_square.zkasm +246 -0
- package/main/modexp/array_lib/unused/array_add.zkasm +100 -0
- package/main/modexp/array_lib/unused/array_is_odd.zkasm +23 -0
- package/main/modexp/array_lib/unused/array_is_one.zkasm +33 -0
- package/main/modexp/array_lib/unused/array_is_zero.zkasm +34 -0
- package/main/modexp/array_lib/unused/array_sub_AGTB.zkasm +111 -0
- package/main/modexp/array_lib/unused/array_unshift.zkasm +37 -0
- package/main/modexp/array_lib/utils/array_compare.zkasm +82 -0
- package/main/modexp/array_lib/utils/array_trim.zkasm +49 -0
- package/main/modexp/constants.zkasm +5 -0
- package/main/modexp/modexp.zkasm +296 -0
- package/main/modexp/modexp_utils.zkasm +230 -0
- package/main/opcodes/arithmetic.zkasm +357 -0
- package/main/opcodes/block.zkasm +163 -0
- package/main/opcodes/calldata-returndata-code.zkasm +619 -0
- package/main/opcodes/comparison.zkasm +446 -0
- package/main/opcodes/context-information.zkasm +169 -0
- package/main/opcodes/create-terminate-context.zkasm +1011 -0
- package/main/opcodes/crypto.zkasm +96 -0
- package/main/opcodes/flow-control.zkasm +126 -0
- package/main/opcodes/logs.zkasm +193 -0
- package/main/opcodes/stack-operations.zkasm +658 -0
- package/main/opcodes/storage-memory.zkasm +313 -0
- package/main/pairings/BN254/addPointBN254.zkasm +245 -0
- package/main/pairings/BN254/ecAdd.zkasm +312 -0
- package/main/pairings/BN254/ecMul.zkasm +159 -0
- package/main/pairings/BN254/escalarMulBN254.zkasm +155 -0
- package/main/pairings/BN254/lineDiffPointsBN254.zkasm +83 -0
- package/main/pairings/BN254/lineSamePointsBN254.zkasm +96 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/compressFp12BN254.zkasm +49 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/decompressFp12BN254.zkasm +236 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/expByXCompCycloFp12BN254.zkasm +444 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCompCycloFp12BN254.zkasm +212 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/squareCycloFp12BN254.zkasm +228 -0
- package/main/pairings/FP12BN254/CYCLOFP12BN254/xBinDecompBN254.zkasm +64 -0
- package/main/pairings/FP12BN254/frob2Fp12BN254.zkasm +80 -0
- package/main/pairings/FP12BN254/frob3Fp12BN254.zkasm +96 -0
- package/main/pairings/FP12BN254/frobFp12BN254.zkasm +96 -0
- package/main/pairings/FP12BN254/inverseFp12BN254.zkasm +289 -0
- package/main/pairings/FP12BN254/mulFp12BN254.zkasm +408 -0
- package/main/pairings/FP12BN254/sparseMulAFp12BN254.zkasm +296 -0
- package/main/pairings/FP12BN254/sparseMulBFp12BN254.zkasm +291 -0
- package/main/pairings/FP12BN254/squareFp12BN254.zkasm +376 -0
- package/main/pairings/FP2BN254/addFp2BN254.zkasm +19 -0
- package/main/pairings/FP2BN254/escalarMulFp2BN254.zkasm +20 -0
- package/main/pairings/FP2BN254/invFp2BN254.zkasm +66 -0
- package/main/pairings/FP2BN254/mulFp2BN254.zkasm +19 -0
- package/main/pairings/FP2BN254/squareFp2BN254.zkasm +21 -0
- package/main/pairings/FP2BN254/subFp2BN254.zkasm +19 -0
- package/main/pairings/FP4BN254/squareFp4BN254.zkasm +76 -0
- package/main/pairings/FP6BN254/addFp6BN254.zkasm +59 -0
- package/main/pairings/FP6BN254/escalarMulFp6BN254.zkasm +51 -0
- package/main/pairings/FP6BN254/inverseFp6BN254.zkasm +208 -0
- package/main/pairings/FP6BN254/mulFp6BN254.zkasm +201 -0
- package/main/pairings/FP6BN254/sparseMulAFp6BN254.zkasm +65 -0
- package/main/pairings/FP6BN254/sparseMulBFp6BN254.zkasm +134 -0
- package/main/pairings/FP6BN254/sparseMulCFp6BN254.zkasm +128 -0
- package/main/pairings/FP6BN254/squareFp6BN254.zkasm +147 -0
- package/main/pairings/FP6BN254/subFp6BN254.zkasm +59 -0
- package/main/pairings/FPBN254/addFpBN254.zkasm +29 -0
- package/main/pairings/FPBN254/invFpBN254.zkasm +55 -0
- package/main/pairings/FPBN254/mulFpBN254.zkasm +29 -0
- package/main/pairings/FPBN254/reduceFpBN254.zkasm +25 -0
- package/main/pairings/FPBN254/squareFpBN254.zkasm +31 -0
- package/main/pairings/FPBN254/subFpBN254.zkasm +36 -0
- package/main/pairings/FRBN254/reduceFrBN254.zkasm +25 -0
- package/main/pairings/constants.zkasm +62 -0
- package/main/pairings/ecPairing.zkasm +244 -0
- package/main/pairings/finalExpBN254.zkasm +2095 -0
- package/main/pairings/halfPairingBN254.zkasm +428 -0
- package/main/pairings/loopLengthBN254.zkasm +75 -0
- package/main/pairings/millerLoopBN254.zkasm +741 -0
- package/main/pairings/pairingBN254.zkasm +481 -0
- package/main/pairings/unused/addFp12BN254.zkasm +130 -0
- package/main/pairings/unused/expByXCycloFp12BN254.zkasm +411 -0
- package/main/pairings/unused/expFp12BN254.zkasm +333 -0
- package/main/pairings/unused/subFp12BN254.zkasm +130 -0
- package/main/pairings/unused/xPseudoBinDecompBN254.zkasm +68 -0
- package/main/pairings/utilsTests/expCycloFp12BN254.zkasm +334 -0
- package/main/precompiled/end.zkasm +42 -0
- package/main/precompiled/identity.zkasm +99 -0
- package/main/precompiled/pre-ecAdd.zkasm +84 -0
- package/main/precompiled/pre-ecMul.zkasm +82 -0
- package/main/precompiled/pre-ecPairing.zkasm +72 -0
- package/main/precompiled/pre-ecrecover.zkasm +71 -0
- package/main/precompiled/pre-modexp.zkasm +367 -0
- package/main/precompiled/pre-sha2-256.zkasm +125 -0
- package/main/precompiled/revert-precompiled.zkasm +25 -0
- package/main/precompiled/selector.zkasm +77 -0
- package/main/process-change-l2-block.zkasm +147 -0
- package/main/process-tx.zkasm +587 -0
- package/main/tables/2-exp.zkasm +260 -0
- package/main/touched.zkasm +118 -0
- package/main/utils.zkasm +2335 -0
- package/main/vars.zkasm +117 -0
- package/package.json +62 -3
- package/test/bytes-length.zkasm +39 -0
- package/test/ecrecover.zkasm +538 -0
- package/test/lt4-test.zkasm +38 -0
- package/test/mstorex.zkasm +191 -0
- package/test/opcalldatacopy.ignore.zkasm +331 -0
- package/test/performance/read-push.zkasm +71 -0
- package/test/read-push.zkasm +304 -0
- package/test/testArrayArith.zkasm +1099 -0
- package/test/testArrayUtils.zkasm +335 -0
- package/test/testCycloFp12ArithBN254.zkasm +548 -0
- package/test/testEcAdd.zkasm +252 -0
- package/test/testEcMul.zkasm +231 -0
- package/test/testEcPairing.zkasm +436 -0
- package/test/testFinalExpBn254.zkasm +139 -0
- package/test/testFp12ArithBN254.zkasm +692 -0
- package/test/testFp2ArithBN254.zkasm +185 -0
- package/test/testFp4ArithBN254.zkasm +128 -0
- package/test/testFp6ArithBN254.zkasm +260 -0
- package/test/testFpArithBN254.zkasm +159 -0
- package/test/testFrArithBN254.zkasm +113 -0
- package/test/testHalfPairingBN254.zkasm +285 -0
- package/test/testModExp.zkasm +586 -0
- package/test/testModExpReturn.zkasm +81 -0
- package/test/testPairingBN254.zkasm +463 -0
- package/test/testPointArithBN254.zkasm +270 -0
- package/test/testSHA256.zkasm +27 -0
- package/test/touched-assert.zkasm +59 -0
- package/test/utils-expAD.zkasm +48 -0
- package/test/utils-getLenBytes.zkasm +36 -0
- package/tools/audit-tools/registry-op-checker.js +71 -0
- package/tools/get-not-used-labels.js +31 -0
- package/tools/helpers/helpers.js +47 -0
- package/tools/modexp-utils/README.md +5 -0
- package/tools/modexp-utils/modexp-test-gen.js +168 -0
- package/tools/modexp-utils/modexp-test-int.sage +37 -0
- package/tools/parallel-testing/checker.sh +6 -0
- package/tools/parallel-testing/gen-parallel-tests.js +78 -0
- package/tools/parallel-testing/parallel-tests-sample/sample.test.js +136 -0
- 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
|