Skip to content

Commit 19cfe16

Browse files
committed
recovery: rewrite API to not use context objects
This API is basically unused except for some niche or legacy applications, so I feel comfortable breaking it pretty dramatically. Move all the Secp256k1 functions onto RecoverableSignature and use self/Self as appropriate. Leave the stupid ecdsa_recoverable names even though they are even more redundant, because this module is basically in maintenance mode. We only do these changes since we'll be forced to once we drop the Secp256k1 object.
1 parent 4f600db commit 19cfe16

File tree

4 files changed

+80
-130
lines changed

4 files changed

+80
-130
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ unexpected_cfgs = { level = "deny", check-cfg = ['cfg(bench)', 'cfg(secp256k1_fu
5757

5858
[[example]]
5959
name = "sign_verify_recovery"
60-
required-features = ["recovery", "std"]
60+
required-features = ["recovery"]
6161

6262
[[example]]
6363
name = "sign_verify"

examples/sign_verify_recovery.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,25 @@
11
extern crate secp256k1;
22

3-
use secp256k1::{ecdsa, Error, Message, PublicKey, Secp256k1, SecretKey, Signing, Verification};
3+
use secp256k1::{ecdsa, Error, Message, PublicKey, SecretKey};
44

5-
fn recover<C: Verification>(
6-
secp: &Secp256k1<C>,
7-
msg_digest: [u8; 32],
8-
sig: [u8; 64],
9-
recovery_id: u8,
10-
) -> Result<PublicKey, Error> {
11-
let msg = Message::from_digest(msg_digest);
5+
fn recover(msg_digest: [u8; 32], sig: [u8; 64], recovery_id: u8) -> Result<PublicKey, Error> {
126
let id = ecdsa::RecoveryId::try_from(i32::from(recovery_id))?;
137
let sig = ecdsa::RecoverableSignature::from_compact(&sig, id)?;
8+
let msg = Message::from_digest(msg_digest);
149

15-
secp.recover_ecdsa(msg, &sig)
10+
sig.recover_ecdsa(msg)
1611
}
1712

18-
fn sign_recovery<C: Signing>(
19-
secp: &Secp256k1<C>,
13+
fn sign_recovery(
2014
msg_digest: [u8; 32],
2115
seckey: [u8; 32],
2216
) -> Result<ecdsa::RecoverableSignature, Error> {
2317
let msg = Message::from_digest(msg_digest);
2418
let seckey = SecretKey::from_byte_array(seckey)?;
25-
Ok(secp.sign_ecdsa_recoverable(msg, &seckey))
19+
Ok(ecdsa::RecoverableSignature::sign_ecdsa_recoverable(msg, &seckey))
2620
}
2721

2822
fn main() {
29-
let secp = Secp256k1::new();
30-
3123
let seckey = [
3224
59, 148, 11, 85, 134, 130, 61, 253, 2, 174, 59, 70, 27, 180, 51, 107, 94, 203, 174, 253,
3325
102, 39, 170, 146, 46, 252, 4, 143, 236, 12, 136, 28,
@@ -39,9 +31,9 @@ fn main() {
3931
.unwrap();
4032
let msg_digest = *b"this must be secure hash output.";
4133

42-
let signature = sign_recovery(&secp, msg_digest, seckey).unwrap();
34+
let signature = sign_recovery(msg_digest, seckey).unwrap();
4335

4436
let (recovery_id, serialize_sig) = signature.serialize_compact();
4537

46-
assert_eq!(recover(&secp, msg_digest, serialize_sig, recovery_id.to_u8()), Ok(pubkey));
38+
assert_eq!(recover(msg_digest, serialize_sig, recovery_id.to_u8()), Ok(pubkey));
4739
}

no_std_test/src/main.rs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,18 @@ use core::panic::PanicInfo;
5151

5252
use secp256k1::ecdh::{self, SharedSecret};
5353
use secp256k1::ffi::types::AlignedType;
54-
use secp256k1::rand::{self, RngCore};
54+
use secp256k1::rand::RngCore;
5555
use secp256k1::serde::Serialize;
5656
use secp256k1::*;
57-
58-
use serde_cbor::de;
5957
use serde_cbor::ser::SliceWrite;
60-
use serde_cbor::Serializer;
58+
use serde_cbor::{de, Serializer};
6159

62-
fn abort() -> ! {
63-
unsafe { libc::abort() }
64-
}
60+
fn abort() -> ! { unsafe { libc::abort() } }
6561

6662
struct FakeRng;
6763
impl RngCore for FakeRng {
68-
fn next_u32(&mut self) -> u32 {
69-
57
70-
}
71-
fn next_u64(&mut self) -> u64 {
72-
57
73-
}
64+
fn next_u32(&mut self) -> u32 { 57 }
65+
fn next_u64(&mut self) -> u64 { 57 }
7466
fn fill_bytes(&mut self, dest: &mut [u8]) {
7567
for i in dest {
7668
*i = 57;
@@ -93,9 +85,9 @@ fn start(_argc: isize, _argv: *const *const u8) -> isize {
9385
let sig = secp.sign_ecdsa(message, &secret_key);
9486
assert!(secp.verify_ecdsa(&sig, message, &public_key).is_ok());
9587

96-
let rec_sig = secp.sign_ecdsa_recoverable(message, &secret_key);
88+
let rec_sig = ecdsa::RecoverableSignature::sign_ecdsa_recoverable(message, &secret_key);
9789
assert!(secp.verify_ecdsa(&rec_sig.to_standard(), message, &public_key).is_ok());
98-
assert_eq!(public_key, secp.recover_ecdsa(message, &rec_sig).unwrap());
90+
assert_eq!(public_key, rec_sig.recover_ecdsa(message).unwrap());
9991
let (rec_id, data) = rec_sig.serialize_compact();
10092
let new_rec_sig = ecdsa::RecoverableSignature::from_compact(&data, rec_id).unwrap();
10193
assert_eq!(rec_sig, new_rec_sig);
@@ -133,12 +125,7 @@ struct Print {
133125
}
134126

135127
impl Print {
136-
pub fn new() -> Self {
137-
Self {
138-
loc: 0,
139-
buf: [0u8; 512],
140-
}
141-
}
128+
pub fn new() -> Self { Self { loc: 0, buf: [0u8; 512] } }
142129

143130
pub fn print(&self) {
144131
unsafe {

0 commit comments

Comments
 (0)