Skip to content

Commit 534d9cf

Browse files
committed
make verify_finish take IntoIterator
`IntoIterator<Item = VerifierMessage>` is even more flexible than `TryInto<[VerifierMessage; N]>` and is also infallible, eliminating an error case and simplifying the generic parameters on `verify_finish`.
1 parent 14dd072 commit 534d9cf

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

src/vdaf.rs

+16-22
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use crate::pcp::{decide, prove, query, PcpError, Proof, Value, Verifier};
1414
use crate::prng::{Prng, PrngError};
1515
use crate::vdaf::suite::{Key, KeyDeriver, KeyStream, Suite, SuiteError};
1616
use serde::{Deserialize, Serialize};
17-
use std::convert::{TryFrom, TryInto};
17+
use std::convert::TryFrom;
18+
use std::iter::IntoIterator;
1819

1920
/// Errors emitted by this module.
2021
#[derive(Debug, thiserror::Error)]
@@ -374,27 +375,21 @@ pub fn verify_start<V: Value>(
374375
/// [`VerifierMessage`] messages broadcast by all of the aggregators and produces the aggregator's
375376
/// input share.
376377
// TODO(cjpatton) Check for ciphersuite mismatch between `state` and `msgs` and among `msgs`.
377-
pub fn verify_finish<M, E, V, const N: usize>(
378-
state: AggregatorState<V>,
379-
msgs: M,
380-
) -> Result<V, VdafError>
378+
pub fn verify_finish<M, V>(state: AggregatorState<V>, msgs: M) -> Result<V, VdafError>
381379
where
382380
V: Value,
383-
M: TryInto<[VerifierMessage<V::Field>; N], Error = E>,
384-
E: std::fmt::Debug,
381+
M: IntoIterator<Item = VerifierMessage<V::Field>>,
385382
{
386-
let msgs: [VerifierMessage<V::Field>; N] = msgs.try_into().map_err(|e| {
387-
VdafError::Uncategorized(format!(
388-
"input could not be converted to VerifierMessage slice: {:?}",
389-
e
390-
))
391-
})?;
392-
393-
if msgs.is_empty() {
394-
return Err(VdafError::Uncategorized(
395-
"verify_finish(): expected at least one inbound messages; got none".to_string(),
396-
));
397-
}
383+
let mut msgs = msgs.into_iter().peekable();
384+
385+
let verifier_length = match msgs.peek() {
386+
Some(message) => message.verifier_share.as_slice().len(),
387+
None => {
388+
return Err(VdafError::Uncategorized(
389+
"verify_finish(): expected at least one inbound messages; got none".to_string(),
390+
));
391+
}
392+
};
398393

399394
let (input_share, mut joint_rand_seed) = match state {
400395
AggregatorState::Wait {
@@ -410,7 +405,7 @@ where
410405
};
411406

412407
// Combine the verifier messages.
413-
let mut verifier_data = vec![V::Field::zero(); msgs[0].verifier_share.as_slice().len()];
408+
let mut verifier_data = vec![V::Field::zero(); verifier_length];
414409
for msg in msgs {
415410
if msg.verifier_share.as_slice().len() != verifier_data.len() {
416411
return Err(VdafError::Uncategorized(format!(
@@ -480,8 +475,7 @@ mod tests {
480475
// Aggregators decide whether the input is valid based on the verifier messages.
481476
let mut output = vec![Field64::zero(); input.as_slice().len()];
482477
for state in states {
483-
let output_share =
484-
verify_finish::<_, _, _, NUM_SHARES>(state, verifiers.clone()).unwrap();
478+
let output_share = verify_finish(state, verifiers.clone()).unwrap();
485479
for (x, y) in output.iter_mut().zip(output_share.as_slice()) {
486480
*x += *y;
487481
}

0 commit comments

Comments
 (0)