doprf.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
  2. use ff::Field;
  3. use oram::doprf::LegendrePrf;
  4. use oram::doprf::{DOPrfParty1, DOPrfParty2, DOPrfParty3};
  5. use rand::thread_rng;
  6. use utils::field::Fp;
  7. pub fn bench_legendre_prf(c: &mut Criterion) {
  8. let output_bitsize = 128;
  9. let mut group = c.benchmark_group("LegendrePrf");
  10. group.bench_function("keygen", |b| {
  11. b.iter(|| black_box(LegendrePrf::<Fp>::key_gen(output_bitsize)))
  12. });
  13. group.bench_function("eval", |b| {
  14. let key = LegendrePrf::<Fp>::key_gen(output_bitsize);
  15. let x = Fp::random(thread_rng());
  16. b.iter(|| black_box(LegendrePrf::<Fp>::eval(&key, x)))
  17. });
  18. group.finish();
  19. }
  20. const LOG_NUM_EVALUATIONS: [usize; 4] = [4, 6, 8, 10];
  21. pub fn bench_doprf(c: &mut Criterion) {
  22. let output_bitsize = 128;
  23. let mut group = c.benchmark_group("DOPrf");
  24. let mut party_1 = DOPrfParty1::<Fp>::new(output_bitsize);
  25. let mut party_2 = DOPrfParty2::<Fp>::new(output_bitsize);
  26. let mut party_3 = DOPrfParty3::<Fp>::new(output_bitsize);
  27. group.bench_function("init", |b| {
  28. b.iter(|| {
  29. party_1.reset();
  30. party_2.reset();
  31. party_3.reset();
  32. let (msg_1_2, msg_1_3) = party_1.init_round_0();
  33. let (msg_2_1, msg_2_3) = party_2.init_round_0();
  34. let (msg_3_1, msg_3_2) = party_3.init_round_0();
  35. party_1.init_round_1(msg_2_1, msg_3_1);
  36. party_2.init_round_1(msg_1_2, msg_3_2);
  37. party_3.init_round_1(msg_1_3, msg_2_3);
  38. });
  39. });
  40. {
  41. party_1.reset();
  42. party_2.reset();
  43. party_3.reset();
  44. let (msg_1_2, msg_1_3) = party_1.init_round_0();
  45. let (msg_2_1, msg_2_3) = party_2.init_round_0();
  46. let (msg_3_1, msg_3_2) = party_3.init_round_0();
  47. party_1.init_round_1(msg_2_1, msg_3_1);
  48. party_2.init_round_1(msg_1_2, msg_3_2);
  49. party_3.init_round_1(msg_1_3, msg_2_3);
  50. }
  51. for log_num_evaluations in LOG_NUM_EVALUATIONS {
  52. group.bench_with_input(
  53. BenchmarkId::new("preprocess", log_num_evaluations),
  54. &log_num_evaluations,
  55. |b, &log_num_evaluations| {
  56. let num = 1 << log_num_evaluations;
  57. b.iter(|| {
  58. party_1.reset_preprocessing();
  59. party_2.reset_preprocessing();
  60. party_3.reset_preprocessing();
  61. let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num);
  62. let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num);
  63. let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num);
  64. party_1.preprocess_round_1(num, msg_2_1, msg_3_1);
  65. party_2.preprocess_round_1(num, msg_1_2, msg_3_2);
  66. party_3.preprocess_round_1(num, msg_1_3, msg_2_3);
  67. });
  68. },
  69. );
  70. }
  71. for log_num_evaluations in LOG_NUM_EVALUATIONS {
  72. group.bench_with_input(
  73. BenchmarkId::new("preprocess+eval", log_num_evaluations),
  74. &log_num_evaluations,
  75. |b, &log_num_evaluations| {
  76. let num = 1 << log_num_evaluations;
  77. let shares_1: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  78. let shares_2: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  79. let shares_3: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  80. b.iter(|| {
  81. let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num);
  82. let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num);
  83. let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num);
  84. party_1.preprocess_round_1(num, msg_2_1, msg_3_1);
  85. party_2.preprocess_round_1(num, msg_1_2, msg_3_2);
  86. party_3.preprocess_round_1(num, msg_1_3, msg_2_3);
  87. let (msg_2_1, msg_2_3) = party_2.eval_round_0(num, &shares_2);
  88. let (msg_3_1, _) = party_3.eval_round_0(num, &shares_3);
  89. let (_, msg_1_3) = party_1.eval_round_1(num, &shares_1, &msg_2_1, &msg_3_1);
  90. let _output = party_3.eval_round_2(num, &shares_3, msg_1_3, msg_2_3);
  91. });
  92. },
  93. );
  94. }
  95. group.finish();
  96. }
  97. criterion_group!(
  98. name = benches;
  99. config = Criterion::default().sample_size(10);
  100. targets = bench_legendre_prf, bench_doprf
  101. );
  102. criterion_main!(benches);