@@ -15,12 +15,13 @@ use crate::prng::{Prng, PrngError};
15
15
use crate :: vdaf:: suite:: { Key , KeyDeriver , KeyStream , Suite , SuiteError } ;
16
16
use serde:: { Deserialize , Serialize } ;
17
17
use std:: convert:: TryFrom ;
18
+ use std:: iter:: IntoIterator ;
18
19
19
20
/// Errors emitted by this module.
20
21
#[ derive( Debug , thiserror:: Error ) ]
21
22
pub enum VdafError {
22
23
/// An error occurred.
23
- #[ error( "ppm error: {0}" ) ]
24
+ #[ error( "vdaf error: {0}" ) ]
24
25
Uncategorized ( String ) ,
25
26
26
27
/// The distributed input was deemed invalid.
@@ -374,15 +375,21 @@ pub fn verify_start<V: Value>(
374
375
/// [`VerifierMessage`] messages broadcast by all of the aggregators and produces the aggregator's
375
376
/// input share.
376
377
// TODO(cjpatton) Check for ciphersuite mismatch between `state` and `msgs` and among `msgs`.
377
- pub fn verify_finish < V : Value > (
378
- state : AggregatorState < V > ,
379
- msgs : Vec < VerifierMessage < V :: Field > > ,
380
- ) -> Result < V , VdafError > {
381
- if msgs. is_empty ( ) {
382
- return Err ( VdafError :: Uncategorized (
383
- "verify_finish(): expected at least one inbound messages; got none" . to_string ( ) ,
384
- ) ) ;
385
- }
378
+ pub fn verify_finish < M , V > ( state : AggregatorState < V > , msgs : M ) -> Result < V , VdafError >
379
+ where
380
+ V : Value ,
381
+ M : IntoIterator < Item = VerifierMessage < V :: Field > > ,
382
+ {
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
+ } ;
386
393
387
394
let ( input_share, mut joint_rand_seed) = match state {
388
395
AggregatorState :: Wait {
@@ -398,7 +405,7 @@ pub fn verify_finish<V: Value>(
398
405
} ;
399
406
400
407
// Combine the verifier messages.
401
- 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 ] ;
402
409
for msg in msgs {
403
410
if msg. verifier_share . as_slice ( ) . len ( ) != verifier_data. len ( ) {
404
411
return Err ( VdafError :: Uncategorized ( format ! (
@@ -446,14 +453,14 @@ mod tests {
446
453
#[ test]
447
454
fn test_prio ( ) {
448
455
let suite = Suite :: Blake3 ;
449
- let num_shares = 23 ;
456
+ const NUM_SHARES : usize = 23 ;
450
457
let input: Boolean < Field64 > = Boolean :: new ( true ) ;
451
458
452
459
// Client runs the input and proof distribution algorithms.
453
- let input_shares = dist_input ( suite, & input, num_shares as u8 ) . unwrap ( ) ;
460
+ let input_shares = dist_input ( suite, & input, NUM_SHARES as u8 ) . unwrap ( ) ;
454
461
455
462
// Aggregators agree on query randomness.
456
- let states = dist_init ( suite, ( ) , num_shares ) . unwrap ( ) ;
463
+ let states = dist_init ( suite, ( ) , NUM_SHARES as u8 ) . unwrap ( ) ;
457
464
458
465
// Aggregators receive their proof shares and broadcast their verifier messages.
459
466
let ( states, verifiers) : (
0 commit comments