Skip to content

Commit dc3b783

Browse files
lorenzogentile404OlivierBBBamkCha
authored
EIP-7951: Precompile for secp256r1 Curve Support (#817)
Co-authored-by: Olivier Bégassat <[email protected]> Co-authored-by: amkCha <[email protected]> Co-authored-by: Olivier Bégassat <[email protected]>
1 parent 6abbf79 commit dc3b783

File tree

33 files changed

+1152
-505
lines changed

33 files changed

+1152
-505
lines changed

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ CONSTANTS_PRAGUE := constants/prague/constants.zkasm
3232
CONSTANTS_OSAKA := constants/osaka/constants.zkasm
3333

3434
EC_DATA_LONDON := ecdata/london
35-
3635
EC_DATA_OSAKA := ecdata/osaka
3736

3837
EUC := euc/euc.zkasm

constants/constants.lisp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@
246246
GAS_CONST_BLS_MAP_FP2_TO_G2 23800
247247
GAS_CONST_BLS_PAIRING_CHECK 37700
248248
GAS_CONST_BLS_PAIRING_CHECK_PAIR 32600
249+
GAS_CONST_P256_VERIFY 6900
249250
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
250251
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
251252
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EVM MISC ;;
@@ -329,6 +330,7 @@
329330
PRECOMPILE_CALL_DATA_UNIT_SIZE___BLS_PAIRING_CHECK 384
330331
PRECOMPILE_CALL_DATA_SIZE___FP_TO_G1 64
331332
PRECOMPILE_CALL_DATA_SIZE___FP2_TO_G2 128
333+
PRECOMPILE_CALL_DATA_SIZE___P256_VERIFY 160
332334

333335
PRC_ECPAIRING_SIZE (* 6 WORD_SIZE)
334336
PRECOMPILE_CALL_DATA_SIZE___BLAKE2F 213
@@ -343,6 +345,7 @@
343345
PRECOMPILE_RETURN_DATA_SIZE___BLS_PAIRING_CHECK 32
344346
PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP_TO_G1 128
345347
PRECOMPILE_RETURN_DATA_SIZE___BLS_MAP_FP2_TO_G2 256
348+
PRECOMPILE_RETURN_DATA_SIZE___P256_VERIFY 32
346349

347350
PRC_BLS_G1_MSM_MAX_DISCOUNT 519
348351
PRC_BLS_G2_MSM_MAX_DISCOUNT 524
@@ -406,6 +409,8 @@
406409
PHASE_ECMUL_RESULT 0x070B
407410
PHASE_ECPAIRING_DATA 0x080A
408411
PHASE_ECPAIRING_RESULT 0x080B
412+
PHASE_P256_VERIFY_DATA 0x100A
413+
PHASE_P256_VERIFY_RESULT 0x100B
409414
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
410415
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
411416
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BLS DATA MODULE ;;
@@ -524,6 +529,7 @@
524529
OOB_INST_BLS_PAIRING_CHECK 0xFF0F
525530
OOB_INST_BLS_MAP_FP_TO_G1 0xFF10
526531
OOB_INST_BLS_MAP_FP2_TO_G2 0xFF11
532+
OOB_INST_P256_VERIFY 0xF100
527533
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
528534
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
529535
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RLP* MODULE ;;

ecdata/london/columns.lisp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,6 @@
3636
(G2_MEMBERSHIP_TEST_REQUIRED :binary@prove)
3737
(ACCEPTABLE_PAIR_OF_POINTS_FOR_PAIRING_CIRCUIT :binary@prove)
3838

39-
(CIRCUIT_SELECTOR_ECRECOVER :binary@prove)
40-
(CIRCUIT_SELECTOR_ECADD :binary@prove)
41-
(CIRCUIT_SELECTOR_ECMUL :binary@prove)
42-
(CIRCUIT_SELECTOR_ECPAIRING :binary@prove)
43-
(CIRCUIT_SELECTOR_G2_MEMBERSHIP :binary@prove)
44-
4539
(WCP_FLAG :binary@prove)
4640
(WCP_ARG1_HI :i128)
4741
(WCP_ARG1_LO :i128)

ecdata/london/constraints.lisp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,6 @@
478478
(eq! P_is_point_at_infinity 1)
479479
(vanishes! P_is_point_at_infinity))))))
480480

481-
;; Note: in the specs for simplicity we omit the last four arguments
482481
(defun (callToC1MembershipWCP k
483482
_P_x_hi
484483
_P_x_lo
@@ -492,7 +491,6 @@
492491
(callToLT (+ k 1) _P_y_hi _P_y_lo P_BN_HI P_BN_LO)
493492
(callToEQ (+ k 2) _P_y_square_hi _P_y_square_lo _P_x_cube_plus_three_hi _P_x_cube_plus_three_lo)))
494493

495-
;; Note: in the specs for simplicity we omit the last four arguments
496494
(defun (callToC1MembershipEXT k
497495
_P_x_hi
498496
_P_x_lo
@@ -568,17 +566,17 @@
568566
(s_hi (shift LIMB 6))
569567
(s_lo (shift LIMB 7)))
570568
(begin (callToLT 0 r_hi r_lo SECP256K1N_HI SECP256K1N_LO)
571-
(callToLT 1 0 0 r_hi r_lo)
569+
(callToISZERO 1 r_hi r_lo)
572570
(callToLT 2 s_hi s_lo SECP256K1N_HI SECP256K1N_LO)
573-
(callToLT 3 0 0 s_hi s_lo)
571+
(callToISZERO 3 s_hi s_lo)
574572
(callToEQ 4 v_hi v_lo 0 27)
575573
(callToEQ 5 v_hi v_lo 0 28))))
576574

577575
(defconstraint justify-success-bit-ecrecover (:guard (ecrecover-hypothesis))
578576
(let ((r_is_in_range WCP_RES)
579-
(r_is_positive (next WCP_RES))
577+
(r_is_positive (- 1 (next WCP_RES)))
580578
(s_is_in_range (shift WCP_RES 2))
581-
(s_is_positive (shift WCP_RES 3))
579+
(s_is_positive (- 1 (shift WCP_RES 3)))
582580
(v_is_27 (shift WCP_RES 4))
583581
(v_is_28 (shift WCP_RES 5))
584582
(internal_checks_passed (shift HURDLE INDEX_MAX_ECRECOVER_DATA)))
@@ -729,25 +727,20 @@
729727
;; 3.7.3 Interface for ;;
730728
;; Gnark ;;
731729
;;;;;;;;;;;;;;;;;;;;;;;;;
732-
(defconstraint ecrecover-circuit-selector ()
733-
(eq! CS_ECRECOVER (* ICP (is_ecrecover))))
730+
(defcomputedcolumn (CIRCUIT_SELECTOR_ECRECOVER :binary@prove)
731+
(* ICP (is_ecrecover)))
734732

735-
(defconstraint ecadd-circuit-selector ()
736-
(eq! CS_ECADD (* ICP (is_ecadd))))
733+
(defcomputedcolumn (CIRCUIT_SELECTOR_ECADD :binary@prove)
734+
(* ICP (is_ecadd)))
737735

738-
(defconstraint ecmul-circuit-selector ()
739-
(eq! CS_ECMUL (* ICP (is_ecmul))))
736+
(defcomputedcolumn (CIRCUIT_SELECTOR_ECMUL :binary@prove)
737+
(* ICP (is_ecmul)))
740738

741-
(defconstraint ecpairing-circuit-selector ()
742-
(begin
743-
(if-not-zero IS_ECPAIRING_DATA (eq! CS_ECPAIRING ACCPC))
744-
(if-not-zero IS_ECPAIRING_RESULT (eq! CS_ECPAIRING (* SUCCESS_BIT (- 1 TRIVIAL_PAIRING))))
745-
(if-zero (is_ecpairing) (vanishes! CS_ECPAIRING))
746-
)
747-
)
739+
(defcomputedcolumn (CIRCUIT_SELECTOR_ECPAIRING :binary@prove)
740+
(+ (* IS_ECPAIRING_DATA ACCPC) (* IS_ECPAIRING_RESULT (* SUCCESS_BIT (- 1 TRIVIAL_PAIRING)))))
748741

749-
(defconstraint g2-membership-circuit-selector ()
750-
(eq! CS_G2_MEMBERSHIP G2MTR))
742+
(defcomputedcolumn (CIRCUIT_SELECTOR_G2_MEMBERSHIP :binary@prove)
743+
G2MTR)
751744

752745
(defconstraint circuit-selectors-sum-binary ()
753746
(debug (is-binary (+ CS_ECRECOVER CS_ECADD CS_ECMUL CS_ECPAIRING CS_G2_MEMBERSHIP))))

ecdata/osaka/columns.lisp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
(INDEX_MAX :i16)
1111
(SUCCESS_BIT :binary@prove)
1212

13-
(IS_ECRECOVER_DATA :binary@prove)
14-
(IS_ECRECOVER_RESULT :binary@prove)
15-
(IS_ECADD_DATA :binary@prove)
16-
(IS_ECADD_RESULT :binary@prove)
17-
(IS_ECMUL_DATA :binary@prove)
18-
(IS_ECMUL_RESULT :binary@prove)
19-
(IS_ECPAIRING_DATA :binary@prove)
20-
(IS_ECPAIRING_RESULT :binary@prove)
13+
(IS_ECRECOVER_DATA :binary@prove)
14+
(IS_ECRECOVER_RESULT :binary@prove)
15+
(IS_ECADD_DATA :binary@prove)
16+
(IS_ECADD_RESULT :binary@prove)
17+
(IS_ECMUL_DATA :binary@prove)
18+
(IS_ECMUL_RESULT :binary@prove)
19+
(IS_ECPAIRING_DATA :binary@prove)
20+
(IS_ECPAIRING_RESULT :binary@prove)
21+
(IS_P256_VERIFY_DATA :binary@prove)
22+
(IS_P256_VERIFY_RESULT :binary@prove)
2123

2224
(TOTAL_PAIRINGS :i16)
2325
(ACC_PAIRINGS :i16)
@@ -36,12 +38,6 @@
3638
(G2_MEMBERSHIP_TEST_REQUIRED :binary@prove)
3739
(ACCEPTABLE_PAIR_OF_POINTS_FOR_PAIRING_CIRCUIT :binary@prove)
3840

39-
(CIRCUIT_SELECTOR_ECRECOVER :binary@prove)
40-
(CIRCUIT_SELECTOR_ECADD :binary@prove)
41-
(CIRCUIT_SELECTOR_ECMUL :binary@prove)
42-
(CIRCUIT_SELECTOR_ECPAIRING :binary@prove)
43-
(CIRCUIT_SELECTOR_G2_MEMBERSHIP :binary@prove)
44-
4541
(WCP_FLAG :binary@prove)
4642
(WCP_ARG1_HI :i128)
4743
(WCP_ARG1_LO :i128)
@@ -71,6 +67,7 @@
7167
CS_ECADD CIRCUIT_SELECTOR_ECADD
7268
CS_ECMUL CIRCUIT_SELECTOR_ECMUL
7369
CS_ECPAIRING CIRCUIT_SELECTOR_ECPAIRING
70+
CS_P256_VERIFY CIRCUIT_SELECTOR_P256_VERIFY
7471
CS_G2_MEMBERSHIP CIRCUIT_SELECTOR_G2_MEMBERSHIP)
7572

7673

ecdata/osaka/constants.lisp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,21 @@
55
P_BN_LO 0x97816a916871ca8d3c208c16d87cfd47
66
SECP256K1N_HI 0xffffffffffffffffffffffffffffffff
77
SECP256K1N_LO 0xfffffffffffffffffffffffefffffc2f
8+
P_R1_HI 0xffffffff000000010000000000000000
9+
P_R1_LO 0x00000000ffffffffffffffffffffffff
10+
SECP256R1N_HI 0xffffffff00000000ffffffffffffffff
11+
SECP256R1N_LO 0xbce6faada7179e84f3b9cac2fc632551
12+
A_COEFF_R1_HI 0xffffffff000000010000000000000000
13+
A_COEFF_R1_LO 0x00000000fffffffffffffffffffffffc
14+
B_COEFF_R1_HI 0x5ac635d8aa3a93e7b3ebbd55769886bc
15+
B_COEFF_R1_LO 0x651d06b0cc53b0f63bce3c3e27d2604b
816
MULMOD 0x09
917
ADDMOD 0x08
1018
ECRECOVER 0x01
1119
ECADD 0x06
1220
ECMUL 0x07
1321
ECPAIRING 0x08
22+
P256_VERIFY 0x100
1423
INDEX_MAX_ECRECOVER_DATA 7
1524
INDEX_MAX_ECADD_DATA 7
1625
INDEX_MAX_ECMUL_DATA 5
@@ -19,6 +28,8 @@
1928
INDEX_MAX_ECADD_RESULT 3
2029
INDEX_MAX_ECMUL_RESULT 3
2130
INDEX_MAX_ECPAIRING_RESULT 1
31+
INDEX_MAX_P256_VERIFY_DATA 9
32+
INDEX_MAX_P256_VERIFY_RESULT 1
2233
TOTAL_SIZE_ECRECOVER_DATA 128
2334
TOTAL_SIZE_ECADD_DATA 128
2435
TOTAL_SIZE_ECMUL_DATA 96
@@ -27,6 +38,8 @@
2738
TOTAL_SIZE_ECADD_RESULT 64
2839
TOTAL_SIZE_ECMUL_RESULT 64
2940
TOTAL_SIZE_ECPAIRING_RESULT 32
41+
TOTAL_SIZE_P256_VERIFY_DATA 160
42+
TOTAL_SIZE_P256_VERIFY_RESULT 32
3043
CT_MAX_SMALL_POINT 3
3144
CT_MAX_LARGE_POINT 7)
3245

0 commit comments

Comments
 (0)