Skip to content

Commit e4c8e49

Browse files
authored
test: add secp256k1 v0.30.0 patch testing (#2234)
1 parent d0bf74c commit e4c8e49

File tree

5 files changed

+152
-67
lines changed

5 files changed

+152
-67
lines changed

patch-testing/secp256k1/build.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
use sp1_build::BuildArgs;
2+
13
fn main() {
2-
sp1_build::build_program("./program");
4+
sp1_build::build_program_with_args(
5+
"./program",
6+
BuildArgs { features: vec!["v0-29-1".to_string()], ..Default::default() },
7+
);
8+
sp1_build::build_program_with_args(
9+
"./program",
10+
BuildArgs { features: vec!["v0-30-0".to_string()], ..Default::default() },
11+
);
312
}

patch-testing/secp256k1/program/Cargo.toml

+27-1
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,41 @@ edition = "2021"
77
[[bin]]
88
name = "secp256k1_verify"
99
path = "bin/verify.rs"
10+
required-features = ["v0-29-1"]
1011

1112
[[bin]]
1213
name = "secp256k1_recover"
1314
path = "bin/recover.rs"
15+
required-features = ["v0-29-1"]
16+
17+
18+
[[bin]]
19+
name = "secp256k1_verify_v0_30_0"
20+
path = "bin/verify.rs"
21+
required-features = ["v0-30-0"]
22+
23+
[[bin]]
24+
name = "secp256k1_recover_v0_30_0"
25+
path = "bin/recover.rs"
26+
required-features = ["v0-30-0"]
1427

1528
[dependencies]
1629
sp1-zkvm = { path = "../../../crates/zkvm/entrypoint" }
1730
serde = { version = "1.0.215", features = ["derive"] }
18-
secp256k1 = { git = "https://github.com/sp1-patches/rust-secp256k1", tag = "patch-0.29.1-sp1-4.1.0", features = ["recovery", "global-context", "rand", "serde"] }
31+
secp256k1-v0-29-1 = { git = "https://github.com/sp1-patches/rust-secp256k1", package = "secp256k1", tag = "patch-0.29.1-sp1-4.1.0", features = [
32+
"recovery",
33+
"global-context",
34+
"serde",
35+
], optional = true }
36+
secp256k1-v0-30-0 = { git = "https://github.com/sp1-patches/rust-secp256k1", package = "secp256k1", tag = "patch-0.30.0-sp1-4.1.0", features = [
37+
"recovery",
38+
"global-context",
39+
"serde",
40+
], optional = true }
41+
42+
[features]
43+
v0-29-1 = ["dep:secp256k1-v0-29-1"]
44+
v0-30-0 = ["dep:secp256k1-v0-30-0"]
1945

2046
[patch.crates-io]
2147
sp1-lib = { path = "../../../crates/zkvm/lib" }

patch-testing/secp256k1/program/bin/recover.rs

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
#![no_main]
22
sp1_zkvm::entrypoint!(main);
33

4+
#[cfg(feature = "v0-29-1")]
5+
extern crate secp256k1_v0_29_1 as secp256k1;
6+
7+
#[cfg(feature = "v0-30-0")]
8+
extern crate secp256k1_v0_30_0 as secp256k1;
9+
410
use secp256k1::{
5-
ecdsa::{RecoverableSignature, RecoveryId}, PublicKey, Message, Secp256k1
11+
ecdsa::{RecoverableSignature, RecoveryId},
12+
Message, PublicKey, Secp256k1,
613
};
714

815
pub fn main() {
@@ -18,13 +25,22 @@ fn inner_recover() -> Option<PublicKey> {
1825
let recid: i32 = sp1_zkvm::io::read();
1926
let msg = sp1_zkvm::io::read_vec();
2027
let sig: [u8; 64] = sp1_zkvm::io::read_vec().try_into().unwrap();
21-
22-
let recid= RecoveryId::from_i32(recid).unwrap();
28+
29+
#[cfg(feature = "v0-29-1")]
30+
let recid = RecoveryId::from_i32(recid).unwrap();
31+
32+
#[cfg(feature = "v0-30-0")]
33+
let recid = RecoveryId::try_from(recid).unwrap();
34+
2335
let message = Message::from_digest_slice(&msg).unwrap();
24-
let sig = RecoverableSignature::from_compact(&sig, recid).unwrap();
25-
36+
let sig = RecoverableSignature::from_compact(&sig, recid).unwrap();
37+
2638
let secp = Secp256k1::new();
39+
#[cfg(feature = "v0-29-1")]
2740
let recovered = secp.recover_ecdsa(&message, &sig);
28-
41+
42+
#[cfg(feature = "v0-30-0")]
43+
let recovered = secp.recover_ecdsa(message, &sig);
44+
2945
recovered.ok()
3046
}

patch-testing/secp256k1/program/bin/verify.rs

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#![no_main]
22
sp1_zkvm::entrypoint!(main);
33

4-
use secp256k1::{
5-
ecdsa::Signature,
6-
Message, PublicKey,
7-
};
4+
#[cfg(feature = "v0-29-1")]
5+
extern crate secp256k1_v0_29_1 as secp256k1;
6+
7+
#[cfg(feature = "v0-30-0")]
8+
extern crate secp256k1_v0_30_0 as secp256k1;
9+
10+
use secp256k1::{ecdsa::Signature, Message, PublicKey};
811

912
pub fn main() {
1013
let times = sp1_zkvm::io::read::<u8>();
@@ -25,5 +28,11 @@ fn inner_verify() -> bool {
2528

2629
let secp = secp256k1::Secp256k1::new();
2730

28-
secp.verify_ecdsa(&message, &signature, &pubkey).is_ok()
31+
#[cfg(feature = "v0-29-1")]
32+
let ok = secp.verify_ecdsa(&message, &signature, &pubkey).is_ok();
33+
34+
#[cfg(feature = "v0-30-0")]
35+
let ok = secp.verify_ecdsa(message, &signature, &pubkey).is_ok();
36+
37+
ok
2938
}

patch-testing/secp256k1/src/lib.rs

+79-54
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,107 @@
11
#[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+
}
311

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+
}
918

10-
stdin.write(&times);
19+
fn recover_rand_lte_100(
20+
stdin: &mut sp1_sdk::SP1Stdin,
21+
) -> impl FnOnce(sp1_sdk::SP1PublicValues) {
22+
let times = 100_u8;
1123

12-
let secp = Secp256k1::new();
24+
stdin.write(&times);
1325

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();
1827

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);
2032

21-
let msg = rand::random::<[u8; 32]>();
22-
let msg = Message::from_digest_slice(&msg).unwrap();
33+
pubkeys.push(public);
2334

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();
2537

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);
2839

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);
3042

31-
let recid = recid.to_i32();
43+
let (recid, sig) = signature.serialize_compact();
3244

33-
stdin.write(&recid);
34-
stdin.write(msg.as_ref());
35-
stdin.write_slice(sig.as_slice());
36-
}
45+
let recid = recid.to_i32();
3746

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+
}
4257
}
4358
}
44-
}
4559

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(&times);
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+
}
5273

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(&times);
5477

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();
5879

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);
6183

62-
let signature = secp.sign_ecdsa(&msg, &secret);
84+
let msg = rand::random::<[u8; 32]>();
85+
let msg = Message::from_digest_slice(&msg).unwrap();
6386

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);
6688

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());
6991

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();
7494

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+
}
78104
}
79105
}
80106
}
81-
82107
// add cases for fail verify, although its not patched

0 commit comments

Comments
 (0)