arctic.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. use arctic::arctic;
  2. use arctic::R1Output;
  3. use curve25519_dalek::scalar::Scalar;
  4. use rand::RngCore;
  5. use std::env;
  6. use std::time::Instant;
  7. fn mean(vals: &[f64]) -> f64 {
  8. let num = vals.len();
  9. if num > 0 {
  10. vals.iter().sum::<f64>() / (num as f64)
  11. } else {
  12. 0f64
  13. }
  14. }
  15. fn stddev(vals: &[f64]) -> f64 {
  16. let num = vals.len();
  17. if num < 2 {
  18. return 0f64;
  19. }
  20. let avg = mean(vals);
  21. (vals
  22. .iter()
  23. .map(|v| v - avg)
  24. .map(|dev| dev * dev)
  25. .sum::<f64>()
  26. / ((num - 1) as f64))
  27. .sqrt()
  28. }
  29. fn main() {
  30. let args: Vec<String> = env::args().collect();
  31. if args.len() < 4 || args.len() > 5 {
  32. println!("Usage: {} n t Csize [reps]", args[0]);
  33. return;
  34. }
  35. let n: u32 = args[1].parse().unwrap();
  36. let t: u32 = args[2].parse().unwrap();
  37. let msglen: usize = 100;
  38. let coalitionsize: u32 = args[3].parse().unwrap();
  39. let mut reps = 1usize;
  40. if args.len() > 4 {
  41. reps = args[4].parse().unwrap();
  42. }
  43. let mut msg: Vec<u8> = Vec::new();
  44. let mut rng = rand::thread_rng();
  45. msg.resize(msglen, 0);
  46. assert!(t >= 1);
  47. assert!(coalitionsize >= 2 * t - 1);
  48. assert!(n >= coalitionsize);
  49. let (pubkey, _, mut seckeys) = arctic::keygen(n, t);
  50. let delta = seckeys[0].delta();
  51. let mut sign1_timings: Vec<f64> = Vec::new();
  52. let mut sign2_timings: Vec<f64> = Vec::new();
  53. let mut combine_timings: Vec<f64> = Vec::new();
  54. let coalition = (1..=coalitionsize).collect::<Vec<u32>>();
  55. seckeys.truncate(coalitionsize as usize);
  56. let polys = arctic::lagrange_polys(&coalition);
  57. for _ in 0..reps {
  58. rng.fill_bytes(&mut msg);
  59. let (r1_outputs, sign1_iter_timings): (Vec<R1Output>, Vec<f64>) = seckeys
  60. .iter()
  61. .map(|key| {
  62. let sign1start = Instant::now();
  63. let r1_output = arctic::sign1(key, &coalition, &msg);
  64. let sign1dur = sign1start.elapsed().as_micros() as f64;
  65. (r1_output, sign1dur)
  66. })
  67. .unzip();
  68. sign1_timings.extend(sign1_iter_timings);
  69. let (sigshares, sign2_iter_timings): (Vec<Scalar>, Vec<f64>) = seckeys
  70. .iter()
  71. .map(|key| {
  72. let sign2start = Instant::now();
  73. let sigshare =
  74. arctic::sign2_polys(&pubkey, key, &coalition, &polys, &msg, &r1_outputs)
  75. .unwrap();
  76. let sign2dur = sign2start.elapsed().as_micros() as f64;
  77. (sigshare, sign2dur)
  78. })
  79. .unzip();
  80. sign2_timings.extend(sign2_iter_timings);
  81. let combinestart = Instant::now();
  82. let sig = arctic::combine_polys(
  83. &pubkey,
  84. t,
  85. &coalition,
  86. &polys,
  87. &msg,
  88. &r1_outputs,
  89. &sigshares,
  90. )
  91. .unwrap();
  92. let combinedur = combinestart.elapsed().as_micros() as f64;
  93. combine_timings.push(combinedur);
  94. assert!(arctic::verify(&pubkey, &msg, &sig));
  95. }
  96. let sign1_mean = mean(&sign1_timings);
  97. let sign1_stddev = stddev(&sign1_timings);
  98. let sign2_mean = mean(&sign2_timings);
  99. let sign2_stddev = stddev(&sign2_timings);
  100. let combine_mean = mean(&combine_timings);
  101. let combine_stddev = stddev(&combine_timings);
  102. println!(
  103. "{} {} {} {} {} {:.1} ± {:.1} {:.1} ± {:.1} {:.1} ± {:.1}",
  104. n,
  105. t,
  106. coalitionsize,
  107. reps,
  108. delta,
  109. sign1_mean,
  110. sign1_stddev,
  111. sign2_mean,
  112. sign2_stddev,
  113. combine_mean,
  114. combine_stddev,
  115. );
  116. }