1
1
use crate :: util:: Field ;
2
2
use bus_mapping:: precompile:: { PrecompileAuxData , PrecompileCalls } ;
3
- use eth_types:: { evm_types:: GasCost , word, ToLittleEndian , U256 } ;
3
+ use eth_types:: { evm_types:: GasCost , sign_types :: verify_r1_bytes , word, ToLittleEndian , U256 } ;
4
4
use gadgets:: util:: { and, not, or, select, sum, Expr } ;
5
5
use gadgets:: ToScalar ;
6
6
use halo2_proofs:: {
@@ -49,7 +49,6 @@ pub struct P256VerifyGadget<F> {
49
49
sig_s_keccak_rlc : Cell < F > ,
50
50
// pubkey_x_keccak_rlc: Cell<F>,
51
51
// pubkey_y_keccak_rlc: Cell<F>,
52
-
53
52
msg_hash_raw : Word < F > ,
54
53
msg_hash : Word < F > ,
55
54
fq_modulus : Word < F > ,
@@ -120,7 +119,7 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
120
119
let pk_y = cb. query_word_rlc ( ) ;
121
120
let pk_x_canonical = LtWordGadget :: construct ( cb, & pk_x, & fp_modulus) ;
122
121
let pk_y_canonical = LtWordGadget :: construct ( cb, & pk_y, & fp_modulus) ;
123
-
122
+
124
123
let x_y_canonical = and:: expr ( [ pk_x_canonical. expr ( ) , pk_y_canonical. expr ( ) ] ) ;
125
124
126
125
cb. require_equal (
@@ -195,34 +194,26 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
195
194
// lookup to the sign_verify table:
196
195
//
197
196
// || msg_hash | v(0) | r | s | recovered_addr(0) | is_valid ||
198
- cb. condition ( r_s_canonical. expr ( ) ,
199
- |cb| {
200
- cb. sig_table_lookup (
201
- msg_hash. expr ( ) ,
202
- // v set to zero
203
- 0 . expr ( ) ,
204
- sig_r. expr ( ) ,
205
- sig_s. expr ( ) ,
206
- // recovered addr set to 0.
207
- 0 . expr ( ) ,
208
- is_valid. expr ( ) ,
209
- ) ;
210
- } ,
211
- ) ;
212
- // check r, s is canonical
213
- cb. condition ( not:: expr ( r_s_canonical. expr ( ) ) , |cb| {
214
- cb. require_zero (
215
- "is_valid == false if r or s not canonical" ,
197
+ cb. condition ( r_s_canonical. expr ( ) , |cb| {
198
+ cb. sig_table_lookup (
199
+ msg_hash. expr ( ) ,
200
+ // v set to zero
201
+ 0 . expr ( ) ,
202
+ sig_r. expr ( ) ,
203
+ sig_s. expr ( ) ,
204
+ // recovered addr set to 0.
205
+ 0 . expr ( ) ,
216
206
is_valid. expr ( ) ,
217
207
) ;
218
208
} ) ;
209
+ // check r, s is canonical
210
+ cb. condition ( not:: expr ( r_s_canonical. expr ( ) ) , |cb| {
211
+ cb. require_zero ( "is_valid == false if r or s not canonical" , is_valid. expr ( ) ) ;
212
+ } ) ;
219
213
220
214
// check x, y is canonical
221
215
cb. condition ( not:: expr ( x_y_canonical. expr ( ) ) , |cb| {
222
- cb. require_zero (
223
- "is_valid == false if x or y not canonical" ,
224
- is_valid. expr ( ) ,
225
- ) ;
216
+ cb. require_zero ( "is_valid == false if x or y not canonical" , is_valid. expr ( ) ) ;
226
217
} ) ;
227
218
// cb.condition(not::expr(recovered.expr()), |cb| {
228
219
// cb.require_zero(
@@ -270,13 +261,9 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
270
261
+ ( sig_r_keccak_rlc. expr ( ) * r_pow_32)
271
262
+ sig_s_keccak_rlc. expr ( ) ,
272
263
) ;
273
- // TODO: constrain output first byte is bool .
274
- // cb.require_equal(
275
- // "output bytes (RLC) = recovered address",
276
- // output_bytes_rlc.expr(),
277
- // recovered_addr_keccak_rlc.expr(),
278
- // );
279
-
264
+ // constrain output first byte is bool .
265
+ cb. require_boolean ( "output first byte is bool" , output_bytes_rlc. expr ( ) ) ;
266
+
280
267
let restore_context = super :: gen_restore_context (
281
268
cb,
282
269
is_root. expr ( ) ,
@@ -297,7 +284,6 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
297
284
sig_r_keccak_rlc,
298
285
sig_s_keccak_rlc,
299
286
//recovered_addr_keccak_rlc,
300
-
301
287
msg_hash_raw,
302
288
msg_hash,
303
289
fq_modulus,
@@ -359,7 +345,6 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
359
345
. keccak_input ( )
360
346
. map ( |r| rlc:: value ( aux_data. return_bytes . iter ( ) . rev ( ) , r) ) ,
361
347
) ?;
362
- // check is_valid of sig ?
363
348
self . msg_hash_keccak_rlc . assign (
364
349
region,
365
350
offset,
@@ -368,7 +353,7 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
368
353
. keccak_input ( )
369
354
. map ( |r| rlc:: value ( & aux_data. msg_hash . to_le_bytes ( ) , r) ) ,
370
355
) ?;
371
-
356
+
372
357
self . sig_r_keccak_rlc . assign (
373
358
region,
374
359
offset,
@@ -414,8 +399,23 @@ impl<F: Field> ExecutionGadget<F> for P256VerifyGadget<F> {
414
399
self . sig_s_canonical
415
400
. assign ( region, offset, aux_data. sig_s , * FQ_MODULUS ) ?;
416
401
// assign pk_x_canonical, pk_y_canonical
417
- self . pk_x_canonical . assign ( region, offset, aux_data. pubkey_x , * FP_MODULUS ) ?;
418
- self . pk_y_canonical . assign ( region, offset, aux_data. pubkey_y , * FP_MODULUS ) ?;
402
+ self . pk_x_canonical
403
+ . assign ( region, offset, aux_data. pubkey_x , * FP_MODULUS ) ?;
404
+ self . pk_y_canonical
405
+ . assign ( region, offset, aux_data. pubkey_y , * FP_MODULUS ) ?;
406
+ // TODO: assign is_valid correctly
407
+ let pub_key_bytes = (
408
+ & aux_data. pubkey_x . to_le_bytes ( ) ,
409
+ & aux_data. pubkey_y . to_le_bytes ( ) ,
410
+ ) ;
411
+ let r_bytes = aux_data. sig_r . to_le_bytes ( ) ;
412
+ let s_bytes = aux_data. sig_s . to_le_bytes ( ) ;
413
+ let msg_hash_bytes = aux_data. msg_hash . to_le_bytes ( ) ;
414
+
415
+ let is_sig_valid =
416
+ verify_r1_bytes ( pub_key_bytes, & r_bytes, & s_bytes, & msg_hash_bytes, None ) ;
417
+ self . is_valid
418
+ . assign ( region, offset, Value :: known ( F :: from ( is_sig_valid) ) ) ?;
419
419
// self.recovered_addr_keccak_rlc.assign(
420
420
// region,
421
421
// offset,
0 commit comments