@@ -484,70 +484,6 @@ impl DkgAccumulator {
484
484
complete : true ,
485
485
}
486
486
}
487
-
488
- /// Extract the new threshold decryption key from the accumulator.
489
- pub fn extract_key (
490
- & self ,
491
- dkg_sk : & LabeledDkgDecKey ,
492
- prev : Option < KeyStore > ,
493
- ) -> anyhow:: Result < DecryptionKey > {
494
- if !self . completed ( ) {
495
- return Err ( anyhow ! (
496
- "attempt to extract key from incomplete accumulator"
497
- ) ) ;
498
- } ;
499
- let vess = Vess :: new_fast ( ) ;
500
-
501
- match & self . mode {
502
- AccumulatorMode :: Dkg => {
503
- let mut dealings_iter = ResultIter :: new ( self . bundles ( ) . iter ( ) . map ( |b| {
504
- vess. decrypt_share ( self . committee ( ) , dkg_sk, b. vess_ct ( ) , DKG_AAD )
505
- . map ( |s| ( s, b. comm ( ) . clone ( ) ) )
506
- } ) ) ;
507
-
508
- let dec_key = DecryptionKey :: from_dkg (
509
- self . committee ( ) . size ( ) . into ( ) ,
510
- dkg_sk. node_idx ( ) ,
511
- & mut dealings_iter,
512
- ) ?;
513
-
514
- dealings_iter. result ( ) ?;
515
-
516
- Ok ( dec_key)
517
- }
518
- AccumulatorMode :: Resharing ( combkey) => {
519
- let Some ( prev) = prev else {
520
- return Err ( anyhow ! ( "previous key store missing" ) ) ;
521
- } ;
522
- let dealings: Vec < _ > = self
523
- . bundles ( )
524
- . iter ( )
525
- . enumerate ( )
526
- . map ( |( i, b) | {
527
- let node_idx = b. origin ( ) . 0 . into ( ) ;
528
- let pub_share = combkey
529
- . get_pub_share ( node_idx)
530
- . ok_or ( VessError :: FailedVerification ) ?;
531
- let s = vess. decrypt_reshare (
532
- self . committee ( ) ,
533
- dkg_sk,
534
- b. vess_ct ( ) ,
535
- DKG_AAD ,
536
- * pub_share,
537
- ) ?;
538
- Ok ( ( i, s, b. comm ( ) . clone ( ) ) )
539
- } )
540
- . collect :: < Result < Vec < _ > , VessError > > ( ) ?;
541
-
542
- DecryptionKey :: from_resharing (
543
- prev. committee ( ) ,
544
- self . committee ( ) ,
545
- dkg_sk. node_idx ( ) ,
546
- dealings. into_iter ( ) ,
547
- )
548
- }
549
- }
550
- }
551
487
}
552
488
553
489
/// A unified subset that can represent both DKG and Resharing results.
@@ -605,6 +541,66 @@ impl DkgSubset {
605
541
pub fn is_resharing ( & self ) -> bool {
606
542
self . combkey . is_some ( )
607
543
}
544
+
545
+ /// Extract the new threshold decryption key from the subset.
546
+ pub fn extract_key (
547
+ & self ,
548
+ curr : KeyStore ,
549
+ dkg_sk : & LabeledDkgDecKey ,
550
+ prev : Option < KeyStore > ,
551
+ ) -> anyhow:: Result < DecryptionKey > {
552
+ let vess = Vess :: new_fast ( ) ;
553
+
554
+ match & self . combkey {
555
+ None => {
556
+ let mut dealings_iter = ResultIter :: new ( self . bundles ( ) . iter ( ) . map ( |b| {
557
+ vess. decrypt_share ( curr. committee ( ) , dkg_sk, b. vess_ct ( ) , DKG_AAD )
558
+ . map ( |s| ( s, b. comm ( ) . clone ( ) ) )
559
+ } ) ) ;
560
+
561
+ let dec_key = DecryptionKey :: from_dkg (
562
+ curr. committee ( ) . size ( ) . into ( ) ,
563
+ dkg_sk. node_idx ( ) ,
564
+ & mut dealings_iter,
565
+ ) ?;
566
+
567
+ dealings_iter. result ( ) ?;
568
+
569
+ Ok ( dec_key)
570
+ }
571
+ Some ( combkey) => {
572
+ let Some ( prev) = prev else {
573
+ return Err ( anyhow ! ( "previous key store missing" ) ) ;
574
+ } ;
575
+ let dealings: Vec < _ > = self
576
+ . bundles ( )
577
+ . iter ( )
578
+ . enumerate ( )
579
+ . map ( |( i, b) | {
580
+ let node_idx = b. origin ( ) . 0 . into ( ) ;
581
+ let pub_share = combkey
582
+ . get_pub_share ( node_idx)
583
+ . ok_or ( VessError :: FailedVerification ) ?;
584
+ let s = vess. decrypt_reshare (
585
+ curr. committee ( ) ,
586
+ dkg_sk,
587
+ b. vess_ct ( ) ,
588
+ DKG_AAD ,
589
+ * pub_share,
590
+ ) ?;
591
+ Ok ( ( i, s, b. comm ( ) . clone ( ) ) )
592
+ } )
593
+ . collect :: < Result < Vec < _ > , VessError > > ( ) ?;
594
+
595
+ DecryptionKey :: from_resharing (
596
+ prev. committee ( ) ,
597
+ curr. committee ( ) ,
598
+ dkg_sk. node_idx ( ) ,
599
+ dealings. into_iter ( ) ,
600
+ )
601
+ }
602
+ }
603
+ }
608
604
}
609
605
610
606
/// Wrapper iterator that bridges type conversion
0 commit comments