@@ -2,6 +2,7 @@ use ark_bls12_381::Bls12_381;
22use ark_std:: test_rng;
33use simple_batched_threshold_encryption:: bte:: {
44 crs:: setup,
5+ fo,
56 fo:: {
67 batch_verify, combine, encrypt, helper_decrypt, helper_finalize, partial_decrypt,
78 predecrypt_fft, verify_partial_decryption,
@@ -18,16 +19,28 @@ enum Mode {
1819 Pipelined ,
1920}
2021
22+ #[ derive( Clone , Copy , Debug ) ]
23+ enum HintMode {
24+ VerificationOptimized ,
25+ BandwidthOptimized ,
26+ }
27+
2128#[ derive( Clone , Debug ) ]
2229struct Config {
2330 batch_size : usize ,
2431 num_parties : usize ,
2532 threshold : usize ,
2633 iterations : usize ,
2734 mode : Mode ,
35+ hint_mode : HintMode ,
2836 msg_len : usize ,
2937}
3038
39+ enum Hints {
40+ Verification ( fo:: DecryptionHints < E > ) ,
41+ Bandwidth ( fo:: BandwidthDecryptionHints < E > ) ,
42+ }
43+
3144#[ derive( Default ) ]
3245struct Timing {
3346 setup : Duration ,
@@ -99,14 +112,32 @@ fn main() {
99112
100113 // -- Helper: expensive decrypt + hint generation ------------------
101114 let ( predecrypt_time, helper_finalize_time, helper_total_time, helper_msgs, hints) =
102- match config. mode {
103- Mode :: Direct => {
115+ match ( config. mode , config . hint_mode ) {
116+ ( Mode :: Direct , HintMode :: VerificationOptimized ) => {
104117 let start = Instant :: now ( ) ;
105118 let ( msgs, hints) = helper_decrypt ( & dk, & pd, & cts) ;
106119 let total = start. elapsed ( ) ;
107- ( Duration :: ZERO , Duration :: ZERO , total, msgs, hints)
120+ (
121+ Duration :: ZERO ,
122+ Duration :: ZERO ,
123+ total,
124+ msgs,
125+ Hints :: Verification ( hints) ,
126+ )
108127 }
109- Mode :: Pipelined => {
128+ ( Mode :: Direct , HintMode :: BandwidthOptimized ) => {
129+ let start = Instant :: now ( ) ;
130+ let ( msgs, hints) = fo:: helper_decrypt_bandwidth_optimized ( & dk, & pd, & cts) ;
131+ let total = start. elapsed ( ) ;
132+ (
133+ Duration :: ZERO ,
134+ Duration :: ZERO ,
135+ total,
136+ msgs,
137+ Hints :: Bandwidth ( hints) ,
138+ )
139+ }
140+ ( Mode :: Pipelined , HintMode :: VerificationOptimized ) => {
110141 let start = Instant :: now ( ) ;
111142 let cross = predecrypt_fft ( & dk, & cts) ;
112143 let pre = start. elapsed ( ) ;
@@ -115,7 +146,19 @@ fn main() {
115146 let ( msgs, hints) = helper_finalize ( & dk, & pd, & cts, & cross) ;
116147 let fin = start. elapsed ( ) ;
117148
118- ( pre, fin, pre + fin, msgs, hints)
149+ ( pre, fin, pre + fin, msgs, Hints :: Verification ( hints) )
150+ }
151+ ( Mode :: Pipelined , HintMode :: BandwidthOptimized ) => {
152+ let start = Instant :: now ( ) ;
153+ let cross = predecrypt_fft ( & dk, & cts) ;
154+ let pre = start. elapsed ( ) ;
155+
156+ let start = Instant :: now ( ) ;
157+ let ( msgs, hints) =
158+ fo:: helper_finalize_bandwidth_optimized ( & dk, & pd, & cts, & cross) ;
159+ let fin = start. elapsed ( ) ;
160+
161+ ( pre, fin, pre + fin, msgs, Hints :: Bandwidth ( hints) )
119162 }
120163 } ;
121164
@@ -128,7 +171,12 @@ fn main() {
128171
129172 // -- Verifier: batch verify (no pairings!) ------------------------
130173 let start = Instant :: now ( ) ;
131- let verified = batch_verify ( & ek, & cts, & hints, & mut rng) ;
174+ let verified = match & hints {
175+ Hints :: Verification ( hints) => batch_verify ( & ek, & cts, hints, & mut rng) ,
176+ Hints :: Bandwidth ( hints) => {
177+ fo:: batch_verify_bandwidth_optimized ( & ek, & cts, hints, & mut rng)
178+ }
179+ } ;
132180 let batch_verify_time = start. elapsed ( ) ;
133181
134182 let verified_msgs = verified. expect ( "batch verification failed" ) ;
@@ -180,6 +228,7 @@ fn parse_args() -> Config {
180228 threshold : 5 ,
181229 iterations : 1 ,
182230 mode : Mode :: Pipelined ,
231+ hint_mode : HintMode :: VerificationOptimized ,
183232 msg_len : 256 ,
184233 } ;
185234
@@ -201,6 +250,9 @@ fn parse_args() -> Config {
201250 "--mode" | "-m" => {
202251 config. mode = parse_mode_arg ( args. next ( ) ) ;
203252 }
253+ "--hint-mode" => {
254+ config. hint_mode = parse_hint_mode_arg ( args. next ( ) ) ;
255+ }
204256 "--msg-len" | "-l" => {
205257 config. msg_len = parse_usize_arg ( "--msg-len" , args. next ( ) ) ;
206258 }
@@ -239,6 +291,19 @@ fn parse_mode_arg(value: Option<String>) -> Mode {
239291 }
240292}
241293
294+ fn parse_hint_mode_arg ( value : Option < String > ) -> HintMode {
295+ match value
296+ . unwrap_or_else ( || panic ! ( "missing value for --hint-mode" ) )
297+ . as_str ( )
298+ {
299+ "verification" => HintMode :: VerificationOptimized ,
300+ "bandwidth" => HintMode :: BandwidthOptimized ,
301+ other => panic ! (
302+ "invalid hint mode: {other} (expected 'verification' or 'bandwidth')"
303+ ) ,
304+ }
305+ }
306+
242307fn print_help_and_exit ( ) -> ! {
243308 println ! ( "Usage: cargo run --release --example fo_e2e -- [options]" ) ;
244309 println ! ( ) ;
@@ -248,6 +313,7 @@ fn print_help_and_exit() -> ! {
248313 println ! ( " --threshold, -t Threshold (default: 5)" ) ;
249314 println ! ( " --iters, -i Iterations (default: 1)" ) ;
250315 println ! ( " --mode, -m Helper mode: direct | pipelined (default: pipelined)" ) ;
316+ println ! ( " --hint-mode Hint mode: verification | bandwidth (default: verification)" ) ;
251317 println ! ( " --msg-len, -l Per-message byte length (default: 256)" ) ;
252318 std:: process:: exit ( 0 ) ;
253319}
@@ -279,6 +345,7 @@ fn print_run_header(config: &Config) {
279345 println ! ( "msg length : {} bytes" , config. msg_len) ;
280346 println ! ( "iterations : {}" , config. iterations) ;
281347 println ! ( "mode : {:?}" , config. mode) ;
348+ println ! ( "hint mode : {:?}" , config. hint_mode) ;
282349 println ! ( ) ;
283350}
284351
0 commit comments