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