@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,376 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P) because if falls back to FP6 arithmetic
|
3
|
+
;;
|
4
|
+
;; squareFp12BN254:
|
5
|
+
;; in: (a1 + a2·w) ∈ Fp12, where ai ∈ Fp6
|
6
|
+
;; out: (a1 + a2·w)² = (c1 + c2·w) ∈ Fp12, where:
|
7
|
+
;; - c1 = (a1-a2)·(a1-a2·v) + a1·a2 + a1·a2·v
|
8
|
+
;; - c2 = 2·a1·a2
|
9
|
+
;;
|
10
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
11
|
+
|
12
|
+
VAR GLOBAL squareFp12BN254_a11_x
|
13
|
+
VAR GLOBAL squareFp12BN254_a11_y
|
14
|
+
VAR GLOBAL squareFp12BN254_a12_x
|
15
|
+
VAR GLOBAL squareFp12BN254_a12_y
|
16
|
+
VAR GLOBAL squareFp12BN254_a13_x
|
17
|
+
VAR GLOBAL squareFp12BN254_a13_y
|
18
|
+
VAR GLOBAL squareFp12BN254_a21_x
|
19
|
+
VAR GLOBAL squareFp12BN254_a21_y
|
20
|
+
VAR GLOBAL squareFp12BN254_a22_x
|
21
|
+
VAR GLOBAL squareFp12BN254_a22_y
|
22
|
+
VAR GLOBAL squareFp12BN254_a23_x
|
23
|
+
VAR GLOBAL squareFp12BN254_a23_y
|
24
|
+
VAR GLOBAL squareFp12BN254_c11_x
|
25
|
+
VAR GLOBAL squareFp12BN254_c11_y
|
26
|
+
VAR GLOBAL squareFp12BN254_c12_x
|
27
|
+
VAR GLOBAL squareFp12BN254_c12_y
|
28
|
+
VAR GLOBAL squareFp12BN254_c13_x
|
29
|
+
VAR GLOBAL squareFp12BN254_c13_y
|
30
|
+
VAR GLOBAL squareFp12BN254_c21_x
|
31
|
+
VAR GLOBAL squareFp12BN254_c21_y
|
32
|
+
VAR GLOBAL squareFp12BN254_c22_x
|
33
|
+
VAR GLOBAL squareFp12BN254_c22_y
|
34
|
+
VAR GLOBAL squareFp12BN254_c23_x
|
35
|
+
VAR GLOBAL squareFp12BN254_c23_y
|
36
|
+
|
37
|
+
VAR GLOBAL squareFp12BN254_a1a2mul1_x
|
38
|
+
VAR GLOBAL squareFp12BN254_a1a2mul1_y
|
39
|
+
VAR GLOBAL squareFp12BN254_a1a2mul2_x
|
40
|
+
VAR GLOBAL squareFp12BN254_a1a2mul2_y
|
41
|
+
VAR GLOBAL squareFp12BN254_a1a2mul3_x
|
42
|
+
VAR GLOBAL squareFp12BN254_a1a2mul3_y
|
43
|
+
|
44
|
+
VAR GLOBAL squareFp12BN254_a2vmul1_x
|
45
|
+
VAR GLOBAL squareFp12BN254_a2vmul1_y
|
46
|
+
VAR GLOBAL squareFp12BN254_a2vmul2_x
|
47
|
+
VAR GLOBAL squareFp12BN254_a2vmul2_y
|
48
|
+
VAR GLOBAL squareFp12BN254_a2vmul3_x
|
49
|
+
VAR GLOBAL squareFp12BN254_a2vmul3_y
|
50
|
+
|
51
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul1_x
|
52
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul1_y
|
53
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul2_x
|
54
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul2_y
|
55
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul3_x
|
56
|
+
VAR GLOBAL squareFp12BN254_a1a2vmul3_y
|
57
|
+
|
58
|
+
VAR GLOBAL squareFp12BN254_a1a2sub1_x
|
59
|
+
VAR GLOBAL squareFp12BN254_a1a2sub1_y
|
60
|
+
VAR GLOBAL squareFp12BN254_a1a2sub2_x
|
61
|
+
VAR GLOBAL squareFp12BN254_a1a2sub2_y
|
62
|
+
VAR GLOBAL squareFp12BN254_a1a2sub3_x
|
63
|
+
VAR GLOBAL squareFp12BN254_a1a2sub3_y
|
64
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub1_x
|
65
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub1_y
|
66
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub2_x
|
67
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub2_y
|
68
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub3_x
|
69
|
+
VAR GLOBAL squareFp12BN254_a1a2vsub3_y
|
70
|
+
|
71
|
+
VAR GLOBAL squareFp12BN254_RR
|
72
|
+
|
73
|
+
squareFp12BN254:
|
74
|
+
RR :MSTORE(squareFp12BN254_RR)
|
75
|
+
|
76
|
+
; 1] a1·a2
|
77
|
+
$ => A :MLOAD(squareFp12BN254_a11_x)
|
78
|
+
$ => B :MLOAD(squareFp12BN254_a11_y)
|
79
|
+
A :MSTORE(mulFp6BN254_a1_x)
|
80
|
+
B :MSTORE(mulFp6BN254_a1_y)
|
81
|
+
$ => A :MLOAD(squareFp12BN254_a12_x)
|
82
|
+
$ => B :MLOAD(squareFp12BN254_a12_y)
|
83
|
+
A :MSTORE(mulFp6BN254_a2_x)
|
84
|
+
B :MSTORE(mulFp6BN254_a2_y)
|
85
|
+
$ => A :MLOAD(squareFp12BN254_a13_x)
|
86
|
+
$ => B :MLOAD(squareFp12BN254_a13_y)
|
87
|
+
A :MSTORE(mulFp6BN254_a3_x)
|
88
|
+
B :MSTORE(mulFp6BN254_a3_y)
|
89
|
+
|
90
|
+
$ => A :MLOAD(squareFp12BN254_a21_x)
|
91
|
+
$ => B :MLOAD(squareFp12BN254_a21_y)
|
92
|
+
A :MSTORE(mulFp6BN254_b1_x)
|
93
|
+
B :MSTORE(mulFp6BN254_b1_y)
|
94
|
+
$ => A :MLOAD(squareFp12BN254_a22_x)
|
95
|
+
$ => B :MLOAD(squareFp12BN254_a22_y)
|
96
|
+
A :MSTORE(mulFp6BN254_b2_x)
|
97
|
+
B :MSTORE(mulFp6BN254_b2_y)
|
98
|
+
$ => A :MLOAD(squareFp12BN254_a23_x)
|
99
|
+
$ => B :MLOAD(squareFp12BN254_a23_y)
|
100
|
+
A :MSTORE(mulFp6BN254_b3_x)
|
101
|
+
B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
|
102
|
+
$ => A :MLOAD(mulFp6BN254_c1_x)
|
103
|
+
$ => B :MLOAD(mulFp6BN254_c1_y)
|
104
|
+
A :MSTORE(squareFp12BN254_a1a2mul1_x)
|
105
|
+
B :MSTORE(squareFp12BN254_a1a2mul1_y)
|
106
|
+
$ => A :MLOAD(mulFp6BN254_c2_x)
|
107
|
+
$ => B :MLOAD(mulFp6BN254_c2_y)
|
108
|
+
A :MSTORE(squareFp12BN254_a1a2mul2_x)
|
109
|
+
B :MSTORE(squareFp12BN254_a1a2mul2_y)
|
110
|
+
$ => A :MLOAD(mulFp6BN254_c3_x)
|
111
|
+
$ => B :MLOAD(mulFp6BN254_c3_y)
|
112
|
+
A :MSTORE(squareFp12BN254_a1a2mul3_x)
|
113
|
+
B :MSTORE(squareFp12BN254_a1a2mul3_y)
|
114
|
+
|
115
|
+
; 2] a2·v
|
116
|
+
$ => A :MLOAD(squareFp12BN254_a21_x)
|
117
|
+
$ => B :MLOAD(squareFp12BN254_a21_y)
|
118
|
+
A :MSTORE(sparseMulAFp6BN254_a1_x)
|
119
|
+
B :MSTORE(sparseMulAFp6BN254_a1_y)
|
120
|
+
$ => A :MLOAD(squareFp12BN254_a22_x)
|
121
|
+
$ => B :MLOAD(squareFp12BN254_a22_y)
|
122
|
+
A :MSTORE(sparseMulAFp6BN254_a2_x)
|
123
|
+
B :MSTORE(sparseMulAFp6BN254_a2_y)
|
124
|
+
$ => A :MLOAD(squareFp12BN254_a23_x)
|
125
|
+
$ => B :MLOAD(squareFp12BN254_a23_y)
|
126
|
+
A :MSTORE(sparseMulAFp6BN254_a3_x)
|
127
|
+
B :MSTORE(sparseMulAFp6BN254_a3_y)
|
128
|
+
|
129
|
+
1n :MSTORE(sparseMulAFp6BN254_b2_x)
|
130
|
+
0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
|
131
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c1_x)
|
132
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c1_y)
|
133
|
+
A :MSTORE(squareFp12BN254_a2vmul1_x)
|
134
|
+
B :MSTORE(squareFp12BN254_a2vmul1_y)
|
135
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c2_x)
|
136
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c2_y)
|
137
|
+
A :MSTORE(squareFp12BN254_a2vmul2_x)
|
138
|
+
B :MSTORE(squareFp12BN254_a2vmul2_y)
|
139
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c3_x)
|
140
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c3_y)
|
141
|
+
A :MSTORE(squareFp12BN254_a2vmul3_x)
|
142
|
+
B :MSTORE(squareFp12BN254_a2vmul3_y)
|
143
|
+
|
144
|
+
; 2] a1·a2·v
|
145
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
|
146
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
|
147
|
+
A :MSTORE(sparseMulAFp6BN254_a1_x)
|
148
|
+
B :MSTORE(sparseMulAFp6BN254_a1_y)
|
149
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
|
150
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
|
151
|
+
A :MSTORE(sparseMulAFp6BN254_a2_x)
|
152
|
+
B :MSTORE(sparseMulAFp6BN254_a2_y)
|
153
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
|
154
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
|
155
|
+
A :MSTORE(sparseMulAFp6BN254_a3_x)
|
156
|
+
B :MSTORE(sparseMulAFp6BN254_a3_y)
|
157
|
+
|
158
|
+
1n :MSTORE(sparseMulAFp6BN254_b2_x)
|
159
|
+
0n :MSTORE(sparseMulAFp6BN254_b2_y), CALL(sparseMulAFp6BN254)
|
160
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c1_x)
|
161
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c1_y)
|
162
|
+
A :MSTORE(squareFp12BN254_a1a2vmul1_x)
|
163
|
+
B :MSTORE(squareFp12BN254_a1a2vmul1_y)
|
164
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c2_x)
|
165
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c2_y)
|
166
|
+
A :MSTORE(squareFp12BN254_a1a2vmul2_x)
|
167
|
+
B :MSTORE(squareFp12BN254_a1a2vmul2_y)
|
168
|
+
$ => A :MLOAD(sparseMulAFp6BN254_c3_x)
|
169
|
+
$ => B :MLOAD(sparseMulAFp6BN254_c3_y)
|
170
|
+
A :MSTORE(squareFp12BN254_a1a2vmul3_x)
|
171
|
+
B :MSTORE(squareFp12BN254_a1a2vmul3_y)
|
172
|
+
|
173
|
+
; 3] c2 = 2·a1·a2
|
174
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
|
175
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
|
176
|
+
A :MSTORE(escalarMulFp6BN254_a1_x)
|
177
|
+
B :MSTORE(escalarMulFp6BN254_a1_y)
|
178
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
|
179
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
|
180
|
+
A :MSTORE(escalarMulFp6BN254_a2_x)
|
181
|
+
B :MSTORE(escalarMulFp6BN254_a2_y)
|
182
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
|
183
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
|
184
|
+
A :MSTORE(escalarMulFp6BN254_a3_x)
|
185
|
+
B :MSTORE(escalarMulFp6BN254_a3_y)
|
186
|
+
|
187
|
+
2n :MSTORE(escalarMulFp6BN254_b), CALL(escalarMulFp6BN254)
|
188
|
+
$ => A :MLOAD(escalarMulFp6BN254_c1_x)
|
189
|
+
$ => B :MLOAD(escalarMulFp6BN254_c1_y)
|
190
|
+
A :MSTORE(squareFp12BN254_c21_x)
|
191
|
+
B :MSTORE(squareFp12BN254_c21_y)
|
192
|
+
$ => A :MLOAD(escalarMulFp6BN254_c2_x)
|
193
|
+
$ => B :MLOAD(escalarMulFp6BN254_c2_y)
|
194
|
+
A :MSTORE(squareFp12BN254_c22_x)
|
195
|
+
B :MSTORE(squareFp12BN254_c22_y)
|
196
|
+
$ => A :MLOAD(escalarMulFp6BN254_c3_x)
|
197
|
+
$ => B :MLOAD(escalarMulFp6BN254_c3_y)
|
198
|
+
A :MSTORE(squareFp12BN254_c23_x)
|
199
|
+
B :MSTORE(squareFp12BN254_c23_y)
|
200
|
+
|
201
|
+
; 4] a1-a2
|
202
|
+
$ => A :MLOAD(squareFp12BN254_a11_x)
|
203
|
+
$ => B :MLOAD(squareFp12BN254_a11_y)
|
204
|
+
A :MSTORE(subFp6BN254_a1_x)
|
205
|
+
B :MSTORE(subFp6BN254_a1_y)
|
206
|
+
$ => A :MLOAD(squareFp12BN254_a12_x)
|
207
|
+
$ => B :MLOAD(squareFp12BN254_a12_y)
|
208
|
+
A :MSTORE(subFp6BN254_a2_x)
|
209
|
+
B :MSTORE(subFp6BN254_a2_y)
|
210
|
+
$ => A :MLOAD(squareFp12BN254_a13_x)
|
211
|
+
$ => B :MLOAD(squareFp12BN254_a13_y)
|
212
|
+
A :MSTORE(subFp6BN254_a3_x)
|
213
|
+
B :MSTORE(subFp6BN254_a3_y)
|
214
|
+
|
215
|
+
$ => A :MLOAD(squareFp12BN254_a21_x)
|
216
|
+
$ => B :MLOAD(squareFp12BN254_a21_y)
|
217
|
+
A :MSTORE(subFp6BN254_b1_x)
|
218
|
+
B :MSTORE(subFp6BN254_b1_y)
|
219
|
+
$ => A :MLOAD(squareFp12BN254_a22_x)
|
220
|
+
$ => B :MLOAD(squareFp12BN254_a22_y)
|
221
|
+
A :MSTORE(subFp6BN254_b2_x)
|
222
|
+
B :MSTORE(subFp6BN254_b2_y)
|
223
|
+
$ => A :MLOAD(squareFp12BN254_a23_x)
|
224
|
+
$ => B :MLOAD(squareFp12BN254_a23_y)
|
225
|
+
A :MSTORE(subFp6BN254_b3_x)
|
226
|
+
B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
|
227
|
+
|
228
|
+
$ => A :MLOAD(subFp6BN254_c1_x)
|
229
|
+
$ => B :MLOAD(subFp6BN254_c1_y)
|
230
|
+
A :MSTORE(squareFp12BN254_a1a2sub1_x)
|
231
|
+
B :MSTORE(squareFp12BN254_a1a2sub1_y)
|
232
|
+
$ => A :MLOAD(subFp6BN254_c2_x)
|
233
|
+
$ => B :MLOAD(subFp6BN254_c2_y)
|
234
|
+
A :MSTORE(squareFp12BN254_a1a2sub2_x)
|
235
|
+
B :MSTORE(squareFp12BN254_a1a2sub2_y)
|
236
|
+
$ => A :MLOAD(subFp6BN254_c3_x)
|
237
|
+
$ => B :MLOAD(subFp6BN254_c3_y)
|
238
|
+
A :MSTORE(squareFp12BN254_a1a2sub3_x)
|
239
|
+
B :MSTORE(squareFp12BN254_a1a2sub3_y)
|
240
|
+
|
241
|
+
|
242
|
+
; 5] a1-a2·v
|
243
|
+
$ => A :MLOAD(squareFp12BN254_a11_x)
|
244
|
+
$ => B :MLOAD(squareFp12BN254_a11_y)
|
245
|
+
A :MSTORE(subFp6BN254_a1_x)
|
246
|
+
B :MSTORE(subFp6BN254_a1_y)
|
247
|
+
$ => A :MLOAD(squareFp12BN254_a12_x)
|
248
|
+
$ => B :MLOAD(squareFp12BN254_a12_y)
|
249
|
+
A :MSTORE(subFp6BN254_a2_x)
|
250
|
+
B :MSTORE(subFp6BN254_a2_y)
|
251
|
+
$ => A :MLOAD(squareFp12BN254_a13_x)
|
252
|
+
$ => B :MLOAD(squareFp12BN254_a13_y)
|
253
|
+
A :MSTORE(subFp6BN254_a3_x)
|
254
|
+
B :MSTORE(subFp6BN254_a3_y)
|
255
|
+
|
256
|
+
$ => A :MLOAD(squareFp12BN254_a2vmul1_x)
|
257
|
+
$ => B :MLOAD(squareFp12BN254_a2vmul1_y)
|
258
|
+
A :MSTORE(subFp6BN254_b1_x)
|
259
|
+
B :MSTORE(subFp6BN254_b1_y)
|
260
|
+
$ => A :MLOAD(squareFp12BN254_a2vmul2_x)
|
261
|
+
$ => B :MLOAD(squareFp12BN254_a2vmul2_y)
|
262
|
+
A :MSTORE(subFp6BN254_b2_x)
|
263
|
+
B :MSTORE(subFp6BN254_b2_y)
|
264
|
+
$ => A :MLOAD(squareFp12BN254_a2vmul3_x)
|
265
|
+
$ => B :MLOAD(squareFp12BN254_a2vmul3_y)
|
266
|
+
A :MSTORE(subFp6BN254_b3_x)
|
267
|
+
B :MSTORE(subFp6BN254_b3_y), CALL(subFp6BN254)
|
268
|
+
|
269
|
+
$ => A :MLOAD(subFp6BN254_c1_x)
|
270
|
+
$ => B :MLOAD(subFp6BN254_c1_y)
|
271
|
+
A :MSTORE(squareFp12BN254_a1a2vsub1_x)
|
272
|
+
B :MSTORE(squareFp12BN254_a1a2vsub1_y)
|
273
|
+
$ => A :MLOAD(subFp6BN254_c2_x)
|
274
|
+
$ => B :MLOAD(subFp6BN254_c2_y)
|
275
|
+
A :MSTORE(squareFp12BN254_a1a2vsub2_x)
|
276
|
+
B :MSTORE(squareFp12BN254_a1a2vsub2_y)
|
277
|
+
$ => A :MLOAD(subFp6BN254_c3_x)
|
278
|
+
$ => B :MLOAD(subFp6BN254_c3_y)
|
279
|
+
A :MSTORE(squareFp12BN254_a1a2vsub3_x)
|
280
|
+
B :MSTORE(squareFp12BN254_a1a2vsub3_y)
|
281
|
+
|
282
|
+
; 7] c1 = (a1-a2)·(a1-a2·v) + a1·a2 + a1·a2·v
|
283
|
+
$ => A :MLOAD(squareFp12BN254_a1a2sub1_x)
|
284
|
+
$ => B :MLOAD(squareFp12BN254_a1a2sub1_y)
|
285
|
+
A :MSTORE(mulFp6BN254_a1_x)
|
286
|
+
B :MSTORE(mulFp6BN254_a1_y)
|
287
|
+
$ => A :MLOAD(squareFp12BN254_a1a2sub2_x)
|
288
|
+
$ => B :MLOAD(squareFp12BN254_a1a2sub2_y)
|
289
|
+
A :MSTORE(mulFp6BN254_a2_x)
|
290
|
+
B :MSTORE(mulFp6BN254_a2_y)
|
291
|
+
$ => A :MLOAD(squareFp12BN254_a1a2sub3_x)
|
292
|
+
$ => B :MLOAD(squareFp12BN254_a1a2sub3_y)
|
293
|
+
A :MSTORE(mulFp6BN254_a3_x)
|
294
|
+
B :MSTORE(mulFp6BN254_a3_y)
|
295
|
+
|
296
|
+
|
297
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vsub1_x)
|
298
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vsub1_y)
|
299
|
+
A :MSTORE(mulFp6BN254_b1_x)
|
300
|
+
B :MSTORE(mulFp6BN254_b1_y)
|
301
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vsub2_x)
|
302
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vsub2_y)
|
303
|
+
A :MSTORE(mulFp6BN254_b2_x)
|
304
|
+
B :MSTORE(mulFp6BN254_b2_y)
|
305
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vsub3_x)
|
306
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vsub3_y)
|
307
|
+
A :MSTORE(mulFp6BN254_b3_x)
|
308
|
+
B :MSTORE(mulFp6BN254_b3_y), CALL(mulFp6BN254)
|
309
|
+
|
310
|
+
$ => A :MLOAD(mulFp6BN254_c1_x)
|
311
|
+
$ => B :MLOAD(mulFp6BN254_c1_y)
|
312
|
+
A :MSTORE(addFp6BN254_a1_x)
|
313
|
+
B :MSTORE(addFp6BN254_a1_y)
|
314
|
+
$ => A :MLOAD(mulFp6BN254_c2_x)
|
315
|
+
$ => B :MLOAD(mulFp6BN254_c2_y)
|
316
|
+
A :MSTORE(addFp6BN254_a2_x)
|
317
|
+
B :MSTORE(addFp6BN254_a2_y)
|
318
|
+
$ => A :MLOAD(mulFp6BN254_c3_x)
|
319
|
+
$ => B :MLOAD(mulFp6BN254_c3_y)
|
320
|
+
A :MSTORE(addFp6BN254_a3_x)
|
321
|
+
B :MSTORE(addFp6BN254_a3_y)
|
322
|
+
|
323
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul1_x)
|
324
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul1_y)
|
325
|
+
A :MSTORE(addFp6BN254_b1_x)
|
326
|
+
B :MSTORE(addFp6BN254_b1_y)
|
327
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul2_x)
|
328
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul2_y)
|
329
|
+
A :MSTORE(addFp6BN254_b2_x)
|
330
|
+
B :MSTORE(addFp6BN254_b2_y)
|
331
|
+
$ => A :MLOAD(squareFp12BN254_a1a2mul3_x)
|
332
|
+
$ => B :MLOAD(squareFp12BN254_a1a2mul3_y)
|
333
|
+
A :MSTORE(addFp6BN254_b3_x)
|
334
|
+
B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
|
335
|
+
|
336
|
+
$ => A :MLOAD(addFp6BN254_c1_x)
|
337
|
+
$ => B :MLOAD(addFp6BN254_c1_y)
|
338
|
+
A :MSTORE(addFp6BN254_a1_x)
|
339
|
+
B :MSTORE(addFp6BN254_a1_y)
|
340
|
+
$ => A :MLOAD(addFp6BN254_c2_x)
|
341
|
+
$ => B :MLOAD(addFp6BN254_c2_y)
|
342
|
+
A :MSTORE(addFp6BN254_a2_x)
|
343
|
+
B :MSTORE(addFp6BN254_a2_y)
|
344
|
+
$ => A :MLOAD(addFp6BN254_c3_x)
|
345
|
+
$ => B :MLOAD(addFp6BN254_c3_y)
|
346
|
+
A :MSTORE(addFp6BN254_a3_x)
|
347
|
+
B :MSTORE(addFp6BN254_a3_y)
|
348
|
+
|
349
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vmul1_x)
|
350
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vmul1_y)
|
351
|
+
A :MSTORE(addFp6BN254_b1_x)
|
352
|
+
B :MSTORE(addFp6BN254_b1_y)
|
353
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vmul2_x)
|
354
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vmul2_y)
|
355
|
+
A :MSTORE(addFp6BN254_b2_x)
|
356
|
+
B :MSTORE(addFp6BN254_b2_y)
|
357
|
+
$ => A :MLOAD(squareFp12BN254_a1a2vmul3_x)
|
358
|
+
$ => B :MLOAD(squareFp12BN254_a1a2vmul3_y)
|
359
|
+
A :MSTORE(addFp6BN254_b3_x)
|
360
|
+
B :MSTORE(addFp6BN254_b3_y), CALL(addFp6BN254)
|
361
|
+
|
362
|
+
$ => A :MLOAD(addFp6BN254_c1_x)
|
363
|
+
$ => B :MLOAD(addFp6BN254_c1_y)
|
364
|
+
A :MSTORE(squareFp12BN254_c11_x)
|
365
|
+
B :MSTORE(squareFp12BN254_c11_y)
|
366
|
+
$ => A :MLOAD(addFp6BN254_c2_x)
|
367
|
+
$ => B :MLOAD(addFp6BN254_c2_y)
|
368
|
+
A :MSTORE(squareFp12BN254_c12_x)
|
369
|
+
B :MSTORE(squareFp12BN254_c12_y)
|
370
|
+
$ => A :MLOAD(addFp6BN254_c3_x)
|
371
|
+
$ => B :MLOAD(addFp6BN254_c3_y)
|
372
|
+
A :MSTORE(squareFp12BN254_c13_x)
|
373
|
+
B :MSTORE(squareFp12BN254_c13_y)
|
374
|
+
|
375
|
+
$ => RR :MLOAD(squareFp12BN254_RR)
|
376
|
+
:RETURN
|
@@ -0,0 +1,19 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: ARITH_BN254_ADDFP2 ensures that the result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; addFp2BN254:
|
5
|
+
;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
|
6
|
+
;; out: E + C·u = (A + C) + (B + D)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL addFp2BN254_i
|
11
|
+
|
12
|
+
addFp2BN254:
|
13
|
+
; Compute and check the mul
|
14
|
+
; A + C = [E] + (q0·BN254_P)
|
15
|
+
; B + D = [OP] + (q1·BN254_P)
|
16
|
+
${ARITH_BN254_ADDFP2(A,C)} => E
|
17
|
+
${ARITH_BN254_ADDFP2(B,D)} :MSTORE(addFp2BN254_i), ARITH_BN254_ADDFP2
|
18
|
+
|
19
|
+
$ => C :MLOAD(addFp2BN254_i), RETURN
|
@@ -0,0 +1,20 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; escalarMulFp2BN254:
|
5
|
+
;; in: A ∈ Fp, (C + D·u) ∈ Fp2, where C,D ∈ Fp
|
6
|
+
;; out: E + C·u = (A·C) + (A·D)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL escalarMulFp2BN254_i
|
11
|
+
|
12
|
+
escalarMulFp2BN254:
|
13
|
+
; Compute and check the mul
|
14
|
+
; A·C - 0·D = [E] + (q0·BN254_P)
|
15
|
+
; A·D + 0·C = [OP] + (q1·BN254_P)
|
16
|
+
0n => B
|
17
|
+
${ARITH_BN254_MULFP2_X(A,B,C,D)} => E
|
18
|
+
${ARITH_BN254_MULFP2_Y(A,B,C,D)} :MSTORE(escalarMulFp2BN254_i), ARITH_BN254_MULFP2
|
19
|
+
|
20
|
+
$ => C :MLOAD(escalarMulFp2BN254_i), RETURN
|
@@ -0,0 +1,66 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; invFp2BN254
|
5
|
+
;; in: (A + B·u) ∈ Fp2, where A,B ∈ Fp
|
6
|
+
;; out: C + D·u = (A·(A² + B²)⁻¹) + (-B·(A² + B²)⁻¹)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;; NOTE: On input 0, it returns 0
|
9
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
10
|
+
|
11
|
+
VAR GLOBAL invFp2BN254_x
|
12
|
+
VAR GLOBAL invFp2BN254_y
|
13
|
+
|
14
|
+
VAR GLOBAL invFp2BN254_RR
|
15
|
+
|
16
|
+
invFp2BN254:
|
17
|
+
RR :MSTORE(invFp2BN254_RR)
|
18
|
+
|
19
|
+
B :MSTORE(invFp2BN254_y)
|
20
|
+
; Normalization of A,B
|
21
|
+
%BN254_P => B
|
22
|
+
$ :LT, JMPC(__invFp2BN254_reduce_A_continue)
|
23
|
+
:CALL(reduceFpBN254)
|
24
|
+
__invFp2BN254_reduce_A_continue:
|
25
|
+
A :MSTORE(invFp2BN254_x)
|
26
|
+
$ => A :MLOAD(invFp2BN254_y)
|
27
|
+
%BN254_P => B
|
28
|
+
$ :LT, JMPC(__invFp2BN254_reduce_B_continue)
|
29
|
+
:CALL(reduceFpBN254)
|
30
|
+
__invFp2BN254_reduce_B_continue:
|
31
|
+
A :MSTORE(invFp2BN254_y)
|
32
|
+
; From here, it is guaranteed that A,B ∈ [0,BN254_P)
|
33
|
+
|
34
|
+
invFp2BN254_zero_check:
|
35
|
+
; Check if A = B = 0, and if so, return 0
|
36
|
+
$ => B :MLOAD(invFp2BN254_x)
|
37
|
+
0 => A
|
38
|
+
$ :EQ, JMPNC(invFp2BN254_normalized)
|
39
|
+
$ => B :MLOAD(invFp2BN254_y)
|
40
|
+
$ :EQ, JMPC(invFp2BN254_input_is_zero)
|
41
|
+
|
42
|
+
invFp2BN254_normalized:
|
43
|
+
$ => A :MLOAD(invFp2BN254_x)
|
44
|
+
$ => B :MLOAD(invFp2BN254_y)
|
45
|
+
; Remember that an element y ∈ Fp2 is the inverse of x ∈ Fp2 if and only if x·y = 1 in Fp2
|
46
|
+
; We therefore check that (A + B·u)·(C + D·u) = 1 + 0·u
|
47
|
+
; A·[C] - B·[D] = 1 + (q0·BN254_P)
|
48
|
+
; A·[D] + B·[C] = 0 + (q1·BN254_P)
|
49
|
+
${fp2InvBN254_x(mem.invFp2BN254_x,mem.invFp2BN254_y)} => C
|
50
|
+
${fp2InvBN254_y(mem.invFp2BN254_x,mem.invFp2BN254_y)} => D
|
51
|
+
1n => E
|
52
|
+
0n :ARITH_BN254_MULFP2
|
53
|
+
|
54
|
+
; Check that the resulting elements are lower than BN254_P
|
55
|
+
%BN254_P => B
|
56
|
+
C => A
|
57
|
+
1 :LT
|
58
|
+
D => A
|
59
|
+
1 :LT, JMP(invFp2BN254_end)
|
60
|
+
|
61
|
+
invFp2BN254_input_is_zero:
|
62
|
+
0 => C,D
|
63
|
+
|
64
|
+
invFp2BN254_end:
|
65
|
+
$ => RR :MLOAD(invFp2BN254_RR)
|
66
|
+
:RETURN
|
@@ -0,0 +1,19 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; mulFp2BN254:
|
5
|
+
;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
|
6
|
+
;; out: E + C·u = (A·C - B·D) + (A·D + B·C)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL mulFp2BN254_i
|
11
|
+
|
12
|
+
mulFp2BN254:
|
13
|
+
; Compute and check the mul
|
14
|
+
; A·C - B·D = [E] + (q0·BN254_P)
|
15
|
+
; A·D + B·C = [OP] + (q1·BN254_P)
|
16
|
+
${ARITH_BN254_MULFP2_X(A,B,C,D)} => E
|
17
|
+
${ARITH_BN254_MULFP2_Y(A,B,C,D)} :MSTORE(mulFp2BN254_i), ARITH_BN254_MULFP2
|
18
|
+
|
19
|
+
$ => C :MLOAD(mulFp2BN254_i), RETURN
|
@@ -0,0 +1,21 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: ARITH_BN254_MULFP2 ensures that the result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; squareFp2BN254:
|
5
|
+
;; in: (A + B·u) ∈ Fp2, where A,B ∈ Fp
|
6
|
+
;; out: E + C·u = (A - B)·(A + B) + (2·A·B)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL squareFp2BN254_i
|
11
|
+
|
12
|
+
squareFp2BN254:
|
13
|
+
; Compute and check the squaring
|
14
|
+
; A·A - B·B = [E] + (q0·BN254_P)
|
15
|
+
; A·B + B·A = [OP] + (q1·BN254_P)
|
16
|
+
A => C
|
17
|
+
B => D
|
18
|
+
${ARITH_BN254_MULFP2_X(A,B,A,B)} => E
|
19
|
+
${ARITH_BN254_MULFP2_Y(A,B,A,B)} :MSTORE(squareFp2BN254_i), ARITH_BN254_MULFP2
|
20
|
+
|
21
|
+
$ => C :MLOAD(squareFp2BN254_i), RETURN
|
@@ -0,0 +1,19 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: ARITH_BN254_SUBFP2 ensures that the result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; subFp2BN254:
|
5
|
+
;; in: (A + B·u), (C + D·u) ∈ Fp2, where A,B,C,D ∈ Fp
|
6
|
+
;; out: E + C·u = (A - C) + (B - D)·u ∈ Fp2
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL subFp2BN254_i
|
11
|
+
|
12
|
+
subFp2BN254:
|
13
|
+
; Compute and check the mul
|
14
|
+
; A - C = [E] + (q0·BN254_P)
|
15
|
+
; B - D = [OP] + (q1·BN254_P)
|
16
|
+
${ARITH_BN254_SUBFP2(A,C)} => E
|
17
|
+
${ARITH_BN254_SUBFP2(B,D)} :MSTORE(subFp2BN254_i), ARITH_BN254_SUBFP2
|
18
|
+
|
19
|
+
$ => C :MLOAD(subFp2BN254_i), RETURN
|
@@ -0,0 +1,76 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
|
3
|
+
;;
|
4
|
+
;; squareFp4BN254:
|
5
|
+
;; in: (a1 + a2·V) ∈ Fp4, where ai ∈ Fp2
|
6
|
+
;; out: (c1 + c2·V) ∈ Fp4, where:
|
7
|
+
;; - c1 = a2²·(9 + u) + a1²
|
8
|
+
;; - c2 = (a1 + a2)² - a1² - a2²
|
9
|
+
;;
|
10
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
11
|
+
|
12
|
+
VAR GLOBAL squareFp4BN254_a1_x
|
13
|
+
VAR GLOBAL squareFp4BN254_a1_y
|
14
|
+
VAR GLOBAL squareFp4BN254_a2_x
|
15
|
+
VAR GLOBAL squareFp4BN254_a2_y
|
16
|
+
VAR GLOBAL squareFp4BN254_c1_x
|
17
|
+
VAR GLOBAL squareFp4BN254_c1_y
|
18
|
+
VAR GLOBAL squareFp4BN254_c2_x
|
19
|
+
VAR GLOBAL squareFp4BN254_c2_y
|
20
|
+
|
21
|
+
VAR GLOBAL squareFp4BN254_a1square_x
|
22
|
+
VAR GLOBAL squareFp4BN254_a1square_y
|
23
|
+
VAR GLOBAL squareFp4BN254_a2square_x
|
24
|
+
VAR GLOBAL squareFp4BN254_a2square_y
|
25
|
+
|
26
|
+
VAR GLOBAL squareFp4BN254_RR
|
27
|
+
|
28
|
+
squareFp4BN254:
|
29
|
+
RR :MSTORE(squareFp4BN254_RR)
|
30
|
+
|
31
|
+
; 1] a1²
|
32
|
+
$ => A :MLOAD(squareFp4BN254_a1_x)
|
33
|
+
$ => B :MLOAD(squareFp4BN254_a1_y), CALL(squareFp2BN254)
|
34
|
+
E :MSTORE(squareFp4BN254_a1square_x)
|
35
|
+
C :MSTORE(squareFp4BN254_a1square_y)
|
36
|
+
|
37
|
+
; 2] a2²
|
38
|
+
$ => A :MLOAD(squareFp4BN254_a2_x)
|
39
|
+
$ => B :MLOAD(squareFp4BN254_a2_y), CALL(squareFp2BN254)
|
40
|
+
E :MSTORE(squareFp4BN254_a2square_x)
|
41
|
+
C :MSTORE(squareFp4BN254_a2square_y)
|
42
|
+
|
43
|
+
; 3] c1 = a2²·(9 + u) + a1²
|
44
|
+
$ => A :MLOAD(squareFp4BN254_a2square_x)
|
45
|
+
$ => B :MLOAD(squareFp4BN254_a2square_y)
|
46
|
+
9n => C
|
47
|
+
1n => D :CALL(mulFp2BN254)
|
48
|
+
|
49
|
+
E => A
|
50
|
+
C => B
|
51
|
+
$ => C :MLOAD(squareFp4BN254_a1square_x)
|
52
|
+
$ => D :MLOAD(squareFp4BN254_a1square_y), CALL(addFp2BN254)
|
53
|
+
E :MSTORE(squareFp4BN254_c1_x)
|
54
|
+
C :MSTORE(squareFp4BN254_c1_y)
|
55
|
+
|
56
|
+
; 4] c2 = (a1 + a2)² - a1² - a2²
|
57
|
+
$ => A :MLOAD(squareFp4BN254_a1_x)
|
58
|
+
$ => B :MLOAD(squareFp4BN254_a1_y)
|
59
|
+
$ => C :MLOAD(squareFp4BN254_a2_x)
|
60
|
+
$ => D :MLOAD(squareFp4BN254_a2_y), CALL(addFp2BN254)
|
61
|
+
E => A
|
62
|
+
C => B :CALL(squareFp2BN254)
|
63
|
+
|
64
|
+
E => A
|
65
|
+
C => B
|
66
|
+
$ => C :MLOAD(squareFp4BN254_a1square_x)
|
67
|
+
$ => D :MLOAD(squareFp4BN254_a1square_y), CALL(subFp2BN254)
|
68
|
+
E => A
|
69
|
+
C => B
|
70
|
+
$ => C :MLOAD(squareFp4BN254_a2square_x)
|
71
|
+
$ => D :MLOAD(squareFp4BN254_a2square_y), CALL(subFp2BN254)
|
72
|
+
E :MSTORE(squareFp4BN254_c2_x)
|
73
|
+
C :MSTORE(squareFp4BN254_c2_y)
|
74
|
+
|
75
|
+
$ => RR :MLOAD(squareFp4BN254_RR)
|
76
|
+
:RETURN
|
@@ -0,0 +1,59 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
|
3
|
+
;;
|
4
|
+
;; addFp6BN254:
|
5
|
+
;; in: (a1 + a2·v + a3·v²),(b1 + b2·v + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
|
6
|
+
;; out: (c1 + c2·v + c3·v²) = (a1+b1) + (a2+b2)·v + (a3+b3)·v² ∈ Fp6
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL addFp6BN254_a1_x
|
11
|
+
VAR GLOBAL addFp6BN254_a1_y
|
12
|
+
VAR GLOBAL addFp6BN254_a2_x
|
13
|
+
VAR GLOBAL addFp6BN254_a2_y
|
14
|
+
VAR GLOBAL addFp6BN254_a3_x
|
15
|
+
VAR GLOBAL addFp6BN254_a3_y
|
16
|
+
VAR GLOBAL addFp6BN254_b1_x
|
17
|
+
VAR GLOBAL addFp6BN254_b1_y
|
18
|
+
VAR GLOBAL addFp6BN254_b2_x
|
19
|
+
VAR GLOBAL addFp6BN254_b2_y
|
20
|
+
VAR GLOBAL addFp6BN254_b3_x
|
21
|
+
VAR GLOBAL addFp6BN254_b3_y
|
22
|
+
VAR GLOBAL addFp6BN254_c1_x
|
23
|
+
VAR GLOBAL addFp6BN254_c1_y
|
24
|
+
VAR GLOBAL addFp6BN254_c2_x
|
25
|
+
VAR GLOBAL addFp6BN254_c2_y
|
26
|
+
VAR GLOBAL addFp6BN254_c3_x
|
27
|
+
VAR GLOBAL addFp6BN254_c3_y
|
28
|
+
|
29
|
+
VAR GLOBAL addFp6BN254_RR
|
30
|
+
|
31
|
+
addFp6BN254:
|
32
|
+
RR :MSTORE(addFp6BN254_RR)
|
33
|
+
|
34
|
+
; 1] c1 = a1+b1
|
35
|
+
$ => A :MLOAD(addFp6BN254_a1_x)
|
36
|
+
$ => B :MLOAD(addFp6BN254_a1_y)
|
37
|
+
$ => C :MLOAD(addFp6BN254_b1_x)
|
38
|
+
$ => D :MLOAD(addFp6BN254_b1_y), CALL(addFp2BN254)
|
39
|
+
E :MSTORE(addFp6BN254_c1_x)
|
40
|
+
C :MSTORE(addFp6BN254_c1_y)
|
41
|
+
|
42
|
+
; 2] c2 = a2+b2
|
43
|
+
$ => A :MLOAD(addFp6BN254_a2_x)
|
44
|
+
$ => B :MLOAD(addFp6BN254_a2_y)
|
45
|
+
$ => C :MLOAD(addFp6BN254_b2_x)
|
46
|
+
$ => D :MLOAD(addFp6BN254_b2_y), CALL(addFp2BN254)
|
47
|
+
E :MSTORE(addFp6BN254_c2_x)
|
48
|
+
C :MSTORE(addFp6BN254_c2_y)
|
49
|
+
|
50
|
+
; 3] c3 = a3+b3
|
51
|
+
$ => A :MLOAD(addFp6BN254_a3_x)
|
52
|
+
$ => B :MLOAD(addFp6BN254_a3_y)
|
53
|
+
$ => C :MLOAD(addFp6BN254_b3_x)
|
54
|
+
$ => D :MLOAD(addFp6BN254_b3_y), CALL(addFp2BN254)
|
55
|
+
E :MSTORE(addFp6BN254_c3_x)
|
56
|
+
C :MSTORE(addFp6BN254_c3_y)
|
57
|
+
|
58
|
+
$ => RR :MLOAD(addFp6BN254_RR)
|
59
|
+
:RETURN
|