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,128 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
|
3
|
+
;;
|
4
|
+
;; sparseMulCFp6BN254:
|
5
|
+
;; in: (a1 + a2·v + a3·v²),(b1 + b3·v²) ∈ Fp6, where ai,bi ∈ Fp2
|
6
|
+
;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
|
7
|
+
;; - c1 = a1·b1 + a2·b3·(9+u)
|
8
|
+
;; - c2 = a2·b1 + a3·b3·(9+u)
|
9
|
+
;; - c3 = (a1 + a3)·(b1 + b3) - a1·b1 - a3·b3
|
10
|
+
;;
|
11
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
12
|
+
|
13
|
+
VAR GLOBAL sparseMulCFp6BN254_a1_x
|
14
|
+
VAR GLOBAL sparseMulCFp6BN254_a1_y
|
15
|
+
VAR GLOBAL sparseMulCFp6BN254_a2_x
|
16
|
+
VAR GLOBAL sparseMulCFp6BN254_a2_y
|
17
|
+
VAR GLOBAL sparseMulCFp6BN254_a3_x
|
18
|
+
VAR GLOBAL sparseMulCFp6BN254_a3_y
|
19
|
+
|
20
|
+
VAR GLOBAL sparseMulCFp6BN254_b1_x
|
21
|
+
VAR GLOBAL sparseMulCFp6BN254_b1_y
|
22
|
+
VAR GLOBAL sparseMulCFp6BN254_b3_x
|
23
|
+
VAR GLOBAL sparseMulCFp6BN254_b3_y
|
24
|
+
|
25
|
+
VAR GLOBAL sparseMulCFp6BN254_c1_x
|
26
|
+
VAR GLOBAL sparseMulCFp6BN254_c1_y
|
27
|
+
VAR GLOBAL sparseMulCFp6BN254_c2_x
|
28
|
+
VAR GLOBAL sparseMulCFp6BN254_c2_y
|
29
|
+
VAR GLOBAL sparseMulCFp6BN254_c3_x
|
30
|
+
VAR GLOBAL sparseMulCFp6BN254_c3_y
|
31
|
+
|
32
|
+
VAR GLOBAL sparseMulCFp6BN254_a1b1_x
|
33
|
+
VAR GLOBAL sparseMulCFp6BN254_a1b1_y
|
34
|
+
VAR GLOBAL sparseMulCFp6BN254_a3b3_x
|
35
|
+
VAR GLOBAL sparseMulCFp6BN254_a3b3_y
|
36
|
+
VAR GLOBAL sparseMulCFp6BN254_a2b1_x
|
37
|
+
VAR GLOBAL sparseMulCFp6BN254_a2b1_y
|
38
|
+
VAR GLOBAL sparseMulCFp6BN254_a1a3sum_x
|
39
|
+
VAR GLOBAL sparseMulCFp6BN254_a1a3sum_y
|
40
|
+
|
41
|
+
VAR GLOBAL sparseMulCFp6BN254_RR
|
42
|
+
|
43
|
+
sparseMulCFp6BN254:
|
44
|
+
RR :MSTORE(sparseMulCFp6BN254_RR)
|
45
|
+
|
46
|
+
; 1] a1·b1, a3·b3
|
47
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a1_x)
|
48
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a1_y)
|
49
|
+
$ => C :MLOAD(sparseMulCFp6BN254_b1_x)
|
50
|
+
$ => D :MLOAD(sparseMulCFp6BN254_b1_y), CALL(mulFp2BN254)
|
51
|
+
E :MSTORE(sparseMulCFp6BN254_a1b1_x)
|
52
|
+
C :MSTORE(sparseMulCFp6BN254_a1b1_y)
|
53
|
+
|
54
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a3_x)
|
55
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a3_y)
|
56
|
+
$ => C :MLOAD(sparseMulCFp6BN254_b3_x)
|
57
|
+
$ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(mulFp2BN254)
|
58
|
+
E :MSTORE(sparseMulCFp6BN254_a3b3_x)
|
59
|
+
C :MSTORE(sparseMulCFp6BN254_a3b3_y)
|
60
|
+
|
61
|
+
; 2] c1 = a1·b1 + a2·b3·(9+u)
|
62
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a2_x)
|
63
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a2_y)
|
64
|
+
$ => C :MLOAD(sparseMulCFp6BN254_b3_x)
|
65
|
+
$ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(mulFp2BN254)
|
66
|
+
E => A
|
67
|
+
C => B
|
68
|
+
9n => C
|
69
|
+
1n => D :CALL(mulFp2BN254)
|
70
|
+
|
71
|
+
E => A
|
72
|
+
C => B
|
73
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a1b1_x)
|
74
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a1b1_y), CALL(addFp2BN254)
|
75
|
+
E :MSTORE(sparseMulCFp6BN254_c1_x)
|
76
|
+
C :MSTORE(sparseMulCFp6BN254_c1_y)
|
77
|
+
|
78
|
+
; 3] c2 = a2·b1 + a3·b3·(9+u)
|
79
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a2_x)
|
80
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a2_y)
|
81
|
+
$ => C :MLOAD(sparseMulCFp6BN254_b1_x)
|
82
|
+
$ => D :MLOAD(sparseMulCFp6BN254_b1_y), CALL(mulFp2BN254)
|
83
|
+
E :MSTORE(sparseMulCFp6BN254_a2b1_x)
|
84
|
+
C :MSTORE(sparseMulCFp6BN254_a2b1_y)
|
85
|
+
|
86
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a3b3_x)
|
87
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a3b3_y)
|
88
|
+
9n => C
|
89
|
+
1n => D :CALL(mulFp2BN254)
|
90
|
+
|
91
|
+
E => A
|
92
|
+
C => B
|
93
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a2b1_x)
|
94
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a2b1_y), CALL(addFp2BN254)
|
95
|
+
E :MSTORE(sparseMulCFp6BN254_c2_x)
|
96
|
+
C :MSTORE(sparseMulCFp6BN254_c2_y)
|
97
|
+
|
98
|
+
|
99
|
+
; 4] c3 = (a1 + a3)·(b1 + b3) - a1·b1 - a3·b3
|
100
|
+
$ => A :MLOAD(sparseMulCFp6BN254_a1_x)
|
101
|
+
$ => B :MLOAD(sparseMulCFp6BN254_a1_y)
|
102
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a3_x)
|
103
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a3_y), CALL(addFp2BN254)
|
104
|
+
E :MSTORE(sparseMulCFp6BN254_a1a3sum_x)
|
105
|
+
C :MSTORE(sparseMulCFp6BN254_a1a3sum_y)
|
106
|
+
|
107
|
+
$ => A :MLOAD(sparseMulCFp6BN254_b1_x)
|
108
|
+
$ => B :MLOAD(sparseMulCFp6BN254_b1_y)
|
109
|
+
$ => C :MLOAD(sparseMulCFp6BN254_b3_x)
|
110
|
+
$ => D :MLOAD(sparseMulCFp6BN254_b3_y), CALL(addFp2BN254)
|
111
|
+
E => A
|
112
|
+
C => B
|
113
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a1a3sum_x)
|
114
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a1a3sum_y), CALL(mulFp2BN254)
|
115
|
+
E => A
|
116
|
+
C => B
|
117
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a1b1_x)
|
118
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a1b1_y), CALL(subFp2BN254)
|
119
|
+
E => A
|
120
|
+
C => B
|
121
|
+
$ => C :MLOAD(sparseMulCFp6BN254_a3b3_x)
|
122
|
+
$ => D :MLOAD(sparseMulCFp6BN254_a3b3_y), CALL(subFp2BN254)
|
123
|
+
E :MSTORE(sparseMulCFp6BN254_c3_x)
|
124
|
+
C :MSTORE(sparseMulCFp6BN254_c3_y)
|
125
|
+
|
126
|
+
|
127
|
+
$ => RR :MLOAD(sparseMulCFp6BN254_RR)
|
128
|
+
:RETURN
|
@@ -0,0 +1,147 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P) because if falls back to FP2 arithmetic
|
3
|
+
;;
|
4
|
+
;; squareFp6BN254:
|
5
|
+
;; in: (a1 + a2·v + a3·v²) ∈ Fp6, where ai ∈ Fp2
|
6
|
+
;; out: (c1 + c2·v + c3·v²) ∈ Fp6, where:
|
7
|
+
;; - c1 = 2·a2·a3·(9 + u) + a1²
|
8
|
+
;; - c2 = a3²·(9 + u) + 2·a1·a2
|
9
|
+
;; - c3 = 2·a1·a2 - a3² + (a1 - a2 + a3)² + 2·a2·a3 - a1²
|
10
|
+
;;
|
11
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
12
|
+
|
13
|
+
VAR GLOBAL squareFp6BN254_a1_x
|
14
|
+
VAR GLOBAL squareFp6BN254_a1_y
|
15
|
+
VAR GLOBAL squareFp6BN254_a2_x
|
16
|
+
VAR GLOBAL squareFp6BN254_a2_y
|
17
|
+
VAR GLOBAL squareFp6BN254_a3_x
|
18
|
+
VAR GLOBAL squareFp6BN254_a3_y
|
19
|
+
VAR GLOBAL squareFp6BN254_c1_x
|
20
|
+
VAR GLOBAL squareFp6BN254_c1_y
|
21
|
+
VAR GLOBAL squareFp6BN254_c2_x
|
22
|
+
VAR GLOBAL squareFp6BN254_c2_y
|
23
|
+
VAR GLOBAL squareFp6BN254_c3_x
|
24
|
+
VAR GLOBAL squareFp6BN254_c3_y
|
25
|
+
|
26
|
+
VAR GLOBAL squareFp6BN254_2a1a2mul_x
|
27
|
+
VAR GLOBAL squareFp6BN254_2a1a2mul_y
|
28
|
+
VAR GLOBAL squareFp6BN254_a3square_x
|
29
|
+
VAR GLOBAL squareFp6BN254_a3square_y
|
30
|
+
VAR GLOBAL squareFp6BN254_2a1a2a3sqsub_x
|
31
|
+
VAR GLOBAL squareFp6BN254_2a1a2a3sqsub_y
|
32
|
+
VAR GLOBAL squareFp6BN254_a1square_x
|
33
|
+
VAR GLOBAL squareFp6BN254_a1square_y
|
34
|
+
VAR GLOBAL squareFp6BN254_a1a2a3sub_x
|
35
|
+
VAR GLOBAL squareFp6BN254_a1a2a3sub_y
|
36
|
+
VAR GLOBAL squareFp6BN254_2a2a3mul_x
|
37
|
+
VAR GLOBAL squareFp6BN254_2a2a3mul_y
|
38
|
+
|
39
|
+
VAR GLOBAL squareFp6BN254_RR
|
40
|
+
|
41
|
+
squareFp6BN254:
|
42
|
+
RR :MSTORE(squareFp6BN254_RR)
|
43
|
+
|
44
|
+
; 1] 2·a1·a2
|
45
|
+
$ => A :MLOAD(squareFp6BN254_a1_x)
|
46
|
+
$ => B :MLOAD(squareFp6BN254_a1_y)
|
47
|
+
$ => C :MLOAD(squareFp6BN254_a2_x)
|
48
|
+
$ => D :MLOAD(squareFp6BN254_a2_y), CALL(mulFp2BN254)
|
49
|
+
2n => A
|
50
|
+
C => D
|
51
|
+
E => C :CALL(escalarMulFp2BN254)
|
52
|
+
|
53
|
+
E :MSTORE(squareFp6BN254_2a1a2mul_x)
|
54
|
+
C :MSTORE(squareFp6BN254_2a1a2mul_y)
|
55
|
+
|
56
|
+
; 2] a3²
|
57
|
+
$ => A :MLOAD(squareFp6BN254_a3_x)
|
58
|
+
$ => B :MLOAD(squareFp6BN254_a3_y), CALL(squareFp2BN254)
|
59
|
+
E :MSTORE(squareFp6BN254_a3square_x)
|
60
|
+
C :MSTORE(squareFp6BN254_a3square_y)
|
61
|
+
|
62
|
+
; 3] c2 = a3²·(9 + u) + 2·a1·a2
|
63
|
+
$ => A :MLOAD(squareFp6BN254_a3square_x)
|
64
|
+
$ => B :MLOAD(squareFp6BN254_a3square_y)
|
65
|
+
9n => C
|
66
|
+
1n => D :CALL(mulFp2BN254)
|
67
|
+
|
68
|
+
$ => A :MLOAD(squareFp6BN254_2a1a2mul_x)
|
69
|
+
$ => B :MLOAD(squareFp6BN254_2a1a2mul_y)
|
70
|
+
C => D
|
71
|
+
E => C :CALL(addFp2BN254)
|
72
|
+
|
73
|
+
E :MSTORE(squareFp6BN254_c2_x)
|
74
|
+
C :MSTORE(squareFp6BN254_c2_y)
|
75
|
+
|
76
|
+
; 4] 2·a1·a2 - a3²
|
77
|
+
$ => A :MLOAD(squareFp6BN254_2a1a2mul_x)
|
78
|
+
$ => B :MLOAD(squareFp6BN254_2a1a2mul_y)
|
79
|
+
$ => C :MLOAD(squareFp6BN254_a3square_x)
|
80
|
+
$ => D :MLOAD(squareFp6BN254_a3square_y), CALL(subFp2BN254)
|
81
|
+
E :MSTORE(squareFp6BN254_2a1a2a3sqsub_x)
|
82
|
+
C :MSTORE(squareFp6BN254_2a1a2a3sqsub_y)
|
83
|
+
|
84
|
+
; 5] a1²
|
85
|
+
$ => A :MLOAD(squareFp6BN254_a1_x)
|
86
|
+
$ => B :MLOAD(squareFp6BN254_a1_y), CALL(squareFp2BN254)
|
87
|
+
E :MSTORE(squareFp6BN254_a1square_x)
|
88
|
+
C :MSTORE(squareFp6BN254_a1square_y)
|
89
|
+
|
90
|
+
; 6] (a1 - a2 + a3)²
|
91
|
+
$ => A :MLOAD(squareFp6BN254_a1_x)
|
92
|
+
$ => B :MLOAD(squareFp6BN254_a1_y)
|
93
|
+
$ => C :MLOAD(squareFp6BN254_a2_x)
|
94
|
+
$ => D :MLOAD(squareFp6BN254_a2_y), CALL(subFp2BN254)
|
95
|
+
E => A
|
96
|
+
C => B
|
97
|
+
$ => C :MLOAD(squareFp6BN254_a3_x)
|
98
|
+
$ => D :MLOAD(squareFp6BN254_a3_y), CALL(addFp2BN254)
|
99
|
+
E => A
|
100
|
+
C => B :CALL(squareFp2BN254)
|
101
|
+
|
102
|
+
E :MSTORE(squareFp6BN254_a1a2a3sub_x)
|
103
|
+
C :MSTORE(squareFp6BN254_a1a2a3sub_y)
|
104
|
+
|
105
|
+
; 7] 2·a2·a3
|
106
|
+
$ => A :MLOAD(squareFp6BN254_a2_x)
|
107
|
+
$ => B :MLOAD(squareFp6BN254_a2_y)
|
108
|
+
$ => C :MLOAD(squareFp6BN254_a3_x)
|
109
|
+
$ => D :MLOAD(squareFp6BN254_a3_y), CALL(mulFp2BN254)
|
110
|
+
2n => A
|
111
|
+
C => D
|
112
|
+
E => C :CALL(escalarMulFp2BN254)
|
113
|
+
|
114
|
+
E :MSTORE(squareFp6BN254_2a2a3mul_x)
|
115
|
+
C :MSTORE(squareFp6BN254_2a2a3mul_y)
|
116
|
+
|
117
|
+
; 8] c1 = 2·a2·a3·(9 + u) + a1²
|
118
|
+
$ => A :MLOAD(squareFp6BN254_2a2a3mul_x)
|
119
|
+
$ => B :MLOAD(squareFp6BN254_2a2a3mul_y)
|
120
|
+
9n => C
|
121
|
+
1n => D :CALL(mulFp2BN254)
|
122
|
+
|
123
|
+
E => A
|
124
|
+
C => B
|
125
|
+
$ => C :MLOAD(squareFp6BN254_a1square_x)
|
126
|
+
$ => D :MLOAD(squareFp6BN254_a1square_y), CALL(addFp2BN254)
|
127
|
+
E :MSTORE(squareFp6BN254_c1_x)
|
128
|
+
C :MSTORE(squareFp6BN254_c1_y)
|
129
|
+
|
130
|
+
; 9] c3 = 2·a1·a2 - a3² + (a1 - a2 + a3)² + 2·a2·a3 - a1²
|
131
|
+
$ => A :MLOAD(squareFp6BN254_2a1a2a3sqsub_x)
|
132
|
+
$ => B :MLOAD(squareFp6BN254_2a1a2a3sqsub_y)
|
133
|
+
$ => C :MLOAD(squareFp6BN254_a1a2a3sub_x)
|
134
|
+
$ => D :MLOAD(squareFp6BN254_a1a2a3sub_y), CALL(addFp2BN254)
|
135
|
+
E => A
|
136
|
+
C => B
|
137
|
+
$ => C :MLOAD(squareFp6BN254_2a2a3mul_x)
|
138
|
+
$ => D :MLOAD(squareFp6BN254_2a2a3mul_y), CALL(addFp2BN254)
|
139
|
+
E => A
|
140
|
+
C => B
|
141
|
+
$ => C :MLOAD(squareFp6BN254_a1square_x)
|
142
|
+
$ => D :MLOAD(squareFp6BN254_a1square_y), CALL(subFp2BN254)
|
143
|
+
E :MSTORE(squareFp6BN254_c3_x)
|
144
|
+
C :MSTORE(squareFp6BN254_c3_y)
|
145
|
+
|
146
|
+
$ => RR :MLOAD(squareFp6BN254_RR)
|
147
|
+
: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
|
+
;; subFp6BN254:
|
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 subFp6BN254_a1_x
|
11
|
+
VAR GLOBAL subFp6BN254_a1_y
|
12
|
+
VAR GLOBAL subFp6BN254_a2_x
|
13
|
+
VAR GLOBAL subFp6BN254_a2_y
|
14
|
+
VAR GLOBAL subFp6BN254_a3_x
|
15
|
+
VAR GLOBAL subFp6BN254_a3_y
|
16
|
+
VAR GLOBAL subFp6BN254_b1_x
|
17
|
+
VAR GLOBAL subFp6BN254_b1_y
|
18
|
+
VAR GLOBAL subFp6BN254_b2_x
|
19
|
+
VAR GLOBAL subFp6BN254_b2_y
|
20
|
+
VAR GLOBAL subFp6BN254_b3_x
|
21
|
+
VAR GLOBAL subFp6BN254_b3_y
|
22
|
+
VAR GLOBAL subFp6BN254_c1_x
|
23
|
+
VAR GLOBAL subFp6BN254_c1_y
|
24
|
+
VAR GLOBAL subFp6BN254_c2_x
|
25
|
+
VAR GLOBAL subFp6BN254_c2_y
|
26
|
+
VAR GLOBAL subFp6BN254_c3_x
|
27
|
+
VAR GLOBAL subFp6BN254_c3_y
|
28
|
+
|
29
|
+
VAR GLOBAL subFp6BN254_RR
|
30
|
+
|
31
|
+
subFp6BN254:
|
32
|
+
RR :MSTORE(subFp6BN254_RR)
|
33
|
+
|
34
|
+
; 1] c1 = a1-b1
|
35
|
+
$ => A :MLOAD(subFp6BN254_a1_x)
|
36
|
+
$ => B :MLOAD(subFp6BN254_a1_y)
|
37
|
+
$ => C :MLOAD(subFp6BN254_b1_x)
|
38
|
+
$ => D :MLOAD(subFp6BN254_b1_y), CALL(subFp2BN254)
|
39
|
+
E :MSTORE(subFp6BN254_c1_x)
|
40
|
+
C :MSTORE(subFp6BN254_c1_y)
|
41
|
+
|
42
|
+
; 2] c2 = a2-b2
|
43
|
+
$ => A :MLOAD(subFp6BN254_a2_x)
|
44
|
+
$ => B :MLOAD(subFp6BN254_a2_y)
|
45
|
+
$ => C :MLOAD(subFp6BN254_b2_x)
|
46
|
+
$ => D :MLOAD(subFp6BN254_b2_y), CALL(subFp2BN254)
|
47
|
+
E :MSTORE(subFp6BN254_c2_x)
|
48
|
+
C :MSTORE(subFp6BN254_c2_y)
|
49
|
+
|
50
|
+
; 3] c3 = a3-b3
|
51
|
+
$ => A :MLOAD(subFp6BN254_a3_x)
|
52
|
+
$ => B :MLOAD(subFp6BN254_a3_y)
|
53
|
+
$ => C :MLOAD(subFp6BN254_b3_x)
|
54
|
+
$ => D :MLOAD(subFp6BN254_b3_y), CALL(subFp2BN254)
|
55
|
+
E :MSTORE(subFp6BN254_c3_x)
|
56
|
+
C :MSTORE(subFp6BN254_c3_y)
|
57
|
+
|
58
|
+
$ => RR :MLOAD(subFp6BN254_RR)
|
59
|
+
:RETURN
|
@@ -0,0 +1,29 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; addFpBN254:
|
5
|
+
;; in: A,C ∈ Fp
|
6
|
+
;; out: C = A + C (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
addFpBN254:
|
11
|
+
; 1] Compute and check the sum over Z
|
12
|
+
; A·[1] + C = [D]·2²⁵⁶ + [E]
|
13
|
+
1 => B
|
14
|
+
$${var _addFpBN254_AC = A + C}
|
15
|
+
${_addFpBN254_AC >> 256} => D
|
16
|
+
${_addFpBN254_AC} => E :ARITH
|
17
|
+
|
18
|
+
; 2] Check it over Fp, that is, it must be satisfied that:
|
19
|
+
; [BN254_P]·[(A+C) / p] + [(A+C) % p] = D·2²⁵⁶ + E
|
20
|
+
; where C < BN254_P
|
21
|
+
%BN254_P => A
|
22
|
+
${_addFpBN254_AC / const.BN254_P} => B ; quotient (256 bits)
|
23
|
+
${_addFpBN254_AC % const.BN254_P} => C ; residue (256 bits)
|
24
|
+
E :ARITH
|
25
|
+
|
26
|
+
; 3] Check that the result is lower than BN254_P
|
27
|
+
A => B
|
28
|
+
C => A
|
29
|
+
1 :LT, RETURN
|
@@ -0,0 +1,55 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; invFpBN254:
|
5
|
+
;; in: A ∈ Fp
|
6
|
+
;; out: B = A⁻¹ (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;; NOTE: On input 0, it returns 0
|
9
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
10
|
+
|
11
|
+
VAR GLOBAL invFpBN254_tmp
|
12
|
+
VAR GLOBAL invFpBN254_RR
|
13
|
+
|
14
|
+
invFpBN254:
|
15
|
+
RR :MSTORE(invFpBN254_RR)
|
16
|
+
|
17
|
+
; Normalization of A
|
18
|
+
%BN254_P => B
|
19
|
+
$ :LT, JMPC(invFpBN254_zero_check)
|
20
|
+
:CALL(reduceFpBN254)
|
21
|
+
; From here, it is guaranteed that A ∈ [0,BN254_P)
|
22
|
+
|
23
|
+
invFpBN254_zero_check:
|
24
|
+
; Check if A = 0, and if so, return 0
|
25
|
+
0 => B
|
26
|
+
$ :EQ, JMPC(invFpBN254_A_is_zero)
|
27
|
+
|
28
|
+
invFpBN254_normalized:
|
29
|
+
; 1] Compute and check the inverse over Z
|
30
|
+
; A·A⁻¹ + [0] = [D]·2²⁵⁶ + [E]
|
31
|
+
0 => C
|
32
|
+
${var _invFpBN254_A = fpBN254inv(A)} => B :MSTORE(invFpBN254_tmp);
|
33
|
+
$${var _invFpBN254_AB = A * _invFpBN254_A}
|
34
|
+
${_invFpBN254_AB >> 256} => D
|
35
|
+
${_invFpBN254_AB} => E :ARITH
|
36
|
+
|
37
|
+
; 2] Check it over Fp, that is, it must be satisfied that:
|
38
|
+
; [BN254_P]·[(A·A⁻¹) / BN254_P] + [1] = D·2²⁵⁶ + E
|
39
|
+
%BN254_P => A
|
40
|
+
${_invFpBN254_AB / const.BN254_P} => B ; quotient (256 bits)
|
41
|
+
1n => C ; residue (1 bit)
|
42
|
+
E :ARITH
|
43
|
+
|
44
|
+
; 3] Check that the result is lower than BN254_P
|
45
|
+
A => B
|
46
|
+
$ => A :MLOAD(invFpBN254_tmp)
|
47
|
+
1 :LT
|
48
|
+
A => B :JMP(invFpBN254_end)
|
49
|
+
|
50
|
+
invFpBN254_A_is_zero:
|
51
|
+
0 => B
|
52
|
+
|
53
|
+
invFpBN254_end:
|
54
|
+
$ => RR :MLOAD(invFpBN254_RR)
|
55
|
+
:RETURN
|
@@ -0,0 +1,29 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; mulFpBN254:
|
5
|
+
;; in: A,B ∈ Fp
|
6
|
+
;; out: C = A·B (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
mulFpBN254:
|
11
|
+
; 1] Compute and check the sum over Z
|
12
|
+
; A·B + [0] = [D]·2²⁵⁶ + [E]
|
13
|
+
0 => C
|
14
|
+
$${var _mulFpBN254_AB = A*B}
|
15
|
+
${_mulFpBN254_AB >> 256} => D
|
16
|
+
${_mulFpBN254_AB} => E :ARITH
|
17
|
+
|
18
|
+
; 2] Check it over Fp, that is, it must be satisfied that:
|
19
|
+
; [BN254_P]·[(A·B) / p] + [C / p] = D·2²⁵⁶ + E
|
20
|
+
; where C < BN254_P
|
21
|
+
%BN254_P => A
|
22
|
+
${_mulFpBN254_AB / const.BN254_P} => B ; quotient (256 bits)
|
23
|
+
${_mulFpBN254_AB % const.BN254_P} => C ; residue (256 bits)
|
24
|
+
E :ARITH
|
25
|
+
|
26
|
+
; 3] Check that the result is lower than BN254_P
|
27
|
+
A => B
|
28
|
+
C => A
|
29
|
+
1 :LT, RETURN
|
@@ -0,0 +1,25 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; reduceFpBN254:
|
5
|
+
;; in: A ∈ [0, 2²⁵⁶-1]
|
6
|
+
;; out: A (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL reduceFpBN254_tmp
|
11
|
+
|
12
|
+
reduceFpBN254:
|
13
|
+
; 1] It must be satisfied that:
|
14
|
+
; [BN254_P]·[A / p] + [A % p] = [0]·2²⁵⁶ + A
|
15
|
+
A :MSTORE(reduceFpBN254_tmp)
|
16
|
+
${A / const.BN254_P} => B ; quotient (256 bits)
|
17
|
+
${A % const.BN254_P} => C ; residue (256 bits)
|
18
|
+
%BN254_P => A
|
19
|
+
0n => D
|
20
|
+
$ :MLOAD(reduceFpBN254_tmp), ARITH
|
21
|
+
|
22
|
+
; 2] Check the the residue is less than p
|
23
|
+
A => B
|
24
|
+
C => A
|
25
|
+
1 :LT, RETURN
|
@@ -0,0 +1,31 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; squareFpBN254:
|
5
|
+
;; in: A ∈ Fp
|
6
|
+
;; out: B = A² (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
squareFpBN254:
|
11
|
+
; 1] Compute and check the inverse over Z
|
12
|
+
; A·A + [0] = [D]·2²⁵⁶ + [E]
|
13
|
+
A => B
|
14
|
+
0 => C
|
15
|
+
$${var _squareFpBN254_AA = A * A}
|
16
|
+
${_squareFpBN254_AA >> 256} => D
|
17
|
+
${_squareFpBN254_AA} => E :ARITH
|
18
|
+
|
19
|
+
; 2] Check it over Fp, that is, it must be satisfied that:
|
20
|
+
; [BN254_P]·[A² / p] + [A² % p] = D·2²⁵⁶ + E
|
21
|
+
; where C < BN254_P
|
22
|
+
%BN254_P => A
|
23
|
+
${_squareFpBN254_AA / const.BN254_P} => B ; quotient (256 bits)
|
24
|
+
${_squareFpBN254_AA % const.BN254_P} => C ; residue (256 bits)
|
25
|
+
E :ARITH
|
26
|
+
|
27
|
+
; 3] Check that the result is lower than BN254_P
|
28
|
+
A => B
|
29
|
+
C => A
|
30
|
+
1 :LT
|
31
|
+
A => B :RETURN
|
@@ -0,0 +1,36 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,BN254_P)
|
3
|
+
;;
|
4
|
+
;; subFpBN254:
|
5
|
+
;; in: A,C ∈ Fp
|
6
|
+
;; out: C = A - C (mod BN254_P) ∈ Fp
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
subFpBN254:
|
11
|
+
; 0] Negate C
|
12
|
+
A => D
|
13
|
+
%BN254_P => A
|
14
|
+
C => B
|
15
|
+
$ => C :SUB
|
16
|
+
D => A
|
17
|
+
|
18
|
+
; 1] Compute and check the sub over Z
|
19
|
+
; A·[1] + [BN254_P-C] = [D]·2²⁵⁶ + [E]
|
20
|
+
1 => B
|
21
|
+
$${var _subFpBN254_AC = A + C}
|
22
|
+
${_subFpBN254_AC >> 256} => D
|
23
|
+
${_subFpBN254_AC} => E :ARITH
|
24
|
+
|
25
|
+
; 2] Check it over Fp, that is, it must be satisfied that:
|
26
|
+
; [BN254_P]·[(A - C) / p] + [(A - C) % p] = D·2²⁵⁶ + E
|
27
|
+
; where C < BN254_P
|
28
|
+
%BN254_P => A
|
29
|
+
${_subFpBN254_AC / const.BN254_P} => B ; quotient (256 bits)
|
30
|
+
${_subFpBN254_AC % const.BN254_P} => C ; residue (256 bits)
|
31
|
+
E :ARITH
|
32
|
+
|
33
|
+
; 3] Check that the result is lower than BN254_P
|
34
|
+
A => B
|
35
|
+
C => A
|
36
|
+
1 :LT, RETURN
|
@@ -0,0 +1,25 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;; POST: The result is in the range [0,r)
|
3
|
+
;;
|
4
|
+
;; reduceFrBN254:
|
5
|
+
;; in: B ∈ [0, 2²⁵⁶-1]
|
6
|
+
;; out: A = B (mod BN254_R) ∈ Fr
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
VAR GLOBAL reduceFrBN254_tmp
|
11
|
+
|
12
|
+
reduceFrBN254:
|
13
|
+
; 1] It must be satisfied that:
|
14
|
+
; [BN254_R]·[B / r] + [B % r] = [0]·2²⁵⁶ + E
|
15
|
+
B :MSTORE(reduceFrBN254_tmp)
|
16
|
+
${B % const.BN254_R} => C ; residue (256 bits)
|
17
|
+
${B / const.BN254_R} => B ; quotient (256 bits)
|
18
|
+
%BN254_R => A
|
19
|
+
0n => D
|
20
|
+
$ :MLOAD(reduceFrBN254_tmp), ARITH
|
21
|
+
|
22
|
+
; 2] Check the the residue is less than r
|
23
|
+
A => B
|
24
|
+
C => A
|
25
|
+
1 :LT, RETURN
|
@@ -0,0 +1,62 @@
|
|
1
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2
|
+
;;
|
3
|
+
;; Constants of the optimal Ate pairing over the BN254 curve
|
4
|
+
;; e: G1 x G2 --> GT
|
5
|
+
;; where G1 = E(Fp)[r] = E(Fp), G2 = E'(Fp2)[r] and GT = mu_r (the r-th roots of unity over Fp12* over the curves:
|
6
|
+
;; E/Fp: y² = x³ + 3, E'/Fp2: y² = x³ + 3/(9+u)
|
7
|
+
;;
|
8
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
9
|
+
|
10
|
+
; Basic constants: X = "BN family parameter", P = "base field order", R = "scalar field order"
|
11
|
+
; CONSTL %BN254_X = 4965661367192848881n ; Unused, just for reference
|
12
|
+
CONSTL %BN254_P = 21888242871839275222246405745257275088696311157297823662689037894645226208583n ; 36n * X ** 4n + 36n * X ** 3n + 24n * X ** 2n + 6n * X + 1n
|
13
|
+
; NOTE: It is satisfied that 5·p < 2²⁵⁶ < 6·p
|
14
|
+
CONSTL %BN254_P_MINUS_ONE = 21888242871839275222246405745257275088696311157297823662689037894645226208582n
|
15
|
+
CONSTL %BN254_R = 21888242871839275222246405745257275088548364400416034343698204186575808495617n ; 36n * X ** 4n + 36n * X ** 3n + 18n * X ** 2n + 6n * X + 1n
|
16
|
+
CONSTL %BN254_R_MINUS_ONE = 21888242871839275222246405745257275088548364400416034343698204186575808495616n
|
17
|
+
|
18
|
+
; Precomputed values: 3/(9+u) and 6x²
|
19
|
+
CONSTL %BN254_E_B = 3n
|
20
|
+
CONSTL %BN254_ETWISTED_B_X = 19485874751759354771024239261021720505790618469301721065564631296452457478373n
|
21
|
+
CONSTL %BN254_ETWISTED_B_Y = 266929791119991161246907387137283842545076965332900288569378510910307636690n
|
22
|
+
CONSTL %BN254_SIX_TIMES_X_SQ = 147946756881789318990833708069417712966n
|
23
|
+
|
24
|
+
; Coordinates of the generator of the group G1
|
25
|
+
CONSTL %PAIRING_P1X = 1n
|
26
|
+
CONSTL %PAIRING_P1Y = 2n
|
27
|
+
|
28
|
+
; Coordinates of the generator of the group G2
|
29
|
+
CONSTL %PAIRING_P2X1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781n
|
30
|
+
CONSTL %PAIRING_P2X2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634n
|
31
|
+
CONSTL %PAIRING_P2Y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930n
|
32
|
+
CONSTL %PAIRING_P2Y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531n
|
33
|
+
|
34
|
+
; Precomputed frobenius operator constants. These are used to compute f^p, f^p2 and f^p3 cheaply, where f ∈ Fp12
|
35
|
+
; See: https://hackmd.io/kcEJAWISQ56eE6YpBnurgw#Frobenius-Operator
|
36
|
+
CONSTL %FROBENIUS_GAMMA111 = 8376118865763821496583973867626364092589906065868298776909617916018768340080n
|
37
|
+
CONSTL %FROBENIUS_GAMMA112 = 16469823323077808223889137241176536799009286646108169935659301613961712198316n
|
38
|
+
CONSTL %FROBENIUS_GAMMA121 = 21575463638280843010398324269430826099269044274347216827212613867836435027261n
|
39
|
+
CONSTL %FROBENIUS_GAMMA122 = 10307601595873709700152284273816112264069230130616436755625194854815875713954n
|
40
|
+
CONSTL %FROBENIUS_GAMMA131 = 2821565182194536844548159561693502659359617185244120367078079554186484126554n
|
41
|
+
CONSTL %FROBENIUS_GAMMA132 = 3505843767911556378687030309984248845540243509899259641013678093033130930403n
|
42
|
+
CONSTL %FROBENIUS_GAMMA131_NEGATED = 19066677689644738377698246183563772429336693972053703295610958340458742082029n ;%BN254_P - %FROBENIUS_GAMMA131
|
43
|
+
CONSTL %FROBENIUS_GAMMA132_NEGATED = 18382399103927718843559375435273026243156067647398564021675359801612095278180n ;%BN254_P - %FROBENIUS_GAMMA132
|
44
|
+
CONSTL %FROBENIUS_GAMMA141 = 2581911344467009335267311115468803099551665605076196740867805258568234346338n
|
45
|
+
CONSTL %FROBENIUS_GAMMA142 = 19937756971775647987995932169929341994314640652964949448313374472400716661030n
|
46
|
+
CONSTL %FROBENIUS_GAMMA151 = 685108087231508774477564247770172212460312782337200605669322048753928464687n
|
47
|
+
CONSTL %FROBENIUS_GAMMA152 = 8447204650696766136447902020341177575205426561248465145919723016860428151883n
|
48
|
+
CONSTL %FROBENIUS_GAMMA21 = 21888242871839275220042445260109153167277707414472061641714758635765020556617n
|
49
|
+
CONSTL %FROBENIUS_GAMMA22 = 21888242871839275220042445260109153167277707414472061641714758635765020556616n
|
50
|
+
CONSTL %FROBENIUS_GAMMA23 = 21888242871839275222246405745257275088696311157297823662689037894645226208582n
|
51
|
+
CONSTL %FROBENIUS_GAMMA24 = 2203960485148121921418603742825762020974279258880205651966n
|
52
|
+
CONSTL %FROBENIUS_GAMMA25 = 2203960485148121921418603742825762020974279258880205651967n
|
53
|
+
CONSTL %FROBENIUS_GAMMA311 = 11697423496358154304825782922584725312912383441159505038794027105778954184319n
|
54
|
+
CONSTL %FROBENIUS_GAMMA312 = 303847389135065887422783454877609941456349188919719272345083954437860409601n
|
55
|
+
CONSTL %FROBENIUS_GAMMA321 = 3772000881919853776433695186713858239009073593817195771773381919316419345261n
|
56
|
+
CONSTL %FROBENIUS_GAMMA322 = 2236595495967245188281701248203181795121068902605861227855261137820944008926n
|
57
|
+
CONSTL %FROBENIUS_GAMMA331 = 19066677689644738377698246183563772429336693972053703295610958340458742082029n
|
58
|
+
CONSTL %FROBENIUS_GAMMA332 = 18382399103927718843559375435273026243156067647398564021675359801612095278180n
|
59
|
+
CONSTL %FROBENIUS_GAMMA341 = 5324479202449903542726783395506214481928257762400643279780343368557297135718n
|
60
|
+
CONSTL %FROBENIUS_GAMMA342 = 16208900380737693084919495127334387981393726419856888799917914180988844123039n
|
61
|
+
CONSTL %FROBENIUS_GAMMA351 = 8941241848238582420466759817324047081148088512956452953208002715982955420483n
|
62
|
+
CONSTL %FROBENIUS_GAMMA352 = 10338197737521362862238855242243140895517409139741313354160881284257516364953n
|