2020use core:: { fmt, str} ;
2121
2222use super :: { from_hex, Secp256k1 } ;
23- use super :: Error :: { self , InvalidPublicKey , InvalidSecretKey } ;
23+ use super :: Error :: { self , InvalidPublicKey , InvalidPublicKeySum , InvalidSecretKey } ;
2424use Signing ;
2525use Verification ;
2626use constants;
@@ -425,12 +425,16 @@ impl PublicKey {
425425
426426 /// Adds the keys in the provided slice together, returning the sum. Returns
427427 /// an error if the result would be the point at infinity, i.e. we are adding
428- /// a point to its own negation
428+ /// a point to its own negation, if the provided slice has no element in it,
429+ /// or if the number of element it contains is greater than i32::MAX.
429430 pub fn combine_keys ( keys : & [ & PublicKey ] ) -> Result < PublicKey , Error > {
430431 use core:: mem:: transmute;
431432 use core:: i32:: MAX ;
432433
433- debug_assert ! ( keys. len( ) < MAX as usize ) ;
434+ if keys. is_empty ( ) || keys. len ( ) > MAX as usize {
435+ return Err ( InvalidPublicKeySum ) ;
436+ }
437+
434438 unsafe {
435439 let mut ret = ffi:: PublicKey :: new ( ) ;
436440 let ptrs : & [ * const ffi:: PublicKey ] =
@@ -444,7 +448,7 @@ impl PublicKey {
444448 {
445449 Ok ( PublicKey ( ret) )
446450 } else {
447- Err ( InvalidPublicKey )
451+ Err ( InvalidPublicKeySum )
448452 }
449453 }
450454 }
@@ -923,6 +927,11 @@ mod test {
923927 assert_eq ! ( sum1. unwrap( ) , exp_sum) ;
924928 }
925929
930+ #[ cfg_attr( not( fuzzing) , test) ]
931+ fn pubkey_combine_keys_empty_slice ( ) {
932+ assert ! ( PublicKey :: combine_keys( & [ ] ) . is_err( ) ) ;
933+ }
934+
926935 #[ test]
927936 fn create_pubkey_combine ( ) {
928937 let s = Secp256k1 :: new ( ) ;
0 commit comments