@@ -14,7 +14,8 @@ use crate::pcp::{decide, prove, query, PcpError, Proof, Value, Verifier};
14
14
use crate :: prng:: { Prng , PrngError } ;
15
15
use crate :: vdaf:: suite:: { Key , KeyDeriver , KeyStream , Suite , SuiteError } ;
16
16
use serde:: { Deserialize , Serialize } ;
17
- use std:: convert:: { TryFrom , TryInto } ;
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 ) ]
@@ -374,27 +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 < 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 >
381
379
where
382
380
V : Value ,
383
- M : TryInto < [ VerifierMessage < V :: Field > ; N ] , Error = E > ,
384
- E : std:: fmt:: Debug ,
381
+ M : IntoIterator < Item = VerifierMessage < V :: Field > > ,
385
382
{
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
+ } ;
398
393
399
394
let ( input_share, mut joint_rand_seed) = match state {
400
395
AggregatorState :: Wait {
@@ -410,7 +405,7 @@ where
410
405
} ;
411
406
412
407
// 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 ] ;
414
409
for msg in msgs {
415
410
if msg. verifier_share . as_slice ( ) . len ( ) != verifier_data. len ( ) {
416
411
return Err ( VdafError :: Uncategorized ( format ! (
@@ -480,8 +475,7 @@ mod tests {
480
475
// Aggregators decide whether the input is valid based on the verifier messages.
481
476
let mut output = vec ! [ Field64 :: zero( ) ; input. as_slice( ) . len( ) ] ;
482
477
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 ( ) ;
485
479
for ( x, y) in output. iter_mut ( ) . zip ( output_share. as_slice ( ) ) {
486
480
* x += * y;
487
481
}
0 commit comments