Skip to content

Commit ac7c74a

Browse files
committed
Merge #755: Use Into<Message> in signing api
ec0a69f Use Into<Message> in signing api (Liam Aharon) Pull request description: Closes #700 (also see rust-bitcoin/rust-bitcoin#2821). Unrelated question while I have the authors attention: the schnorr apis (e.g. https://github.com/liamaharon/rust-secp256k1/blob/9afbf5111113ce84ff6f3b52f37c60554af2c283/secp256k1-sys/src/lib.rs#L81-L82) accepts a param named `msg32`, then directly after `msg_len`. I find it confusing since I would assume from the name `msg32` it must be 32 bytes. Should those instances be renamed `msg` if it is indeed variable len? ACKs for top commit: tcharding: ACK ec0a69f apoelstra: ACK ec0a69f; successfully ran local tests; I wonder if we should do the same thing with SecretKey Tree-SHA512: 2c3d9987d41f15ac91b0a77595b4d238cd52d9484a461f7541b2fd2e03b86f908ae7b34c76c1239501eb67246ba336161be1c6ae41d7f84122e9c003a3ade7d8
2 parents 36be55f + ec0a69f commit ac7c74a

File tree

7 files changed

+99
-92
lines changed

7 files changed

+99
-92
lines changed

examples/sign_verify.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn verify<C: Verification>(
1515
let sig = ecdsa::Signature::from_compact(&sig)?;
1616
let pubkey = PublicKey::from_slice(&pubkey)?;
1717

18-
Ok(secp.verify_ecdsa(&msg, &sig, &pubkey).is_ok())
18+
Ok(secp.verify_ecdsa(msg, &sig, &pubkey).is_ok())
1919
}
2020

2121
fn sign<C: Signing>(
@@ -26,7 +26,7 @@ fn sign<C: Signing>(
2626
let msg = sha256::Hash::hash(msg);
2727
let msg = Message::from_digest_slice(msg.as_ref())?;
2828
let seckey = SecretKey::from_slice(&seckey)?;
29-
Ok(secp.sign_ecdsa(&msg, &seckey))
29+
Ok(secp.sign_ecdsa(msg, &seckey))
3030
}
3131

3232
fn main() {

examples/sign_verify_recovery.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn recover<C: Verification>(
1515
let id = ecdsa::RecoveryId::try_from(i32::from(recovery_id))?;
1616
let sig = ecdsa::RecoverableSignature::from_compact(&sig, id)?;
1717

18-
secp.recover_ecdsa(&msg, &sig)
18+
secp.recover_ecdsa(msg, &sig)
1919
}
2020

2121
fn sign_recovery<C: Signing>(
@@ -26,7 +26,7 @@ fn sign_recovery<C: Signing>(
2626
let msg = sha256::Hash::hash(msg);
2727
let msg = Message::from_digest_slice(msg.as_ref())?;
2828
let seckey = SecretKey::from_slice(&seckey)?;
29-
Ok(secp.sign_ecdsa_recoverable(&msg, &seckey))
29+
Ok(secp.sign_ecdsa_recoverable(msg, &seckey))
3030
}
3131

3232
fn main() {

no_std_test/src/main.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ fn start(_argc: isize, _argv: *const *const u8) -> isize {
9494
let public_key = PublicKey::from_secret_key(&secp, &secret_key);
9595
let message = Message::from_digest_slice(&[0xab; 32]).expect("32 bytes");
9696

97-
let sig = secp.sign_ecdsa(&message, &secret_key);
98-
assert!(secp.verify_ecdsa(&message, &sig, &public_key).is_ok());
97+
let sig = secp.sign_ecdsa(message, &secret_key);
98+
assert!(secp.verify_ecdsa(message, &sig, &public_key).is_ok());
9999

100-
let rec_sig = secp.sign_ecdsa_recoverable(&message, &secret_key);
101-
assert!(secp.verify_ecdsa(&message, &rec_sig.to_standard(), &public_key).is_ok());
102-
assert_eq!(public_key, secp.recover_ecdsa(&message, &rec_sig).unwrap());
100+
let rec_sig = secp.sign_ecdsa_recoverable(message, &secret_key);
101+
assert!(secp.verify_ecdsa(message, &rec_sig.to_standard(), &public_key).is_ok());
102+
assert_eq!(public_key, secp.recover_ecdsa(message, &rec_sig).unwrap());
103103
let (rec_id, data) = rec_sig.serialize_compact();
104104
let new_rec_sig = ecdsa::RecoverableSignature::from_compact(&data, rec_id).unwrap();
105105
assert_eq!(rec_sig, new_rec_sig);
@@ -121,8 +121,8 @@ fn start(_argc: isize, _argv: *const *const u8) -> isize {
121121
let public_key = PublicKey::from_secret_key(&secp_alloc, &secret_key);
122122
let message = Message::from_digest_slice(&[0xab; 32]).expect("32 bytes");
123123

124-
let sig = secp_alloc.sign_ecdsa(&message, &secret_key);
125-
assert!(secp_alloc.verify_ecdsa(&message, &sig, &public_key).is_ok());
124+
let sig = secp_alloc.sign_ecdsa(message, &secret_key);
125+
assert!(secp_alloc.verify_ecdsa(message, &sig, &public_key).is_ok());
126126
unsafe { libc::printf("Verified alloc Successfully!\n\0".as_ptr() as _) };
127127
}
128128

src/ecdsa/mod.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ impl Signature {
194194
/// The signature must be normalized or verification will fail (see [`Signature::normalize_s`]).
195195
#[inline]
196196
#[cfg(feature = "global-context")]
197-
pub fn verify(&self, msg: &Message, pk: &PublicKey) -> Result<(), Error> {
197+
pub fn verify(&self, msg: impl Into<Message>, pk: &PublicKey) -> Result<(), Error> {
198198
SECP256K1.verify_ecdsa(msg, self, pk)
199199
}
200200
}
@@ -243,10 +243,11 @@ impl<'de> serde::Deserialize<'de> for Signature {
243243
impl<C: Signing> Secp256k1<C> {
244244
fn sign_ecdsa_with_noncedata_pointer(
245245
&self,
246-
msg: &Message,
246+
msg: impl Into<Message>,
247247
sk: &SecretKey,
248248
noncedata: Option<&[u8; 32]>,
249249
) -> Signature {
250+
let msg = msg.into();
250251
unsafe {
251252
let mut ret = ffi::Signature::new();
252253
let noncedata_ptr = match noncedata {
@@ -272,7 +273,7 @@ impl<C: Signing> Secp256k1<C> {
272273

273274
/// Constructs a signature for `msg` using the secret key `sk` and RFC6979 nonce
274275
/// Requires a signing-capable context.
275-
pub fn sign_ecdsa(&self, msg: &Message, sk: &SecretKey) -> Signature {
276+
pub fn sign_ecdsa(&self, msg: impl Into<Message>, sk: &SecretKey) -> Signature {
276277
self.sign_ecdsa_with_noncedata_pointer(msg, sk, None)
277278
}
278279

@@ -283,7 +284,7 @@ impl<C: Signing> Secp256k1<C> {
283284
/// Requires a signing-capable context.
284285
pub fn sign_ecdsa_with_noncedata(
285286
&self,
286-
msg: &Message,
287+
msg: impl Into<Message>,
287288
sk: &SecretKey,
288289
noncedata: &[u8; 32],
289290
) -> Signature {
@@ -292,13 +293,14 @@ impl<C: Signing> Secp256k1<C> {
292293

293294
fn sign_grind_with_check(
294295
&self,
295-
msg: &Message,
296+
msg: impl Into<Message>,
296297
sk: &SecretKey,
297298
check: impl Fn(&ffi::Signature) -> bool,
298299
) -> Signature {
299300
let mut entropy_p: *const ffi::types::c_void = ptr::null();
300301
let mut counter: u32 = 0;
301302
let mut extra_entropy = [0u8; 32];
303+
let msg = msg.into();
302304
loop {
303305
unsafe {
304306
let mut ret = ffi::Signature::new();
@@ -338,7 +340,7 @@ impl<C: Signing> Secp256k1<C> {
338340
/// Requires a signing capable context.
339341
pub fn sign_ecdsa_grind_r(
340342
&self,
341-
msg: &Message,
343+
msg: impl Into<Message>,
342344
sk: &SecretKey,
343345
bytes_to_grind: usize,
344346
) -> Signature {
@@ -352,7 +354,7 @@ impl<C: Signing> Secp256k1<C> {
352354
/// signature implementation of bitcoin core. In average, this function
353355
/// will perform two signing operations.
354356
/// Requires a signing capable context.
355-
pub fn sign_ecdsa_low_r(&self, msg: &Message, sk: &SecretKey) -> Signature {
357+
pub fn sign_ecdsa_low_r(&self, msg: impl Into<Message>, sk: &SecretKey) -> Signature {
356358
self.sign_grind_with_check(msg, sk, compact_sig_has_zero_first_bit)
357359
}
358360
}
@@ -372,20 +374,21 @@ impl<C: Verification> Secp256k1<C> {
372374
/// # let (secret_key, public_key) = secp.generate_keypair(&mut rand::thread_rng());
373375
/// #
374376
/// let message = Message::from_digest_slice(&[0xab; 32]).expect("32 bytes");
375-
/// let sig = secp.sign_ecdsa(&message, &secret_key);
376-
/// assert_eq!(secp.verify_ecdsa(&message, &sig, &public_key), Ok(()));
377+
/// let sig = secp.sign_ecdsa(message, &secret_key);
378+
/// assert_eq!(secp.verify_ecdsa(message, &sig, &public_key), Ok(()));
377379
///
378380
/// let message = Message::from_digest_slice(&[0xcd; 32]).expect("32 bytes");
379-
/// assert_eq!(secp.verify_ecdsa(&message, &sig, &public_key), Err(Error::IncorrectSignature));
381+
/// assert_eq!(secp.verify_ecdsa(message, &sig, &public_key), Err(Error::IncorrectSignature));
380382
/// # }
381383
/// ```
382384
#[inline]
383385
pub fn verify_ecdsa(
384386
&self,
385-
msg: &Message,
387+
msg: impl Into<Message>,
386388
sig: &Signature,
387389
pk: &PublicKey,
388390
) -> Result<(), Error> {
391+
let msg = msg.into();
389392
unsafe {
390393
if ffi::secp256k1_ecdsa_verify(
391394
self.ctx.as_ptr(),

src/ecdsa/recovery.rs

+24-22
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl RecoverableSignature {
133133
/// verify-capable context.
134134
#[inline]
135135
#[cfg(feature = "global-context")]
136-
pub fn recover(&self, msg: &Message) -> Result<key::PublicKey, Error> {
136+
pub fn recover(&self, msg: impl Into<Message>) -> Result<key::PublicKey, Error> {
137137
crate::SECP256K1.recover_ecdsa(msg, self)
138138
}
139139
}
@@ -154,10 +154,11 @@ impl From<ffi::RecoverableSignature> for RecoverableSignature {
154154
impl<C: Signing> Secp256k1<C> {
155155
fn sign_ecdsa_recoverable_with_noncedata_pointer(
156156
&self,
157-
msg: &Message,
157+
msg: impl Into<Message>,
158158
sk: &key::SecretKey,
159159
noncedata_ptr: *const super_ffi::types::c_void,
160160
) -> RecoverableSignature {
161+
let msg = msg.into();
161162
let mut ret = ffi::RecoverableSignature::new();
162163
unsafe {
163164
// We can assume the return value because it's not possible to construct
@@ -182,7 +183,7 @@ impl<C: Signing> Secp256k1<C> {
182183
/// Requires a signing-capable context.
183184
pub fn sign_ecdsa_recoverable(
184185
&self,
185-
msg: &Message,
186+
msg: impl Into<Message>,
186187
sk: &key::SecretKey,
187188
) -> RecoverableSignature {
188189
self.sign_ecdsa_recoverable_with_noncedata_pointer(msg, sk, ptr::null())
@@ -195,7 +196,7 @@ impl<C: Signing> Secp256k1<C> {
195196
/// Requires a signing-capable context.
196197
pub fn sign_ecdsa_recoverable_with_noncedata(
197198
&self,
198-
msg: &Message,
199+
msg: impl Into<Message>,
199200
sk: &key::SecretKey,
200201
noncedata: &[u8; 32],
201202
) -> RecoverableSignature {
@@ -209,9 +210,10 @@ impl<C: Verification> Secp256k1<C> {
209210
/// `msg`. Requires a verify-capable context.
210211
pub fn recover_ecdsa(
211212
&self,
212-
msg: &Message,
213+
msg: impl Into<Message>,
213214
sig: &RecoverableSignature,
214215
) -> Result<key::PublicKey, Error> {
216+
let msg = msg.into();
215217
unsafe {
216218
let mut pk = super_ffi::PublicKey::new();
217219
if ffi::secp256k1_ecdsa_recover(
@@ -252,15 +254,15 @@ mod tests {
252254
let (sk, pk) = full.generate_keypair(&mut rand::thread_rng());
253255

254256
// Try signing
255-
assert_eq!(sign.sign_ecdsa_recoverable(&msg, &sk), full.sign_ecdsa_recoverable(&msg, &sk));
256-
let sigr = full.sign_ecdsa_recoverable(&msg, &sk);
257+
assert_eq!(sign.sign_ecdsa_recoverable(msg, &sk), full.sign_ecdsa_recoverable(msg, &sk));
258+
let sigr = full.sign_ecdsa_recoverable(msg, &sk);
257259

258260
// Try pk recovery
259-
assert!(vrfy.recover_ecdsa(&msg, &sigr).is_ok());
260-
assert!(full.recover_ecdsa(&msg, &sigr).is_ok());
261+
assert!(vrfy.recover_ecdsa(msg, &sigr).is_ok());
262+
assert!(full.recover_ecdsa(msg, &sigr).is_ok());
261263

262-
assert_eq!(vrfy.recover_ecdsa(&msg, &sigr), full.recover_ecdsa(&msg, &sigr));
263-
assert_eq!(full.recover_ecdsa(&msg, &sigr), Ok(pk));
264+
assert_eq!(vrfy.recover_ecdsa(msg, &sigr), full.recover_ecdsa(msg, &sigr));
265+
assert_eq!(full.recover_ecdsa(msg, &sigr), Ok(pk));
264266
}
265267

266268
#[test]
@@ -280,7 +282,7 @@ mod tests {
280282
let sk = SecretKey::from_slice(&ONE).unwrap();
281283
let msg = Message::from_digest_slice(&ONE).unwrap();
282284

283-
let sig = s.sign_ecdsa_recoverable(&msg, &sk);
285+
let sig = s.sign_ecdsa_recoverable(msg, &sk);
284286

285287
assert_eq!(Ok(sig), RecoverableSignature::from_compact(&[
286288
0x66, 0x73, 0xff, 0xad, 0x21, 0x47, 0x74, 0x1f,
@@ -306,7 +308,7 @@ mod tests {
306308
let msg = Message::from_digest_slice(&ONE).unwrap();
307309
let noncedata = [42u8; 32];
308310

309-
let sig = s.sign_ecdsa_recoverable_with_noncedata(&msg, &sk, &noncedata);
311+
let sig = s.sign_ecdsa_recoverable_with_noncedata(msg, &sk, &noncedata);
310312

311313
assert_eq!(Ok(sig), RecoverableSignature::from_compact(&[
312314
0xb5, 0x0b, 0xb6, 0x79, 0x5f, 0x31, 0x74, 0x8a,
@@ -331,14 +333,14 @@ mod tests {
331333

332334
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
333335

334-
let sigr = s.sign_ecdsa_recoverable(&msg, &sk);
336+
let sigr = s.sign_ecdsa_recoverable(msg, &sk);
335337
let sig = sigr.to_standard();
336338

337339
let msg = crate::random_32_bytes(&mut rand::thread_rng());
338340
let msg = Message::from_digest_slice(&msg).unwrap();
339-
assert_eq!(s.verify_ecdsa(&msg, &sig, &pk), Err(Error::IncorrectSignature));
341+
assert_eq!(s.verify_ecdsa(msg, &sig, &pk), Err(Error::IncorrectSignature));
340342

341-
let recovered_key = s.recover_ecdsa(&msg, &sigr).unwrap();
343+
let recovered_key = s.recover_ecdsa(msg, &sigr).unwrap();
342344
assert!(recovered_key != pk);
343345
}
344346

@@ -353,9 +355,9 @@ mod tests {
353355

354356
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
355357

356-
let sig = s.sign_ecdsa_recoverable(&msg, &sk);
358+
let sig = s.sign_ecdsa_recoverable(msg, &sk);
357359

358-
assert_eq!(s.recover_ecdsa(&msg, &sig), Ok(pk));
360+
assert_eq!(s.recover_ecdsa(msg, &sig), Ok(pk));
359361
}
360362

361363
#[test]
@@ -371,9 +373,9 @@ mod tests {
371373

372374
let (sk, pk) = s.generate_keypair(&mut rand::thread_rng());
373375

374-
let sig = s.sign_ecdsa_recoverable_with_noncedata(&msg, &sk, &noncedata);
376+
let sig = s.sign_ecdsa_recoverable_with_noncedata(msg, &sk, &noncedata);
375377

376-
assert_eq!(s.recover_ecdsa(&msg, &sig), Ok(pk));
378+
assert_eq!(s.recover_ecdsa(msg, &sig), Ok(pk));
377379
}
378380

379381
#[test]
@@ -386,10 +388,10 @@ mod tests {
386388

387389
// Zero is not a valid sig
388390
let sig = RecoverableSignature::from_compact(&[0; 64], RecoveryId::Zero).unwrap();
389-
assert_eq!(s.recover_ecdsa(&msg, &sig), Err(Error::InvalidSignature));
391+
assert_eq!(s.recover_ecdsa(msg, &sig), Err(Error::InvalidSignature));
390392
// ...but 111..111 is
391393
let sig = RecoverableSignature::from_compact(&[1; 64], RecoveryId::Zero).unwrap();
392-
assert!(s.recover_ecdsa(&msg, &sig).is_ok());
394+
assert!(s.recover_ecdsa(msg, &sig).is_ok());
393395
}
394396

395397
#[test]

src/key.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,9 @@ impl SecretKey {
338338
/// Constructs an ECDSA signature for `msg` using the global [`SECP256K1`] context.
339339
#[inline]
340340
#[cfg(feature = "global-context")]
341-
pub fn sign_ecdsa(&self, msg: Message) -> ecdsa::Signature { SECP256K1.sign_ecdsa(&msg, self) }
341+
pub fn sign_ecdsa(&self, msg: impl Into<Message>) -> ecdsa::Signature {
342+
SECP256K1.sign_ecdsa(msg, self)
343+
}
342344

343345
/// Returns the [`Keypair`] for this [`SecretKey`].
344346
///
@@ -737,7 +739,7 @@ impl PublicKey {
737739
pub fn verify<C: Verification>(
738740
&self,
739741
secp: &Secp256k1<C>,
740-
msg: &Message,
742+
msg: impl Into<Message>,
741743
sig: &ecdsa::Signature,
742744
) -> Result<(), Error> {
743745
secp.verify_ecdsa(msg, sig, self)

0 commit comments

Comments
 (0)