|
1 | 1 | #[cfg(test)]
|
2 |
| -use secp256k1::{Message, PublicKey, Secp256k1}; |
| 2 | +mod tests { |
| 3 | + use secp256k1::{Message, PublicKey, Secp256k1}; |
| 4 | + |
| 5 | + #[sp1_test::sp1_test("secp256k1_recover", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD], prove)] |
| 6 | + fn test_recover_rand_lte_100( |
| 7 | + stdin: &mut sp1_sdk::SP1Stdin, |
| 8 | + ) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 9 | + recover_rand_lte_100(stdin) |
| 10 | + } |
3 | 11 |
|
4 |
| -#[sp1_test::sp1_test("secp256k1_recover", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD])] |
5 |
| -fn test_recover_rand_lte_100( |
6 |
| - stdin: &mut sp1_sdk::SP1Stdin, |
7 |
| -) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
8 |
| - let times = 100_u8; |
| 12 | + #[sp1_test::sp1_test("secp256k1_recover_v0_30_0", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD], prove)] |
| 13 | + fn test_recover_v0_30_0_rand_lte_100( |
| 14 | + stdin: &mut sp1_sdk::SP1Stdin, |
| 15 | + ) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 16 | + recover_rand_lte_100(stdin) |
| 17 | + } |
9 | 18 |
|
10 |
| - stdin.write(×); |
| 19 | + fn recover_rand_lte_100( |
| 20 | + stdin: &mut sp1_sdk::SP1Stdin, |
| 21 | + ) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 22 | + let times = 100_u8; |
11 | 23 |
|
12 |
| - let secp = Secp256k1::new(); |
| 24 | + stdin.write(×); |
13 | 25 |
|
14 |
| - let mut pubkeys = Vec::with_capacity(times.into()); |
15 |
| - for _ in 0..times { |
16 |
| - let mut rng = rand::thread_rng(); |
17 |
| - let (secret, public) = secp.generate_keypair(&mut rng); |
| 26 | + let secp = Secp256k1::new(); |
18 | 27 |
|
19 |
| - pubkeys.push(public); |
| 28 | + let mut pubkeys = Vec::with_capacity(times.into()); |
| 29 | + for _ in 0..times { |
| 30 | + let mut rng = rand::thread_rng(); |
| 31 | + let (secret, public) = secp.generate_keypair(&mut rng); |
20 | 32 |
|
21 |
| - let msg = rand::random::<[u8; 32]>(); |
22 |
| - let msg = Message::from_digest_slice(&msg).unwrap(); |
| 33 | + pubkeys.push(public); |
23 | 34 |
|
24 |
| - let signature = secp.sign_ecdsa_recoverable(&msg, &secret); |
| 35 | + let msg = rand::random::<[u8; 32]>(); |
| 36 | + let msg = Message::from_digest_slice(&msg).unwrap(); |
25 | 37 |
|
26 |
| - // Verify that the unpatched version of this function recovers as expected. |
27 |
| - assert_eq!(secp.recover_ecdsa(&msg, &signature).unwrap(), public); |
| 38 | + let signature = secp.sign_ecdsa_recoverable(&msg, &secret); |
28 | 39 |
|
29 |
| - let (recid, sig) = signature.serialize_compact(); |
| 40 | + // Verify that the unpatched version of this function recovers as expected. |
| 41 | + assert_eq!(secp.recover_ecdsa(&msg, &signature).unwrap(), public); |
30 | 42 |
|
31 |
| - let recid = recid.to_i32(); |
| 43 | + let (recid, sig) = signature.serialize_compact(); |
32 | 44 |
|
33 |
| - stdin.write(&recid); |
34 |
| - stdin.write(msg.as_ref()); |
35 |
| - stdin.write_slice(sig.as_slice()); |
36 |
| - } |
| 45 | + let recid = recid.to_i32(); |
37 | 46 |
|
38 |
| - move |mut public| { |
39 |
| - println!("checking publioc values"); |
40 |
| - for key in pubkeys { |
41 |
| - assert_eq!(public.read::<Option<PublicKey>>(), Some(key)); |
| 47 | + stdin.write(&recid); |
| 48 | + stdin.write(msg.as_ref()); |
| 49 | + stdin.write_slice(sig.as_slice()); |
| 50 | + } |
| 51 | + |
| 52 | + move |mut public| { |
| 53 | + println!("checking public values"); |
| 54 | + for key in pubkeys { |
| 55 | + assert_eq!(public.read::<Option<PublicKey>>(), Some(key)); |
| 56 | + } |
42 | 57 | }
|
43 | 58 | }
|
44 |
| -} |
45 | 59 |
|
46 |
| -#[sp1_test::sp1_test("secp256k1_verify", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD])] |
47 |
| -fn test_verify_rand_lte_100( |
48 |
| - stdin: &mut sp1_sdk::SP1Stdin, |
49 |
| -) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
50 |
| - let times = 100_u8; |
51 |
| - stdin.write(×); |
| 60 | + #[sp1_test::sp1_test("secp256k1_verify", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD], prove)] |
| 61 | + fn test_verify_rand_lte_100( |
| 62 | + stdin: &mut sp1_sdk::SP1Stdin, |
| 63 | + ) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 64 | + verify_rand_lte_100(stdin) |
| 65 | + } |
| 66 | + |
| 67 | + #[sp1_test::sp1_test("secp256k1_verify_v0_30_0", syscalls = [SECP256K1_DOUBLE, SECP256K1_ADD], prove)] |
| 68 | + fn test_verify_v0_30_0_rand_lte_100( |
| 69 | + stdin: &mut sp1_sdk::SP1Stdin, |
| 70 | + ) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 71 | + verify_rand_lte_100(stdin) |
| 72 | + } |
52 | 73 |
|
53 |
| - let secp = Secp256k1::new(); |
| 74 | + fn verify_rand_lte_100(stdin: &mut sp1_sdk::SP1Stdin) -> impl FnOnce(sp1_sdk::SP1PublicValues) { |
| 75 | + let times = 100_u8; |
| 76 | + stdin.write(×); |
54 | 77 |
|
55 |
| - for _ in 0..times { |
56 |
| - let mut rng = rand::thread_rng(); |
57 |
| - let (secret, public) = secp.generate_keypair(&mut rng); |
| 78 | + let secp = Secp256k1::new(); |
58 | 79 |
|
59 |
| - let msg = rand::random::<[u8; 32]>(); |
60 |
| - let msg = Message::from_digest_slice(&msg).unwrap(); |
| 80 | + for _ in 0..times { |
| 81 | + let mut rng = rand::thread_rng(); |
| 82 | + let (secret, public) = secp.generate_keypair(&mut rng); |
61 | 83 |
|
62 |
| - let signature = secp.sign_ecdsa(&msg, &secret); |
| 84 | + let msg = rand::random::<[u8; 32]>(); |
| 85 | + let msg = Message::from_digest_slice(&msg).unwrap(); |
63 | 86 |
|
64 |
| - // verify the unpatched version of the function verifies as expected |
65 |
| - assert!(secp.verify_ecdsa(&msg, &signature, &public).is_ok()); |
| 87 | + let signature = secp.sign_ecdsa(&msg, &secret); |
66 | 88 |
|
67 |
| - let msg = msg.as_ref().to_vec(); |
68 |
| - let signature = signature.serialize_der().to_vec(); |
| 89 | + // verify the unpatched version of the function verifies as expected |
| 90 | + assert!(secp.verify_ecdsa(&msg, &signature, &public).is_ok()); |
69 | 91 |
|
70 |
| - stdin.write_vec(msg); |
71 |
| - stdin.write_vec(signature); |
72 |
| - stdin.write(&public); |
73 |
| - } |
| 92 | + let msg = msg.as_ref().to_vec(); |
| 93 | + let signature = signature.serialize_der().to_vec(); |
74 | 94 |
|
75 |
| - move |mut public| { |
76 |
| - for _ in 0..times { |
77 |
| - assert!(public.read::<bool>()); |
| 95 | + stdin.write_vec(msg); |
| 96 | + stdin.write_vec(signature); |
| 97 | + stdin.write(&public); |
| 98 | + } |
| 99 | + |
| 100 | + move |mut public| { |
| 101 | + for _ in 0..times { |
| 102 | + assert!(public.read::<bool>()); |
| 103 | + } |
78 | 104 | }
|
79 | 105 | }
|
80 | 106 | }
|
81 |
| - |
82 | 107 | // add cases for fail verify, although its not patched
|
0 commit comments