@@ -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.
@@ -375,15 +376,21 @@ pub fn verify_start<V: Value>(
375
376
/// [`VerifierMessage`] messages broadcast by all of the aggregators and produces the aggregator's
376
377
/// input share.
377
378
// 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
+ } ;
387
394
388
395
let ( input_share, mut joint_rand_seed) = match state {
389
396
AggregatorState :: Wait {
@@ -399,7 +406,7 @@ pub fn verify_finish<V: Value>(
399
406
} ;
400
407
401
408
// 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 ] ;
403
410
for msg in msgs {
404
411
if msg. verifier_share . as_slice ( ) . len ( ) != verifier_data. len ( ) {
405
412
return Err ( VdafError :: Uncategorized ( format ! (
@@ -447,14 +454,14 @@ mod tests {
447
454
#[ test]
448
455
fn test_prio ( ) {
449
456
let suite = Suite :: Blake3 ;
450
- let num_shares = 23 ;
457
+ const NUM_SHARES : usize = 23 ;
451
458
let input: Boolean < Field64 > = Boolean :: new ( true ) ;
452
459
453
460
// 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 ( ) ;
455
462
456
463
// 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 ( ) ;
458
465
459
466
// Aggregators receive their proof shares and broadcast their verifier messages.
460
467
let ( states, verifiers) : (
0 commit comments