diff --git a/src/dss/ss1/scheme.rs b/src/dss/ss1/scheme.rs index 0801a28..9672e5e 100644 --- a/src/dss/ss1/scheme.rs +++ b/src/dss/ss1/scheme.rs @@ -247,7 +247,8 @@ impl SS1 { &self, shares: &[Share], ) -> Result<(Vec, AccessStructure, Option)> { - let (_, shares) = validate_shares(shares.to_vec())?; + let shares = shares.to_vec(); + validate_shares(&shares)?; let underlying_shares = shares .iter() diff --git a/src/dss/thss/scheme.rs b/src/dss/thss/scheme.rs index c11cfd7..141c932 100644 --- a/src/dss/thss/scheme.rs +++ b/src/dss/thss/scheme.rs @@ -89,9 +89,8 @@ impl ThSS { &self, shares: &[Share], ) -> Result<(Vec, AccessStructure, Option)> { - let (threshold, shares) = validate_shares(shares.to_vec())?; - - let cypher_len = shares[0].data.len(); + let shares = shares.to_vec(); + let (threshold, cypher_len) = validate_shares(&shares)?; let polys = (0..cypher_len) .map(|i| { diff --git a/src/share/validation.rs b/src/share/validation.rs index 93d0078..8a256b1 100644 --- a/src/share/validation.rs +++ b/src/share/validation.rs @@ -11,27 +11,27 @@ use share::{IsShare, IsSignedShare}; /// TODO: Doc pub(crate) fn validate_signed_shares( - shares: Vec, + shares: &Vec, verify_signatures: bool, -) -> Result<(u8, Vec)> { - let (threshold, shares) = validate_shares(shares)?; +) -> Result<(u8, usize)> { + let result = validate_shares(shares)?; if verify_signatures { S::verify_signatures(&shares)?; } - Ok((threshold, shares)) + Ok(result) } /// TODO: Doc -pub(crate) fn validate_shares(shares: Vec) -> Result<(u8, Vec)> { +pub(crate) fn validate_shares(shares: &Vec) -> Result<(u8, usize)> { if shares.is_empty() { bail!(ErrorKind::EmptyShares); } let shares_count = shares.len(); - let mut result: Vec = Vec::with_capacity(shares_count); + let mut ids = Vec::with_capacity(shares_count); let mut k_compatibility_sets = HashMap::new(); let mut data_len_compatibility_sets = HashMap::new(); @@ -52,7 +52,7 @@ pub(crate) fn validate_shares(shares: Vec) -> Result<(u8, Vec) let k_set = k_compatibility_sets.get_mut(&threshold).unwrap(); k_set.insert(id); - if result.iter().any(|s| s.get_id() == id) { + if ids.iter().any(|&x| x == id) { bail!(ErrorKind::DuplicateShareId(id)); } @@ -62,8 +62,7 @@ pub(crate) fn validate_shares(shares: Vec) -> Result<(u8, Vec) let data_len_set = data_len_compatibility_sets.get_mut(&data_len).unwrap(); data_len_set.insert(id); - - result.push(share); + ids.push(id); } // Validate threshold @@ -107,7 +106,10 @@ pub(crate) fn validate_shares(shares: Vec) -> Result<(u8, Vec) } } - Ok((threshold, result)) + // It is safe to unwrap because data_len_sets == 1 + let slen = data_len_compatibility_sets.keys().last().unwrap().to_owned(); + + Ok((threshold, data_len)) } pub(crate) fn validate_share_count(threshold: u8, shares_count: u8) -> Result<(u8, u8)> { diff --git a/src/sss/scheme.rs b/src/sss/scheme.rs index d5021ba..4072c91 100644 --- a/src/sss/scheme.rs +++ b/src/sss/scheme.rs @@ -93,9 +93,8 @@ impl SSS { /// /// At least `k` distinct shares need to be provided to recover the share. pub fn recover_secret(shares: Vec, verify_signatures: bool) -> Result> { - let (threshold, shares) = validate_signed_shares(shares, verify_signatures)?; + let (threshold, slen) = validate_signed_shares(&shares, verify_signatures)?; - let slen = shares[0].data.len(); let mut col_in = Vec::with_capacity(threshold as usize); let mut secret = Vec::with_capacity(slen); for byteindex in 0..slen {