@@ -240,149 +240,19 @@ fn p256_sign_verify() {
240
240
use super :: utils:: LOG_TOTAL_NUM_ROWS ;
241
241
use crate :: sig_circuit:: utils:: MAX_NUM_SIG ;
242
242
use halo2_proofs:: halo2curves:: bn256:: Fr ;
243
- use p256:: ecdsa:: signature:: hazmat:: { PrehashSigner , PrehashVerifier } ;
244
- use p256:: ecdsa:: signature:: DigestSigner ;
245
- use p256:: ecdsa:: {
246
- signature:: Signer , signature:: Verifier , Signature , SigningKey , VerifyingKey ,
247
- } ;
248
- use p256:: {
249
- elliptic_curve:: generic_array:: GenericArray , elliptic_curve:: Curve , AffinePoint , NistP256 ,
250
- } ;
251
243
use rand:: SeedableRng ;
252
244
use rand_xorshift:: XorShiftRng ;
253
245
use sha3:: { Digest , Keccak256 } ;
254
- //use hex_literal::hex;
255
- use ff:: FromUniformBytes ;
256
- use ff:: PrimeField ;
257
- use halo2_proofs:: arithmetic:: CurveAffine ;
258
- use halo2_proofs:: halo2curves:: group:: GroupEncoding ;
259
- use halo2_proofs:: halo2curves:: serde:: SerdeObject ;
260
- use num:: { BigUint , Num } ;
261
- use p256:: elliptic_curve:: point:: AffineCoordinates ;
262
- use p256:: pkcs8:: EncodePublicKey ;
263
- use p256:: PublicKey ;
264
-
265
246
let mut rng = XorShiftRng :: seed_from_u64 ( 10000 ) ;
266
247
267
- // p256 crate generate signature
268
- // {
269
- // let mut signatures = Vec::new();
270
- // let msg = gen_msg(&mut rng);
271
-
272
- // let msg_hash_bytes: [u8; 32] = Keccak256::digest(&msg)
273
- // .as_slice()
274
- // .to_vec()
275
- // .try_into()
276
- // .expect("hash length isn't 32 bytes");
277
- // let msg_hash = secp256r1::Fq::from_bytes(&msg_hash_bytes).unwrap();
278
- // let (sk, pk) = gen_key_pair_r1(&mut rng);
279
- // println!("sk_fq raw bytes {:?}", sk.to_raw_bytes());
280
- // println!("sk_fq to_bytes {:?}", sk.to_bytes()); // = to_repr
281
-
282
- // println!("pk_fp.x {:?}", pk.x.to_bytes());
283
-
284
- // let (r, s, v) = sign_r1_with_rng(&mut rng, sk, msg_hash);
285
- // // signatures.push(SignData {
286
- // // signature: (r, s, v),
287
- // // pk,
288
- // // msg: msg.into(),
289
- // // msg_hash,
290
- // // });
291
-
292
- // let signing_key = SigningKey::from_slice(&sk.to_raw_bytes()).expect("get private from sk");
293
- // println!("signing_key = {:?}", signing_key.to_bytes());
294
- // let verifying_key = signing_key.verifying_key();
295
- // // let vk= verifying_key.to_encoded_point(false);
296
- // println!("verifying_key = {:?}", verifying_key);
297
-
298
- // let signature: Signature = signing_key
299
- // .sign_prehash(&msg_hash_bytes)
300
- // .expect("sign failed");
301
- // let sig_bytes = signature.to_bytes();
302
- // let mut sig_r_bytes: [u8; 32] = sig_bytes[..32].try_into().expect("failed ");
303
- // let mut sig_s_bytes: [u8; 32] = sig_bytes[32..64].try_into().expect("failed ");
304
- // // let r = secp256r1::Fq::from_bytes_le(&sig_r_bytes);
305
- // // let s = secp256r1::Fq::from_bytes_le(&sig_s_bytes);
306
- // sig_r_bytes.reverse();
307
- // sig_s_bytes.reverse();
308
- // // let r = secp256r1::Fq::from_bytes(&sig_r_bytes).unwrap();
309
- // // let s = secp256r1::Fq::from_bytes(&sig_s_bytes).unwrap();
310
- // // put into sig queue for sig circuit verification
311
- // // hack: custom pk
312
- // fn fe_from_str(string: impl AsRef<str>) -> secp256r1::Fp {
313
- // let string = string.as_ref();
314
- // let oct = if let Some(hex) = string.strip_prefix("0x") {
315
- // BigUint::from_str_radix(hex, 16).unwrap().to_string()
316
- // } else {
317
- // string.to_string()
318
- // };
319
-
320
- // secp256r1::Fp::from_str_vartime(&oct).unwrap()
321
- // }
322
- // // let x = fe_from_str("0x972eb906f4c9315a6bd0e3cf80de7faf5c7d924bf9db641e952065952bbda42c");
323
- // // let y = fe_from_str("0x548448473cfb708b0e0835a75fdb690a01e2023ea7f3f17c0fb5dea77086996a");
324
-
325
- // let public_key: PublicKey = verifying_key.into();
326
- // let pubkey_affine = public_key.as_affine();
327
- // let affine_x = pubkey_affine.x();
328
-
329
- // let mut field_x: [u8; 32] = pubkey_affine.x().into();
330
- // field_x.reverse();
331
- // let x_fp = secp256r1::Fp::from_bytes(&field_x).unwrap();
332
- // println!("x_fp : {:?}", x_fp.to_bytes());
333
-
334
- // // calculate x^3 + ax + b (mod p)
335
- // let x3 = x_fp.square() * x_fp;
336
- // let ax = secp256r1::Secp256r1Affine::a() * x_fp;
337
- // let y2 = x3 + ax + secp256r1::Secp256r1Affine::b();
338
- // let y = y2.sqrt().unwrap();
339
-
340
- // //let pk = Secp256r1Affine::from_xy(x_fp, y).unwrap();
341
-
342
- // signatures.push(SignData {
343
- // signature: (r, s, 0),
344
- // pk,
345
- // msg: msg.into(),
346
- // msg_hash,
347
- // });
348
-
349
- // println!("recover y: {:?}", y);
350
- // println!("new pk : {:?}", pk);
351
- // let mut r_bytes_1 = r.to_bytes();
352
- // let mut s_bytes_1 = s.to_bytes();
353
- // r_bytes_1.reverse();
354
- // s_bytes_1.reverse();
355
-
356
- // let signature2 = Signature::from_slice([r_bytes_1, s_bytes_1].concat().as_slice())
357
- // .expect("no error");
358
- // println!(
359
- // "signature {:?} ",
360
- // signature.to_bytes(),
361
- // );
362
- // println!(
363
- // "signature2 {:?}",
364
- // signature2.to_bytes(),
365
- // );
366
-
367
- // let is_valid = verifying_key
368
- // .verify_prehash(&msg_hash_bytes, &signature2)
369
- // .is_ok();
370
- // println!("Signature is valid: {}", is_valid);
371
-
372
- // let k = LOG_TOTAL_NUM_ROWS as u32;
373
- // run::<Fr>(k, 1, vec![], signatures);
374
-
375
- // log::debug!("end of testing for msg_hash = 0");
376
- // }
377
-
378
248
// msg_hash == 0
379
249
{
380
250
log:: debug!( "testing for msg_hash = 0" ) ;
381
251
let mut signatures = Vec :: new ( ) ;
382
252
383
253
let ( sk, pk) = gen_key_pair_r1 ( & mut rng) ;
384
254
let msg = gen_msg ( & mut rng) ;
385
- let msg_hash = secp256r1:: Fq :: zero ( ) ; // 257 ok, 250 not ok
255
+ let msg_hash = secp256r1:: Fq :: zero ( ) ;
386
256
println ! ( "original pk {:?}" , pk) ;
387
257
388
258
let ( r, s, v) = sign_r1_with_rng ( & mut rng, sk, msg_hash) ;
@@ -403,30 +273,29 @@ fn p256_sign_verify() {
403
273
}
404
274
405
275
// msg_hash == 1
406
- // {
407
- // log::debug!("testing for msg_hash = 1");
408
- // let mut signatures = Vec::new();
409
-
410
- // let (sk, pk) = gen_key_pair_r1(&mut rng);
411
- // let msg = gen_msg(&mut rng);
412
- // let msg_hash = secp256r1::Fq::one();
413
- // let (r, s, v) = sign_r1_with_rng(&mut rng, sk, msg_hash);
414
- // signatures.push(SignData {
415
- // signature: (r, s, v),
416
- // pk,
417
- // msg: msg.into(),
418
- // msg_hash,
419
- // });
420
-
421
- // let k = LOG_TOTAL_NUM_ROWS as u32;
422
- // run::<Fr>(k, 1, vec![], signatures);
423
-
424
- // log::debug!("end of testing for msg_hash = 1");
425
- // }
276
+ {
277
+ log:: debug!( "testing for msg_hash = 1" ) ;
278
+ let mut signatures = Vec :: new ( ) ;
279
+
280
+ let ( sk, pk) = gen_key_pair_r1 ( & mut rng) ;
281
+ let msg = gen_msg ( & mut rng) ;
282
+ let msg_hash = secp256r1:: Fq :: one ( ) ;
283
+ let ( r, s, v) = sign_r1_with_rng ( & mut rng, sk, msg_hash) ;
284
+ signatures. push ( SignData {
285
+ signature : ( r, s, v) ,
286
+ pk,
287
+ msg : msg. into ( ) ,
288
+ msg_hash,
289
+ } ) ;
290
+
291
+ let k = LOG_TOTAL_NUM_ROWS as u32 ;
292
+ run :: < Fr > ( k, 1 , vec ! [ ] , signatures) ;
293
+
294
+ log:: debug!( "end of testing for msg_hash = 1" ) ;
295
+ }
426
296
427
297
// random msg_hash
428
- // let max_sigs = [1, 16, MAX_NUM_SIG]; // enable this line after testing
429
- let max_sigs = [ 1 ] ;
298
+ let max_sigs = [ 1 , 16 , MAX_NUM_SIG ] ;
430
299
431
300
for max_sig in max_sigs. iter ( ) {
432
301
log:: debug!( "testing for {} signatures" , max_sig) ;
@@ -440,7 +309,7 @@ fn p256_sign_verify() {
440
309
. try_into ( )
441
310
. expect ( "hash length isn't 32 bytes" ) ;
442
311
let msg_hash = secp256r1:: Fq :: from_bytes ( & msg_hash) . unwrap ( ) ;
443
- //let msg_hash = secp256r1::Fq::one();
312
+
444
313
let ( r, s, v) = sign_r1_with_rng ( & mut rng, sk, msg_hash) ;
445
314
signatures. push ( SignData {
446
315
signature : ( r, s, v) ,
@@ -457,6 +326,106 @@ fn p256_sign_verify() {
457
326
}
458
327
}
459
328
329
+ // TODO: this test fail due to signature/pubkey representation(sec1 encoding/compress etc)
330
+ // need to decode correct bytes and re-construct signature/pubkey for testing
331
+ // test rust p256 crate apis: sign & verify
332
+ // #[test]
333
+ // fn p256_crate_sig_verify() {
334
+ // use super::utils::LOG_TOTAL_NUM_ROWS;
335
+ // use crate::sig_circuit::utils::MAX_NUM_SIG;
336
+ // use halo2_proofs::halo2curves::bn256::Fr;
337
+ // use p256::ecdsa::signature::hazmat::{PrehashSigner, PrehashVerifier};
338
+ // use p256::ecdsa::{
339
+ // signature::Signer, signature::Verifier, Signature, SigningKey, VerifyingKey,
340
+ // };
341
+ // use rand::SeedableRng;
342
+ // use rand_xorshift::XorShiftRng;
343
+ // use sha3::{Digest, Keccak256};
344
+ // use ff::FromUniformBytes;
345
+ // use ff::PrimeField;
346
+ // use halo2_proofs::arithmetic::CurveAffine;
347
+ // use halo2_proofs::halo2curves::group::GroupEncoding;
348
+ // use halo2_proofs::halo2curves::serde::SerdeObject;
349
+ // use p256::elliptic_curve::point::AffineCoordinates;
350
+ // use p256::pkcs8::EncodePublicKey;
351
+ // use p256::PublicKey;
352
+
353
+ // let mut rng = XorShiftRng::seed_from_u64(10000);
354
+
355
+ // // p256 crate generate signature
356
+ // {
357
+ // let mut signatures = Vec::new();
358
+ // let msg = gen_msg(&mut rng);
359
+
360
+ // let msg_hash_bytes: [u8; 32] = Keccak256::digest(&msg)
361
+ // .as_slice()
362
+ // .to_vec()
363
+ // .try_into()
364
+ // .expect("hash length isn't 32 bytes");
365
+ // let msg_hash = secp256r1::Fq::from_bytes(&msg_hash_bytes).unwrap();
366
+ // let (sk, pk) = gen_key_pair_r1(&mut rng);
367
+ // println!("sk_fq raw bytes {:?}", sk.to_raw_bytes());
368
+
369
+ // let signing_key = SigningKey::from_slice(&sk.to_raw_bytes()).expect("get private from sk");
370
+ // println!("signing_key = {:?}", signing_key.to_bytes());
371
+ // let verifying_key = signing_key.verifying_key();
372
+ // // let vk= verifying_key.to_encoded_point(false);
373
+ // println!("verifying_key = {:?}", verifying_key);
374
+
375
+ // let signature: Signature = signing_key
376
+ // .sign_prehash(&msg_hash_bytes)
377
+ // .expect("sign failed");
378
+ // let sig_bytes = signature.to_bytes();
379
+ // let mut sig_r_bytes: [u8; 32] = sig_bytes[..32].try_into().expect("failed ");
380
+ // let mut sig_s_bytes: [u8; 32] = sig_bytes[32..64].try_into().expect("failed ");
381
+ // let r = secp256r1::Fq::from_raw_bytes(&sig_r_bytes).unwrap();
382
+ // let s = secp256r1::Fq::from_raw_bytes(&sig_s_bytes).unwrap();
383
+ // // hack: custom pk
384
+
385
+ // let public_key: PublicKey = verifying_key.into();
386
+ // let pubkey_affine = public_key.as_affine();
387
+ // let affine_x = pubkey_affine.x();
388
+
389
+ // let mut field_x: [u8; 32] = pubkey_affine.x().into();
390
+ // let x_fp = secp256r1::Fp::from_raw_bytes_unchecked(&field_x);
391
+ // // println!("x_fp : {:?}", x_fp.to_bytes());
392
+ // // can not get y from pubkey_affine direclty.
393
+ // // calculate x^3 + ax + b (mod p)
394
+ // let x3 = x_fp.square() * x_fp;
395
+ // let ax = secp256r1::Secp256r1Affine::a() * x_fp;
396
+ // let y2 = x3 + ax + secp256r1::Secp256r1Affine::b();
397
+ // // check if need negative form
398
+ // let y = y2.sqrt().unwrap();
399
+
400
+ // let pk = Secp256r1Affine::from_xy(x_fp, y).unwrap();
401
+
402
+ // signatures.push(SignData {
403
+ // signature: (r, s, 0),
404
+ // pk,
405
+ // msg: msg.into(),
406
+ // msg_hash,
407
+ // });
408
+
409
+ // let mut r_bytes_1 = r.to_bytes();
410
+ // let mut s_bytes_1 = s.to_bytes();
411
+ // r_bytes_1.reverse();
412
+ // s_bytes_1.reverse();
413
+
414
+ // let signature2 = Signature::from_slice([r_bytes_1, s_bytes_1].concat().as_slice())
415
+ // .expect("no error");
416
+
417
+ // let is_valid = verifying_key
418
+ // .verify_prehash(&msg_hash_bytes, &signature2)
419
+ // .is_ok();
420
+ // println!("Signature is valid: {}", is_valid);
421
+
422
+ // let k = LOG_TOTAL_NUM_ROWS as u32;
423
+ // run::<Fr>(k, 1, vec![], signatures);
424
+
425
+ // log::debug!("end of testing for msg_hash = 0");
426
+ // }
427
+ // }
428
+
460
429
// test for both secp256k1 and secp256r1 signatures
461
430
#[ test]
462
431
fn sign_verify ( ) {
0 commit comments