From 0bf9cd2f868303abb67e2ff10ab0e7802d054ae3 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 10 Jan 2024 13:24:16 +0100 Subject: [PATCH] Use current context in ecrecover (#1456) --- .../asm/curve/bn254/field_arithmetic/util.asm | 8 ++-- .../kernel/asm/curve/secp256k1/ecrecover.asm | 4 +- .../asm/curve/secp256k1/precomputation.asm | 38 +++++++++---------- evm/src/memory/segments.rs | 4 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/util.asm b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/util.asm index 6dbddddc..86b179ba 100644 --- a/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/util.asm +++ b/evm/src/cpu/kernel/asm/curve/bn254/field_arithmetic/util.asm @@ -1,7 +1,7 @@ // Load a single value from bn254 pairings memory. %macro mload_bn254_pairing // stack: offset - %mload_current(@SEGMENT_KERNEL_BN_PAIRING) + %mload_current(@SEGMENT_BN_PAIRING) // stack: value %endmacro @@ -9,14 +9,14 @@ // stack: PUSH $offset // stack: offset - %mload_current(@SEGMENT_KERNEL_BN_PAIRING) + %mload_current(@SEGMENT_BN_PAIRING) // stack: value %endmacro // Store a single value to bn254 pairings memory. %macro mstore_bn254_pairing // stack: offset, value - %mstore_current(@SEGMENT_KERNEL_BN_PAIRING) + %mstore_current(@SEGMENT_BN_PAIRING) // stack: %endmacro @@ -24,7 +24,7 @@ // stack: value PUSH $offset // stack: offset, value - %mstore_current(@SEGMENT_KERNEL_BN_PAIRING) + %mstore_current(@SEGMENT_BN_PAIRING) // stack: %endmacro diff --git a/evm/src/cpu/kernel/asm/curve/secp256k1/ecrecover.asm b/evm/src/cpu/kernel/asm/curve/secp256k1/ecrecover.asm index c84536d8..cb07bf47 100644 --- a/evm/src/cpu/kernel/asm/curve/secp256k1/ecrecover.asm +++ b/evm/src/cpu/kernel/asm/curve/secp256k1/ecrecover.asm @@ -87,9 +87,9 @@ ecdsa_after_precompute_loop: %mul_const(2) ADD %mul_const(2) ADD %mul_const(2) ADD %stack (index, i, accx, accy, a0, a1, b0, b1, retdest) -> (index, index, i, accx, accy, a0, a1, b0, b1, retdest) %mul_const(2) %add_const(1) - %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mload_current(@SEGMENT_ECDSA_TABLE) SWAP1 %mul_const(2) - %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mload_current(@SEGMENT_ECDSA_TABLE) %stack (Px, Py, i, accx, accy, a0, a1, b0, b1, retdest) -> (Px, Py, accx, accy, ecdsa_after_precompute_loop_contd, i, a0, a1, b0, b1, retdest) %jump(secp_add_valid_points) ecdsa_after_precompute_loop_contd: diff --git a/evm/src/cpu/kernel/asm/curve/secp256k1/precomputation.asm b/evm/src/cpu/kernel/asm/curve/secp256k1/precomputation.asm index 3cea0315..b6bed1b0 100644 --- a/evm/src/cpu/kernel/asm/curve/secp256k1/precomputation.asm +++ b/evm/src/cpu/kernel/asm/curve/secp256k1/precomputation.asm @@ -1,27 +1,27 @@ // Initial stack: Gneg, Qneg, Qx, Qy, retdest -// Compute a*G ± b*phi(G) + c*Q ± d*phi(Q) for a,b,c,d in {0,1}^4 and store its x-coordinate at location `2*(8a+4b+2c+d)` and its y-coordinate at location `2*(8a+4b+2c+d)+1` in the SEGMENT_KERNEL_ECDSA_TABLE segment. +// Compute a*G ± b*phi(G) + c*Q ± d*phi(Q) for a,b,c,d in {0,1}^4 and store its x-coordinate at location `2*(8a+4b+2c+d)` and its y-coordinate at location `2*(8a+4b+2c+d)+1` in the SEGMENT_ECDSA_TABLE segment. global secp_precompute_table: // First store G, ± phi(G), G ± phi(G) // Use Gneg for the ±, e.g., ±phi(G) is computed as `Gneg * (-phi(G)) + (1-Gneg)*phi(G)` (note only the y-coordinate needs to be filtered). // stack: Gneg, Qneg, Qx, Qy, retdest PUSH 32670510020758816978083085130507043184471273380659243275938904335757337482424 PUSH 17 PUSH 55066263022277343669578718895168534326250603453777594175500187360389116729240 PUSH 16 - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) %mstore_current(@SEGMENT_ECDSA_TABLE) DUP1 DUP1 %mul_const(32670510020758816978083085130507043184471273380659243275938904335757337482424) SWAP1 PUSH 1 SUB %mul_const(83121579216557378445487899878180864668798711284981320763518679672151497189239) ADD PUSH 9 PUSH 85340279321737800624759429340272274763154997815782306132637707972559913914315 PUSH 8 - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) %mstore_current(@SEGMENT_ECDSA_TABLE) DUP1 DUP1 %mul_const(83121579216557378445487899878180864668798711284981320763518679672151497189239) SWAP1 PUSH 1 SUB %mul_const(100652675408719987021357910538015346127426077519185866739835120963490438734674) ADD PUSH 25 - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) DUP1 %mul_const(91177636130617246552803821781935006617134368061721227770777272682868638699771) SWAP1 PUSH 1 SUB %mul_const(66837770201594535779099350687042404727408598709762866365333192677982385899440) ADD PUSH 24 - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) // Then store Q, ±phi(Q), Q ± phi(Q) %stack (Qneg, Qx, Qy, retdest) -> (4, Qx, 5, Qy, Qx, @SECP_BASE, Qneg, Qx, Qy, retdest) - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) %mstore_current(@SEGMENT_ECDSA_TABLE) // stack: Qx, @SECP_BASE, Qx, Qy, retdest PUSH @SECP_GLV_BETA MULMOD %stack (betaQx, Qneg, Qx, Qy, retdest) -> (Qneg, Qy, Qneg, betaQx, Qx, Qy, retdest) @@ -29,42 +29,42 @@ global secp_precompute_table: // stack: 1-Qneg, Qneg*Qy, betaQx, Qx, Qy, retdest DUP5 PUSH @SECP_BASE SUB MUL ADD %stack (selectQy, betaQx, Qx, Qy, retdest) -> (2, betaQx, 3, selectQy, betaQx, selectQy, Qx, Qy, precompute_table_contd, retdest) - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) %mstore_current(@SEGMENT_ECDSA_TABLE) %jump(secp_add_valid_points_no_edge_case) precompute_table_contd: %stack (x, y, retdest) -> (6, x, 7, y, retdest) - %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mstore_current(@SEGMENT_ECDSA_TABLE) %mstore_current(@SEGMENT_ECDSA_TABLE) PUSH 2 // Use a loop to store a*G ± b*phi(G) + c*Q ± d*phi(Q) for a,b,c,d in {0,1}^4. precompute_table_loop: // stack: i, retdest - DUP1 %increment %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + DUP1 %increment %mload_current(@SEGMENT_ECDSA_TABLE) %stack (y, i, retdest) -> (i, y, i, retdest) - %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + %mload_current(@SEGMENT_ECDSA_TABLE) PUSH precompute_table_loop_contd DUP3 DUP3 - PUSH 9 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) - PUSH 8 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + PUSH 9 %mload_current(@SEGMENT_ECDSA_TABLE) + PUSH 8 %mload_current(@SEGMENT_ECDSA_TABLE) // stack: Gx, Gy, x, y, precompute_table_loop_contd, x, y, i, retdest %jump(secp_add_valid_points) precompute_table_loop_contd: %stack (Rx, Ry, x, y, i, retdest) -> (i, 8, Rx, i, 9, Ry, x, y, i, retdest) - ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + ADD %mstore_current(@SEGMENT_ECDSA_TABLE) ADD %mstore_current(@SEGMENT_ECDSA_TABLE) DUP2 DUP2 - PUSH 17 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) - PUSH 16 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + PUSH 17 %mload_current(@SEGMENT_ECDSA_TABLE) + PUSH 16 %mload_current(@SEGMENT_ECDSA_TABLE) %stack (Gx, Gy, x, y, x, y, i, retdest) -> (Gx, Gy, x, y, precompute_table_loop_contd2, x, y, i, retdest) %jump(secp_add_valid_points) precompute_table_loop_contd2: %stack (Rx, Ry, x, y, i, retdest) -> (i, 16, Rx, i, 17, Ry, x, y, i, retdest) - ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) - PUSH 25 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) - PUSH 24 %mload_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + ADD %mstore_current(@SEGMENT_ECDSA_TABLE) ADD %mstore_current(@SEGMENT_ECDSA_TABLE) + PUSH 25 %mload_current(@SEGMENT_ECDSA_TABLE) + PUSH 24 %mload_current(@SEGMENT_ECDSA_TABLE) %stack (Gx, Gy, x, y, i, retdest) -> (Gx, Gy, x, y, precompute_table_loop_contd3, i, retdest) %jump(secp_add_valid_points) precompute_table_loop_contd3: %stack (Rx, Ry, i, retdest) -> (i, 24, Rx, i, 25, Ry, i, retdest) - ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) ADD %mstore_kernel(@SEGMENT_KERNEL_ECDSA_TABLE) + ADD %mstore_current(@SEGMENT_ECDSA_TABLE) ADD %mstore_current(@SEGMENT_ECDSA_TABLE) %add_const(2) DUP1 %eq_const(8) %jumpi(precompute_table_end) %jump(precompute_table_loop) diff --git a/evm/src/memory/segments.rs b/evm/src/memory/segments.rs index ac90d210..6177d996 100644 --- a/evm/src/memory/segments.rs +++ b/evm/src/memory/segments.rs @@ -138,11 +138,11 @@ impl Segment { Segment::TrieData => "SEGMENT_TRIE_DATA", Segment::ShiftTable => "SEGMENT_SHIFT_TABLE", Segment::JumpdestBits => "SEGMENT_JUMPDEST_BITS", - Segment::EcdsaTable => "SEGMENT_KERNEL_ECDSA_TABLE", + Segment::EcdsaTable => "SEGMENT_ECDSA_TABLE", Segment::BnWnafA => "SEGMENT_BN_WNAF_A", Segment::BnWnafB => "SEGMENT_BN_WNAF_B", Segment::BnTableQ => "SEGMENT_BN_TABLE_Q", - Segment::BnPairing => "SEGMENT_KERNEL_BN_PAIRING", + Segment::BnPairing => "SEGMENT_BN_PAIRING", Segment::AccessedAddresses => "SEGMENT_ACCESSED_ADDRESSES", Segment::AccessedStorageKeys => "SEGMENT_ACCESSED_STORAGE_KEYS", Segment::SelfDestructList => "SEGMENT_SELFDESTRUCT_LIST",