Skip to content

Commit

Permalink
Add error type for combine keys + test and doc
Browse files Browse the repository at this point in the history
  • Loading branch information
Tibo-lg committed Jun 10, 2021
1 parent bb25ed4 commit e2e1abf
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
15 changes: 12 additions & 3 deletions src/key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
use core::{fmt, str};

use super::{from_hex, Secp256k1};
use super::Error::{self, InvalidPublicKey, InvalidSecretKey};
use super::Error::{self, InvalidPublicKey, InvalidPublicKeySum, InvalidSecretKey};
use Signing;
use Verification;
use constants;
Expand Down Expand Up @@ -395,11 +395,15 @@ impl PublicKey {

/// Adds the keys in the provided slice together, returning the sum. Returns
/// an error if the result would be the point at infinity, i.e. we are adding
/// a point to its own negation
/// a point to its own negation, or if the provided slice has no element in it.
pub fn combine_keys(keys: &[&PublicKey]) -> Result<PublicKey, Error> {
use core::mem::transmute;
use core::i32::MAX;

if keys.len() < 1 {
return Err(InvalidPublicKeySum);
}

debug_assert!(keys.len() < MAX as usize);
unsafe {
let mut ret = ffi::PublicKey::new();
Expand All @@ -414,7 +418,7 @@ impl PublicKey {
{
Ok(PublicKey(ret))
} else {
Err(InvalidPublicKey)
Err(InvalidPublicKeySum)
}
}
}
Expand Down Expand Up @@ -893,6 +897,11 @@ mod test {
assert_eq!(sum1.unwrap(), exp_sum);
}

#[cfg_attr(not(fuzzing), test)]
fn pubkey_combine_keys_empty_slice() {
assert!(PublicKey::combine_keys(&[]).is_err());
}

#[test]
fn create_pubkey_combine() {
let s = Secp256k1::new();
Expand Down
6 changes: 3 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,10 +527,10 @@ pub enum Error {
InvalidRecoveryId,
/// Invalid tweak for add_*_assign or mul_*_assign
InvalidTweak,
/// `tweak_add_check` failed on an xonly public key
TweakCheckFailed,
/// Didn't pass enough memory to context creation with preallocated memory
NotEnoughMemory,
/// Bad set of public keys
InvalidPublicKeySum,
}

impl Error {
Expand All @@ -543,8 +543,8 @@ impl Error {
Error::InvalidSecretKey => "secp: malformed or out-of-range secret key",
Error::InvalidRecoveryId => "secp: bad recovery id",
Error::InvalidTweak => "secp: bad tweak",
Error::TweakCheckFailed => "secp: xonly_pubkey_tewak_add_check failed",
Error::NotEnoughMemory => "secp: not enough memory allocated",
Error::InvalidPublicKeySum => "secp: the sum of public keys was invalid or the input vector lengths was less than 1",
}
}
}
Expand Down

0 comments on commit e2e1abf

Please sign in to comment.