Skip to content

Commit 627ae5a

Browse files
authored
Merge pull request #85 from abetterinternet/timg/verify-finish-slice
make `vdaf::verify_finish` take a slice
2 parents 7d04701 + dd4c7b8 commit 627ae5a

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/vdaf.rs

+21-14
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ use crate::prng::{Prng, PrngError};
1515
use crate::vdaf::suite::{Key, KeyDeriver, KeyStream, Suite, SuiteError};
1616
use serde::{Deserialize, Serialize};
1717
use std::convert::TryFrom;
18+
use std::iter::IntoIterator;
1819

1920
/// Errors emitted by this module.
2021
#[derive(Debug, thiserror::Error)]
2122
pub enum VdafError {
2223
/// An error occurred.
23-
#[error("ppm error: {0}")]
24+
#[error("vdaf error: {0}")]
2425
Uncategorized(String),
2526

2627
/// The distributed input was deemed invalid.
@@ -375,15 +376,21 @@ pub fn verify_start<V: Value>(
375376
/// [`VerifierMessage`] messages broadcast by all of the aggregators and produces the aggregator's
376377
/// input share.
377378
// TODO(cjpatton) Check for ciphersuite mismatch between `state` and `msgs` and among `msgs`.
378-
pub fn verify_finish<V: Value>(
379-
state: AggregatorState<V>,
380-
msgs: Vec<VerifierMessage<V::Field>>,
381-
) -> Result<V, VdafError> {
382-
if msgs.is_empty() {
383-
return Err(VdafError::Uncategorized(
384-
"verify_finish(): expected at least one inbound messages; got none".to_string(),
385-
));
386-
}
379+
pub fn verify_finish<M, V>(state: AggregatorState<V>, msgs: M) -> Result<V, VdafError>
380+
where
381+
V: Value,
382+
M: IntoIterator<Item = VerifierMessage<V::Field>>,
383+
{
384+
let mut msgs = msgs.into_iter().peekable();
385+
386+
let verifier_length = match msgs.peek() {
387+
Some(message) => message.verifier_share.as_slice().len(),
388+
None => {
389+
return Err(VdafError::Uncategorized(
390+
"verify_finish(): expected at least one inbound messages; got none".to_string(),
391+
));
392+
}
393+
};
387394

388395
let (input_share, mut joint_rand_seed) = match state {
389396
AggregatorState::Wait {
@@ -399,7 +406,7 @@ pub fn verify_finish<V: Value>(
399406
};
400407

401408
// Combine the verifier messages.
402-
let mut verifier_data = vec![V::Field::zero(); msgs[0].verifier_share.as_slice().len()];
409+
let mut verifier_data = vec![V::Field::zero(); verifier_length];
403410
for msg in msgs {
404411
if msg.verifier_share.as_slice().len() != verifier_data.len() {
405412
return Err(VdafError::Uncategorized(format!(
@@ -447,14 +454,14 @@ mod tests {
447454
#[test]
448455
fn test_prio() {
449456
let suite = Suite::Blake3;
450-
let num_shares = 23;
457+
const NUM_SHARES: usize = 23;
451458
let input: Boolean<Field64> = Boolean::new(true);
452459

453460
// Client runs the input and proof distribution algorithms.
454-
let input_shares = dist_input(suite, &input, num_shares as u8).unwrap();
461+
let input_shares = dist_input(suite, &input, NUM_SHARES as u8).unwrap();
455462

456463
// Aggregators agree on query randomness.
457-
let states = dist_init(suite, (), num_shares).unwrap();
464+
let states = dist_init(suite, (), NUM_SHARES as u8).unwrap();
458465

459466
// Aggregators receive their proof shares and broadcast their verifier messages.
460467
let (states, verifiers): (

0 commit comments

Comments
 (0)