@@ -67,6 +67,7 @@ pub struct P256VerifyGadget<F> {
67
67
pk_x_canonical : LtWordGadget < F > ,
68
68
pk_y : Word < F > ,
69
69
pk_y_canonical : LtWordGadget < F > ,
70
+ is_valid : Cell < F > ,
70
71
71
72
is_success : Cell < F > ,
72
73
callee_address : Cell < F > ,
@@ -90,11 +91,13 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
90
91
cb. query_cell_phase2 ( ) ,
91
92
) ;
92
93
let (
94
+ is_valid,
93
95
msg_hash_keccak_rlc,
94
96
sig_r_keccak_rlc,
95
97
sig_s_keccak_rlc,
96
98
//recovered_addr_keccak_rlc,
97
99
) = (
100
+ cb. query_bool ( ) ,
98
101
cb. query_cell_phase2 ( ) ,
99
102
cb. query_cell_phase2 ( ) ,
100
103
cb. query_cell_phase2 ( ) ,
@@ -119,6 +122,8 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
119
122
let pk_x_canonical = LtWordGadget :: construct ( cb, & pk_x, & fp_modulus) ;
120
123
let pk_y_canonical = LtWordGadget :: construct ( cb, & pk_y, & fp_modulus) ;
121
124
125
+ let x_y_canonical = and:: expr ( [ pk_x_canonical. expr ( ) , pk_y_canonical. expr ( ) ] ) ;
126
+
122
127
cb. require_equal (
123
128
"msg hash cells assigned incorrectly" ,
124
129
msg_hash_keccak_rlc. expr ( ) ,
@@ -199,20 +204,25 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
199
204
0 . expr ( ) ,
200
205
sig_r. expr ( ) ,
201
206
sig_s. expr ( ) ,
202
- select:: expr (
203
- recovered. expr ( ) ,
204
- from_bytes:: expr ( & recovered_addr_keccak_rlc. cells ) ,
205
- 0 . expr ( ) ,
206
- ) ,
207
- recovered. expr ( ) ,
207
+ // recovered addr set to 0.
208
+ 0 . expr ( ) ,
209
+ is_valid. expr ( ) ,
208
210
) ;
209
211
} ,
210
212
) ;
211
- // TODO: check x, y is canonical
213
+ // check r, s is canonical
212
214
cb. condition ( not:: expr ( r_s_canonical. expr ( ) ) , |cb| {
213
215
cb. require_zero (
214
- "recovered == false if r or s not canonical" ,
215
- recovered. expr ( ) ,
216
+ "is_valid == false if r or s not canonical" ,
217
+ is_valid. expr ( ) ,
218
+ ) ;
219
+ } ) ;
220
+
221
+ // check x, y is canonical
222
+ cb. condition ( not:: expr ( x_y_canonical. expr ( ) ) , |cb| {
223
+ cb. require_zero (
224
+ "is_valid == false if x or y not canonical" ,
225
+ is_valid. expr ( ) ,
216
226
) ;
217
227
} ) ;
218
228
// cb.condition(not::expr(recovered.expr()), |cb| {
@@ -283,13 +293,10 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
283
293
284
294
pad_right,
285
295
padding,
286
-
287
- recovered,
288
296
msg_hash_keccak_rlc,
289
- sig_v_keccak_rlc,
290
297
sig_r_keccak_rlc,
291
298
sig_s_keccak_rlc,
292
- recovered_addr_keccak_rlc,
299
+ // recovered_addr_keccak_rlc,
293
300
294
301
msg_hash_raw,
295
302
msg_hash,
@@ -380,6 +387,8 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
380
387
( & self . msg_hash_raw , aux_data. msg_hash ) ,
381
388
( & self . sig_r , aux_data. sig_r ) ,
382
389
( & self . sig_s , aux_data. sig_s ) ,
390
+ ( & self . pk_x , aux_data. pubkey_x ) ,
391
+ ( & self . pk_y , aux_data. pubkey_y ) ,
383
392
] {
384
393
word_rlc. assign ( region, offset, Some ( value. to_le_bytes ( ) ) ) ?;
385
394
}
@@ -402,6 +411,9 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
402
411
. assign ( region, offset, aux_data. sig_r , * FQ_MODULUS ) ?;
403
412
self . sig_s_canonical
404
413
. assign ( region, offset, aux_data. sig_s , * FQ_MODULUS ) ?;
414
+ // assign pk_x_canonical, pk_y_canonical
415
+ self . pk_x_canonical . assign ( region, offset, aux_data. pubkey_x , * FP_MODULUS ) ?;
416
+ self . pk_y_canonical . assign ( region, offset, aux_data. pubkey_y , * FP_MODULUS ) ?;
405
417
// self.recovered_addr_keccak_rlc.assign(
406
418
// region,
407
419
// offset,
@@ -416,7 +428,7 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
416
428
self . padding . assign (
417
429
region,
418
430
offset,
419
- PrecompileCalls :: Ecrecover ,
431
+ PrecompileCalls :: P256Verify ,
420
432
region
421
433
. challenges ( )
422
434
. keccak_input ( )
@@ -425,7 +437,7 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
425
437
region. challenges ( ) . keccak_input ( ) ,
426
438
) ?;
427
439
} else {
428
- log:: error!( "unexpected aux_data {:?} for ecrecover " , step. aux_data) ;
440
+ log:: error!( "unexpected aux_data {:?} for p256verify " , step. aux_data) ;
429
441
return Err ( Error :: Synthesis ) ;
430
442
}
431
443
0 commit comments