arctic.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use arctic::arctic;
  2. use curve25519_dalek::ristretto::RistrettoPoint;
  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 msglen [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 = args[3].parse().unwrap();
  38. let mut reps = 1usize;
  39. if args.len() > 4 {
  40. reps = args[4].parse().unwrap();
  41. }
  42. let mut msg: Vec<u8> = Vec::new();
  43. let mut rng = rand::thread_rng();
  44. msg.resize(msglen, 0);
  45. let (pubkey, seckeys) = arctic::keygen(n, t);
  46. let delta = seckeys[0].delta();
  47. let mut sign1_timings: Vec<f64> = Vec::new();
  48. let mut sign2_timings: Vec<f64> = Vec::new();
  49. let mut combine_timings: Vec<f64> = Vec::new();
  50. let coalition = (1..=n).collect::<Vec<u32>>();
  51. for _ in 0..reps {
  52. rng.fill_bytes(&mut msg);
  53. let (commits, sign1_iter_timings): (Vec<RistrettoPoint>, Vec<f64>) = seckeys
  54. .iter()
  55. .map(|key| {
  56. let sign1start = Instant::now();
  57. let commitment = arctic::sign1(&pubkey, key, &coalition, &msg);
  58. let sign1dur = sign1start.elapsed().as_micros() as f64;
  59. (commitment, sign1dur)
  60. })
  61. .unzip();
  62. sign1_timings.extend(sign1_iter_timings);
  63. let (sigshares, sign2_iter_timings): (Vec<Scalar>, Vec<f64>) = seckeys
  64. .iter()
  65. .map(|key| {
  66. let sign2start = Instant::now();
  67. let sigshare = arctic::sign2(&pubkey, key, &coalition, &msg, &commits).unwrap();
  68. let sign2dur = sign2start.elapsed().as_micros() as f64;
  69. (sigshare, sign2dur)
  70. })
  71. .unzip();
  72. sign2_timings.extend(sign2_iter_timings);
  73. let combinestart = Instant::now();
  74. let sig = arctic::combine(&pubkey, t, &coalition, &msg, &commits, &sigshares).unwrap();
  75. let combinedur = combinestart.elapsed().as_micros() as f64;
  76. combine_timings.push(combinedur);
  77. assert!(arctic::verify(&pubkey, &msg, &sig));
  78. }
  79. let sign1_mean = mean(&sign1_timings);
  80. let sign1_stddev = stddev(&sign1_timings);
  81. let sign2_mean = mean(&sign2_timings);
  82. let sign2_stddev = stddev(&sign2_timings);
  83. let combine_mean = mean(&combine_timings);
  84. let combine_stddev = stddev(&combine_timings);
  85. println!(
  86. "{} {} {} {} {} {:.1} ± {:.1} {:.1} ± {:.1} {:.1} ± {:.1}",
  87. n,
  88. t,
  89. msglen,
  90. reps,
  91. delta,
  92. sign1_mean,
  93. sign1_stddev,
  94. sign2_mean,
  95. sign2_stddev,
  96. combine_mean,
  97. combine_stddev,
  98. );
  99. }