arctic.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 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. for _ in 0..reps {
  57. rng.fill_bytes(&mut msg);
  58. let (commits, sign1_iter_timings): (Vec<RistrettoPoint>, Vec<f64>) = seckeys
  59. .iter()
  60. .map(|key| {
  61. let sign1start = Instant::now();
  62. let commitment = arctic::sign1(&pubkey, key, &coalition, &msg);
  63. let sign1dur = sign1start.elapsed().as_micros() as f64;
  64. (commitment, sign1dur)
  65. })
  66. .unzip();
  67. sign1_timings.extend(sign1_iter_timings);
  68. let (sigshares, sign2_iter_timings): (Vec<Scalar>, Vec<f64>) = seckeys
  69. .iter()
  70. .map(|key| {
  71. let sign2start = Instant::now();
  72. let sigshare = arctic::sign2(&pubkey, key, &coalition, &msg, &commits).unwrap();
  73. let sign2dur = sign2start.elapsed().as_micros() as f64;
  74. (sigshare, sign2dur)
  75. })
  76. .unzip();
  77. sign2_timings.extend(sign2_iter_timings);
  78. let combinestart = Instant::now();
  79. let sig = arctic::combine(&pubkey, t, &coalition, &msg, &commits, &sigshares).unwrap();
  80. let combinedur = combinestart.elapsed().as_micros() as f64;
  81. combine_timings.push(combinedur);
  82. assert!(arctic::verify(&pubkey, &msg, &sig));
  83. }
  84. let sign1_mean = mean(&sign1_timings);
  85. let sign1_stddev = stddev(&sign1_timings);
  86. let sign2_mean = mean(&sign2_timings);
  87. let sign2_stddev = stddev(&sign2_timings);
  88. let combine_mean = mean(&combine_timings);
  89. let combine_stddev = stddev(&combine_timings);
  90. println!(
  91. "{} {} {} {} {} {:.1} ± {:.1} {:.1} ± {:.1} {:.1} ± {:.1}",
  92. n,
  93. t,
  94. coalitionsize,
  95. reps,
  96. delta,
  97. sign1_mean,
  98. sign1_stddev,
  99. sign2_mean,
  100. sign2_stddev,
  101. combine_mean,
  102. combine_stddev,
  103. );
  104. }