From 805321584193f18dbc2411e92327f00696389edc Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 27 Jul 2022 16:49:26 +0200 Subject: [PATCH] Inverse for other fields --- evm/src/cpu/kernel/aggregator.rs | 24 +- .../cpu/kernel/asm/secp256k1/curve_mul.asm | 4 + .../kernel/asm/secp256k1/inverse_scalar.asm | 659 +-------------- evm/src/cpu/kernel/asm/secp256k1/moddiv.asm | 765 +----------------- evm/src/cpu/kernel/prover_input.rs | 10 +- 5 files changed, 54 insertions(+), 1408 deletions(-) diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index 1f8ba0da..114a3d83 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -14,14 +14,26 @@ use crate::memory::segments::Segment; pub static KERNEL: Lazy = Lazy::new(combined_kernel); +const EC_CONSTANTS: [(&str, [u8; 32]); 3] = [ + ( + "BN_BASE", + hex!("30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47"), + ), + ( + "SECP_BASE", + hex!("fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"), + ), + ( + "SECP_SCALAR", + hex!("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"), + ), +]; + pub fn evm_constants() -> HashMap { let mut c = HashMap::new(); - c.insert( - "BN_BASE".into(), - U256::from_big_endian(&hex!( - "30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47" - )), - ); + for (name, value) in EC_CONSTANTS { + c.insert(name.into(), U256::from_big_endian(&value)); + } for segment in Segment::all() { c.insert(segment.var_name().into(), (segment as u32).into()); } diff --git a/evm/src/cpu/kernel/asm/secp256k1/curve_mul.asm b/evm/src/cpu/kernel/asm/secp256k1/curve_mul.asm index 7ad2dd71..f0825e88 100644 --- a/evm/src/cpu/kernel/asm/secp256k1/curve_mul.asm +++ b/evm/src/cpu/kernel/asm/secp256k1/curve_mul.asm @@ -2,6 +2,10 @@ global ec_mul_valid_point_secp: JUMPDEST // stack: x, y, s, retdest + %stack (x,y) -> (x,y,x,y) + %ec_isidentity + // stack: (x,y)==(0,0), x, y, s, retdest + %jumpi(ret_zero_ec_mul) DUP3 // stack: s, x, y, s, retdest %jumpi(step_case) diff --git a/evm/src/cpu/kernel/asm/secp256k1/inverse_scalar.asm b/evm/src/cpu/kernel/asm/secp256k1/inverse_scalar.asm index ce0af757..7b859b4f 100644 --- a/evm/src/cpu/kernel/asm/secp256k1/inverse_scalar.asm +++ b/evm/src/cpu/kernel/asm/secp256k1/inverse_scalar.asm @@ -17,654 +17,19 @@ %mulmodn_secp_scalar %endmacro -// Computes the inverse modulo N using x^-1 = x^(N-2) mod N and square-and-multiply modular exponentiation. +// Non-deterministically provide the inverse modulo N. %macro inverse_secp_scalar - DUP1 - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar - %squaremodn_secp_scalar - DUP2 - %mulmodn_secp_scalar + // stack: x + PROVER_INPUT(ff::secp256k1_scalar::inverse) + // stack: x^-1, x + %stack (inv, x) -> (inv, x, @SECP_SCALAR, inv, x) + // stack: x^-1, x, N, x^-1, x + MULMOD + // stack: x^-1 * x, x^-1, x + PUSH 1 + // stack: 1, x^-1 * x, x^-1, x + %assert_eq + // stack: x^-1, x SWAP1 // stack: x, x^-1 POP diff --git a/evm/src/cpu/kernel/asm/secp256k1/moddiv.asm b/evm/src/cpu/kernel/asm/secp256k1/moddiv.asm index 941fa33a..fd077b11 100644 --- a/evm/src/cpu/kernel/asm/secp256k1/moddiv.asm +++ b/evm/src/cpu/kernel/asm/secp256k1/moddiv.asm @@ -25,760 +25,19 @@ %mulmodn_secp_base %endmacro -// Computes the inverse modulo N using x^-1 = x^(N-2) mod N and square-and-multiply modular exponentiation. +// Non-deterministically provide the inverse modulo N. %macro inverse_secp_base - DUP1 - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base - %squaremodn_secp_base - %squaremodn_secp_base - DUP2 - %mulmodn_secp_base + // stack: x + PROVER_INPUT(ff::secp256k1_base::inverse) + // stack: x^-1, x + %stack (inv, x) -> (inv, x, @SECP_BASE, inv, x) + // stack: x^-1, x, N, x^-1, x + MULMOD + // stack: x^-1 * x, x^-1, x + PUSH 1 + // stack: 1, x^-1 * x, x^-1, x + %assert_eq + // stack: x^-1, x SWAP1 // stack: x, x^-1 POP diff --git a/evm/src/cpu/kernel/prover_input.rs b/evm/src/cpu/kernel/prover_input.rs index 21645340..ac83257a 100644 --- a/evm/src/cpu/kernel/prover_input.rs +++ b/evm/src/cpu/kernel/prover_input.rs @@ -89,8 +89,14 @@ impl Field { .unwrap() } Field::Bn254Scalar => todo!(), - Field::Secp256k1Base => todo!(), - Field::Secp256k1Scalar => todo!(), + Field::Secp256k1Base => { + U256::from_str("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f") + .unwrap() + } + Field::Secp256k1Scalar => { + U256::from_str("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141") + .unwrap() + } } }