Add error type for combine keys + test and doc
This commit is contained in:
parent
bb25ed4715
commit
674cc79d87
17
src/key.rs
17
src/key.rs
|
@ -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;
|
||||
|
@ -395,12 +395,16 @@ 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, if the provided slice has no element in it,
|
||||
/// or if the number of element it contains is greater than i32::MAX.
|
||||
pub fn combine_keys(keys: &[&PublicKey]) -> Result<PublicKey, Error> {
|
||||
use core::mem::transmute;
|
||||
use core::i32::MAX;
|
||||
|
||||
debug_assert!(keys.len() < MAX as usize);
|
||||
if keys.is_empty() || keys.len() > MAX as usize {
|
||||
return Err(InvalidPublicKeySum);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let mut ret = ffi::PublicKey::new();
|
||||
let ptrs : &[*const ffi::PublicKey] =
|
||||
|
@ -414,7 +418,7 @@ impl PublicKey {
|
|||
{
|
||||
Ok(PublicKey(ret))
|
||||
} else {
|
||||
Err(InvalidPublicKey)
|
||||
Err(InvalidPublicKeySum)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
@ -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",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue