1use rand::{CryptoRng, RngCore};
2
3use amcl_wrapper::errors::SerzDeserzError;
4use amcl_wrapper::field_elem::FieldElement;
5use amcl_wrapper::group_elem::{GroupElement, GroupElementVector};
6
7use super::errors::PixelError;
8use crate::util::{
9 calculate_l, calculate_path_factor, from_node_num_to_path, node_successor_paths,
10 path_to_node_num, GeneratorSet,
11};
12
13use std::collections::{HashMap, HashSet};
14use std::mem;
15use crate::{VerkeyGroup, SignatureGroup, ate_2_pairing};
16
17#[derive(Clone, Debug, Serialize, Deserialize)]
19pub struct MasterSecret {
20 pub value: FieldElement,
21}
22
23impl MasterSecret {
24 pub fn new<R: RngCore + CryptoRng>(rng: &mut R) -> Self {
25 Self {
26 value: FieldElement::random_using_rng(rng),
27 }
28 }
29
30 pub fn from_bytes(sk_bytes: &[u8]) -> Result<Self, SerzDeserzError> {
31 FieldElement::from_bytes(sk_bytes).map(|x| Self { value: x })
32 }
33
34 pub fn to_bytes(&self) -> Vec<u8> {
35 self.value.to_bytes()
36 }
37}
38
39#[derive(Clone, Debug, Serialize, Deserialize)]
41pub struct Verkey {
42 pub value: VerkeyGroup,
43}
44
45impl Verkey {
46 pub fn from_master_secret(master_secret: &MasterSecret, generator: &VerkeyGroup) -> Self {
47 Self {
48 value: generator * &master_secret.value,
49 }
50 }
51
52 pub fn aggregate(ver_keys: Vec<&Self>) -> Self {
53 let mut avk= VerkeyGroup::identity();
54 for vk in ver_keys {
55 avk += &vk.value;
56 }
57 Self { value: avk }
58 }
59
60 pub fn from_bytes(vk_bytes: &[u8]) -> Result<Verkey, SerzDeserzError> {
61 VerkeyGroup::from_bytes(vk_bytes).map(|value| Verkey { value })
62 }
63
64 pub fn to_bytes(&self) -> Vec<u8> {
65 self.value.to_bytes()
66 }
67
68 pub fn is_identity(&self) -> bool {
69 if self.value.is_identity() {
70 println!("Verkey point at infinity");
71 return true;
72 }
73 return false;
74 }
75}
76
77#[derive(Clone, Debug, Serialize, Deserialize)]
81pub struct ProofOfPossession {
82 pub value: SignatureGroup,
83}
84
85#[derive(Clone, Debug, Serialize, Deserialize)]
88pub struct Keypair {
89 pub ver_key: Verkey,
90 pub pop: ProofOfPossession,
91}
92
93const PrefixPoP: &[u8] = b"PoP";
94
95impl<'a> Keypair {
96 pub fn new<R: RngCore + CryptoRng>(
97 T: u128,
98 generators: &GeneratorSet,
99 rng: &mut R,
100 db: &'a mut dyn SigKeyDb,
101 ) -> Result<(Self, SigkeyManager), PixelError> {
102 let master_secret = MasterSecret::new(rng);
103 let ver_key = Verkey::from_master_secret(&master_secret, &generators.0);
104 let pop = Self::gen_pop(&ver_key, &master_secret);
105 let sigkey_initial = Sigkey::initial_secret_key(
106 &generators.0,
107 &generators.1.as_slice(),
108 &master_secret,
109 rng,
110 )?;
111 mem::drop(master_secret);
112 let l = calculate_l(T)?;
113 let sigkeys = SigkeyManager::new(T, l, sigkey_initial, db)?;
114 let kp = Self { ver_key, pop };
115 Ok((kp, sigkeys))
116 }
117
118 pub fn gen_pop(vk: &Verkey, x: &MasterSecret) -> ProofOfPossession {
120 ProofOfPossession {
121 value: Self::msg_for_pop(vk) * &x.value,
122 }
123 }
124
125 pub fn verify_pop(pop: &ProofOfPossession, vk: &Verkey, gen: &VerkeyGroup) -> bool {
127 ate_2_pairing(&Self::msg_for_pop(vk), &vk.value, &pop.value, &(-gen)).is_one()
130 }
131
132 fn msg_for_pop(vk: &Verkey) -> SignatureGroup {
133 let mut s = PrefixPoP.to_vec();
134 s.extend_from_slice(&vk.to_bytes());
135 SignatureGroup::from_msg_hash(&s)
136 }
137}
138
139#[derive(Clone, Debug, Serialize, Deserialize)]
142pub struct Sigkey(pub VerkeyGroup, pub Vec<SignatureGroup>);
143
144impl Sigkey {
145 pub fn initial_secret_key<R: RngCore + CryptoRng>(
147 gen: &VerkeyGroup,
148 gens: &[SignatureGroup],
149 master_secret: &MasterSecret,
150 rng: &mut R,
151 ) -> Result<Self, PixelError> {
152 if gens.len() < 3 {
153 return Err(PixelError::NotEnoughGenerators { n: 3 });
154 }
155 let r = FieldElement::random_using_rng(rng);
156 let sk_prime = gen * &r;
158 let mut sk_prime_prime = vec![];
159 let h_x = &gens[0] * &master_secret.value;
161 let h0_r = &gens[1] * &r;
163 sk_prime_prime.push(h_x + &h0_r);
165 for i in 2..gens.len() {
166 sk_prime_prime.push(&gens[i] * &r);
168 }
169 Ok(Self(sk_prime, sk_prime_prime))
170 }
171}
172
173pub struct SigkeyManager {
176 l: u8,
177 T: u128,
178 t: u128,
179}
180
181impl SigkeyManager {
182 pub fn new(T: u128, l: u8, sigkey: Sigkey, db: &mut dyn SigKeyDb) -> Result<Self, PixelError> {
183 let t = 1;
184 db.insert_key(t.clone(), sigkey);
185 Ok(Self { l, T, t})
186 }
187
188 pub fn load(T: u128, l: u8, t: u128) -> Result<Self, PixelError> {
189 Ok(Self { l, T, t})
190 }
191
192 pub fn has_key(t: u128, db: &dyn SigKeyDb) -> bool {
193 db.has_key(t)
194 }
195
196 pub fn get_key<'a>(t: u128, db: &'a dyn SigKeyDb) -> Result<&'a Sigkey, PixelError> {
197 db.get_key(t)
198 }
199
200 pub fn get_current_key<'a>(&self, db: &'a dyn SigKeyDb) -> Result<&'a Sigkey, PixelError> {
201 db.get_key(self.t)
202 }
203
204 pub fn simple_update<R: RngCore + CryptoRng>(
206 &mut self,
207 gens: &GeneratorSet,
208 rng: &mut R,
209 db: &mut dyn SigKeyDb
210 ) -> Result<u128, PixelError> {
211 let path = from_node_num_to_path(self.t, self.l)?;
212 let path_len = path.len();
213 let sk = self.get_current_key(db)?;
214 debug_assert_eq!(self.l as usize + 1, sk.1.len() + path_len);
216
217 let removed_key_idx: u128;
219
220 if path_len < (self.l as usize - 1) {
221 let c = sk.0.clone();
223 let d = sk.1[0].clone();
224
225 let mut sk_left_prime_prime = vec![&d + &sk.1[1]];
227 for i in 2..sk.1.len() {
228 sk_left_prime_prime.push(sk.1[i].clone());
229 }
230
231 let mut path_right = path.clone();
233 path_right.push(2);
234 let path_right_len = path_right.len();
235 let node_num_right = path_to_node_num(&path_right, self.l)?;
236
237 let r = FieldElement::random_using_rng(rng);
238 let mut sk_right_prime_prime = vec![&d + (sk.1[1].double())];
240 let path_factor = calculate_path_factor(path_right, &gens)?;
242 sk_right_prime_prime[0] += (&path_factor * &r);
244
245 for i in 2..sk.1.len() {
246 let e = &sk.1[i] + (&gens.1[path_right_len + i] * &r);
247 sk_right_prime_prime.push(e);
248 }
249
250 db
252 .insert_key(self.t + 1, Sigkey(c.clone(), sk_left_prime_prime));
253 db.insert_key(
254 node_num_right,
255 Sigkey(&c + (&gens.0 * &r), sk_right_prime_prime),
256 );
257 removed_key_idx = self.t.clone();
258 self.t = self.t + 1;
259 } else {
260 removed_key_idx = self.t.clone();
262 self.t = self.t + 1;
263 }
264 db.remove_key(removed_key_idx);
265 Ok(removed_key_idx)
266 }
267
268 pub fn fast_forward_update<R: RngCore + CryptoRng>(
270 &mut self,
271 t: u128,
272 gens: &GeneratorSet,
273 rng: &mut R,
274 db: &mut dyn SigKeyDb
275 ) -> Result<Vec<u128>, PixelError> {
276 if t > ((1 << self.l) - 1) as u128 {
277 return Err(PixelError::InvalidNodeNum { t, l: self.l });
278 }
279
280 if t < self.t {
281 return Err(PixelError::SigkeyUpdateBackward {
282 old_t: t,
283 current_t: self.t,
284 });
285 }
286 if t == self.t {
287 return Err(PixelError::SigkeyAlreadyUpdated { t });
288 }
289
290 if (t - self.t) == 1 {
291 let removed = self.simple_update(gens, rng, db)?;
293 return Ok(vec![removed]);
294 }
295
296 let t_path = from_node_num_to_path(t, self.l)?;
298 let successor_paths = node_successor_paths(t, self.l)?;
299 let successors_to_update_paths: Vec<_> = successor_paths
301 .iter()
302 .filter(|p| {
303 let n = path_to_node_num(p, self.l).unwrap();
304 !Self::has_key(n, db)
305 })
306 .collect();
307
308 match Self::get_key(t, db) {
309 Ok(_) => (), Err(_) => {
311 let pred_sk_path: Vec<u8> = if Self::has_key(1, db) {
313 vec![]
314 } else {
315 let mut cur_path = vec![];
316 for p in &t_path {
317 cur_path.push(*p);
318 if Self::has_key(path_to_node_num(&cur_path, self.l)?, db) {
319 break;
320 }
321 }
322 cur_path
323 };
324 let pred_node_num = path_to_node_num(&pred_sk_path, self.l)?;
325 let pred_sk = { Self::get_key(pred_node_num, db)? };
326 let pred_sk_path_len = pred_sk_path.len();
327
328 let keys = {
329 let mut keys = vec![];
330 let sk_t =
332 Self::derive_key(&t_path, pred_sk, pred_sk_path_len, self.l, gens, rng)?;
333 keys.push((t, sk_t));
334
335 for path in &successors_to_update_paths {
336 let n = path_to_node_num(*path, self.l)?;
337 keys.push((
338 n,
339 Self::derive_key(&path, pred_sk, pred_sk_path_len, self.l, gens, rng)?,
340 ));
341 }
342 keys
343 };
344
345 for (i, k) in keys {
346 db.insert_key(i, k);
347 }
348 }
349 };
350
351 let all_key_node_nums: HashSet<_> = db.get_key_indices();
353 let mut node_num_to_keep: HashSet<u128> = successor_paths
355 .iter()
356 .map(|p| path_to_node_num(p, self.l).unwrap())
357 .collect();
358 node_num_to_keep.insert(t);
360 let nodes_to_remove = all_key_node_nums.difference(&node_num_to_keep);
362 let mut removed = vec![];
363 for n in nodes_to_remove {
364 db.remove_key(*n);
365 removed.push(n.clone())
366 }
367 self.t = t;
368 Ok(removed)
369 }
370
371 fn derive_key<R: RngCore + CryptoRng>(
373 key_path: &[u8],
374 pred_sk: &Sigkey,
375 pred_sk_path_len: usize,
376 l: u8,
377 gens: &GeneratorSet,
378 rng: &mut R,
379 ) -> Result<Sigkey, PixelError> {
380 let key_path_len = key_path.len();
381 let r = FieldElement::random_using_rng(rng);
382
383 let c = pred_sk.0.clone();
384 let mut d = pred_sk.1[0].clone();
385 for i in pred_sk_path_len..key_path_len {
386 if key_path[i] == 1 {
387 d += &pred_sk.1[i - pred_sk_path_len + 1];
388 } else {
389 d += &pred_sk.1[i - pred_sk_path_len + 1].double();
390 }
391 }
392 let path_factor = calculate_path_factor(key_path.to_vec(), &gens)?;
393 d += (&path_factor * &r);
394
395 let sk_t_prime = c + (&gens.0 * &r);
396 let mut sk_t_prime_prime = vec![];
397 sk_t_prime_prime.push(d);
398
399 let pred_sk_len = pred_sk.1.len();
400 let gen_len = gens.1.len();
401 for i in (key_path_len + 1)..(l as usize + 1) {
402 let j = l as usize - i + 1;
403 let a = &pred_sk.1[pred_sk_len - j];
404 let b = &(&gens.1[gen_len - j] * &r);
405 let e = a + b;
406 sk_t_prime_prime.push(e);
407 }
408
409 Ok(Sigkey(sk_t_prime, sk_t_prime_prime))
410 }
411}
412
413pub trait SigKeyDb {
416 fn insert_key(&mut self, t: u128, sig_key: Sigkey);
417
418 fn remove_key(&mut self, t: u128);
420
421 fn has_key(&self, t: u128) -> bool;
422
423 fn get_key(&self, t: u128) -> Result<&Sigkey, PixelError>;
424
425 fn get_key_indices(&self) -> HashSet<u128>;
427}
428
429pub struct InMemorySigKeyDb {
431 keys: HashMap<u128, Sigkey>,
432}
433
434impl SigKeyDb for InMemorySigKeyDb {
435 fn insert_key(&mut self, t: u128, sig_key: Sigkey) {
436 self.keys.insert(t, sig_key);
437 }
438
439 fn remove_key(&mut self, t: u128) {
440 let old = self.keys.remove(&t);
441 debug_assert!(old.is_some());
442 mem::drop(old.unwrap());
443 }
444
445 fn has_key(&self, t: u128) -> bool {
446 self.keys.contains_key(&t)
447 }
448
449 fn get_key(&self, t: u128) -> Result<&Sigkey, PixelError> {
450 match self.keys.get(&t) {
451 Some(key) => Ok(key),
452 None => Err(PixelError::SigkeyNotFound { t }),
453 }
454 }
455
456 fn get_key_indices(&self) -> HashSet<u128> {
457 self.keys.keys().map(|k| *k).collect()
458 }
459}
460
461impl InMemorySigKeyDb {
462 pub fn new() -> Self {
463 let keys = HashMap::<u128, Sigkey>::new();
464 Self { keys }
465 }
466}
467
468#[cfg(test)]
470pub fn setup<'a, R: RngCore + CryptoRng>(
471 T: u128,
472 prefix: &str,
473 rng: &mut R,
474 db: &'a mut dyn SigKeyDb,
475) -> Result<(GeneratorSet, Verkey, SigkeyManager, ProofOfPossession), PixelError> {
476 let generators = GeneratorSet::new(T, prefix)?;
477 let (keypair, sigkeys) = Keypair::new(T, &generators, rng, db)?;
478 Ok((generators, keypair.ver_key, sigkeys, keypair.pop))
479}
480
481#[cfg(test)]
482mod tests {
483 use super::*;
484 use rand::rngs::ThreadRng;
485 use std::time::{Duration, Instant};
487
488 fn fast_forward_and_check<R: RngCore + CryptoRng>(
489 set: &mut SigkeyManager,
490 t: u128,
491 gens: &GeneratorSet,
492 mut rng: &mut R,
493 db: &mut dyn SigKeyDb
494 ) {
495 set.fast_forward_update(t, &gens, &mut rng, db).unwrap();
496 assert_eq!(set.t, t);
497 for i in 1..t {
498 assert!(!SigkeyManager::has_key(i as u128, db));
499 }
500 assert!(SigkeyManager::has_key(t, db));
501 }
502
503 #[test]
504 fn test_proof_of_possession() {
505 let mut rng = rand::thread_rng();
506 let T1 = 7;
507 let mut db = InMemorySigKeyDb::new();
508 let (gens, verkey, _, PoP) =
509 setup::<ThreadRng>(T1, "test_pixel", &mut rng, &mut db).unwrap();
510 assert!(Keypair::verify_pop(&PoP, &verkey, &gens.0))
511 }
512
513 #[test]
514 fn test_setup_with_less_number_of_genertors() {
515 let mut rng = rand::thread_rng();
516 let T = 7;
517 let generators = GeneratorSet::new(T, "test_pixel").unwrap();
518 let mut db = InMemorySigKeyDb::new();
519 assert!(Keypair::new(3, &generators, &mut rng, &mut db).is_ok());
520 assert!(Keypair::new(7, &generators, &mut rng, &mut db).is_ok());
521 assert!(Keypair::new(8, &generators, &mut rng, &mut db).is_err());
522 assert!(Keypair::new(9, &generators, &mut rng, &mut db).is_err());
523 }
524
525 #[test]
526 fn test_setup() {
527 let mut rng = rand::thread_rng();
528 let T1 = 7;
529 let l1 = calculate_l(T1).unwrap();
530 let mut db1 = InMemorySigKeyDb::new();
531 let (_, _, set1, _) = setup::<ThreadRng>(T1, "test_pixel", &mut rng, &mut db1).unwrap();
532 let sk1 = SigkeyManager::get_key(1u128, &db1).unwrap();
533 assert_eq!(sk1.1.len() as u8, l1 + 1);
534
535 let T2 = 15;
536 let l2 = calculate_l(T2).unwrap();
537 let mut db2 = InMemorySigKeyDb::new();
538 let (_, _, set2, _) = setup::<ThreadRng>(T2, "test_pixel", &mut rng, &mut db2).unwrap();
539 let sk2 = SigkeyManager::get_key(1u128, &db2).unwrap();
540 assert_eq!(sk2.1.len() as u8, l2 + 1);
541 }
542
543 #[test]
544 fn test_simple_key_update_7() {
545 let mut rng = rand::thread_rng();
548 let T = 7;
549 let l = calculate_l(T).unwrap();
550 let mut db = InMemorySigKeyDb::new();
551 let (gens, _, mut set, _) = setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
552
553 set.simple_update(&gens, &mut rng, &mut db).unwrap();
555 let sk_left = SigkeyManager::get_key(2u128, &db).unwrap();
556 assert_eq!(sk_left.1.len() as u8, l);
557 let sk_right = SigkeyManager::get_key(5u128, &db).unwrap();
558 assert_eq!(sk_right.1.len() as u8, l);
559 assert_eq!(set.t, 2);
560 assert!(!SigkeyManager::has_key(1u128, &db));
561
562 set.simple_update(&gens, &mut rng, &mut db).unwrap();
564 let sk_left = SigkeyManager::get_key(3u128, &db).unwrap();
565 assert_eq!(sk_left.1.len() as u8, l - 1);
566 let sk_right = SigkeyManager::get_key(4u128, &db).unwrap();
567 assert_eq!(sk_right.1.len() as u8, l - 1);
568 assert_eq!(set.t, 3);
569 assert!(!SigkeyManager::has_key(2u128, &db));
570 assert!(SigkeyManager::has_key(5u128, &db));
571
572 set.simple_update(&gens, &mut rng, &mut db).unwrap();
574 assert_eq!(set.t, 4);
575 assert!(!SigkeyManager::has_key(3u128, &db));
576 assert!(SigkeyManager::has_key(4u128, &db));
577 assert!(SigkeyManager::has_key(5u128, &db));
578
579 set.simple_update(&gens, &mut rng, &mut db).unwrap();
581 assert_eq!(set.t, 5);
582 assert!(!SigkeyManager::has_key(4u128, &db));
583
584 set.simple_update(&gens, &mut rng, &mut db).unwrap();
586 assert_eq!(set.t, 6);
587 assert!(!SigkeyManager::has_key(5u128, &db));
588 assert!(SigkeyManager::has_key(6u128, &db));
589 assert!(SigkeyManager::has_key(7u128, &db));
590
591 set.simple_update(&gens, &mut rng, &mut db).unwrap();
593 assert_eq!(set.t, 7);
594 assert!(!SigkeyManager::has_key(6u128, &db));
595 assert!(SigkeyManager::has_key(7u128, &db));
596 }
597
598 #[test]
599 fn test_simple_key_update_15() {
600 let mut rng = rand::thread_rng();
603
604 let T = 15;
605 let l = calculate_l(T).unwrap();
606 let mut db = InMemorySigKeyDb::new();
607 let (gens, _, mut set, _) = setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
608
609 set.simple_update(&gens, &mut rng, &mut db).unwrap();
611 let sk_left = SigkeyManager::get_key(2u128, &db).unwrap();
612 assert_eq!(sk_left.1.len() as u8, l);
613 let sk_right = SigkeyManager::get_key(9u128, &db).unwrap();
614 assert_eq!(sk_right.1.len() as u8, l);
615 assert_eq!(set.t, 2);
616 assert!(!SigkeyManager::has_key(1u128, &db));
617 assert!(SigkeyManager::has_key(9u128, &db));
618
619 set.simple_update(&gens, &mut rng, &mut db).unwrap();
621 let sk_left = SigkeyManager::get_key(3u128, &db).unwrap();
622 assert_eq!(sk_left.1.len() as u8, l - 1);
623 let sk_right = SigkeyManager::get_key(6u128, &db).unwrap();
624 assert_eq!(sk_right.1.len() as u8, l - 1);
625 assert_eq!(set.t, 3);
626 assert!(!SigkeyManager::has_key(2u128, &db));
627 assert!(SigkeyManager::has_key(9u128, &db));
628
629 set.simple_update(&gens, &mut rng, &mut db).unwrap();
631 assert_eq!(set.t, 4);
632 assert!(!SigkeyManager::has_key(3u128, &db));
633 assert!(SigkeyManager::has_key(5u128, &db));
634 assert!(SigkeyManager::has_key(6u128, &db));
635 assert!(SigkeyManager::has_key(9u128, &db));
636
637 set.simple_update(&gens, &mut rng, &mut db).unwrap();
639 assert_eq!(set.t, 5);
640 assert!(!SigkeyManager::has_key(4u128, &db));
641 assert!(SigkeyManager::has_key(6u128, &db));
642 assert!(SigkeyManager::has_key(9u128, &db));
643
644 set.simple_update(&gens, &mut rng, &mut db).unwrap();
646 assert_eq!(set.t, 6);
647 assert!(!SigkeyManager::has_key(5u128, &db));
648 assert!(SigkeyManager::has_key(6u128, &db));
649 assert!(SigkeyManager::has_key(9u128, &db));
650
651 set.simple_update(&gens, &mut rng, &mut db).unwrap();
653 assert_eq!(set.t, 7);
654 assert!(!SigkeyManager::has_key(6u128, &db));
655 assert!(SigkeyManager::has_key(8u128, &db));
656 assert!(SigkeyManager::has_key(9u128, &db));
657
658 set.simple_update(&gens, &mut rng, &mut db).unwrap();
660
661 set.simple_update(&gens, &mut rng, &mut db).unwrap();
663
664 set.simple_update(&gens, &mut rng, &mut db).unwrap();
666 assert_eq!(set.t, 10);
667 assert!(!SigkeyManager::has_key(9u128, &db));
668 assert!(SigkeyManager::has_key(13u128, &db));
669
670 set.simple_update(&gens, &mut rng, &mut db).unwrap();
672 assert_eq!(set.t, 11);
673 assert!(!SigkeyManager::has_key(10u128, &db));
674 assert!(SigkeyManager::has_key(12u128, &db));
675 assert!(SigkeyManager::has_key(13u128, &db));
676 }
677
678 #[test]
679 fn test_fast_forward_key_update_through_simple_key_update_7() {
680 let mut rng = rand::thread_rng();
683 let T = 7;
684 let l = calculate_l(T).unwrap();
685 let mut db = InMemorySigKeyDb::new();
686 let (gens, _, mut set, _) = setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
687 assert_eq!(set.t, 1);
688
689 set.fast_forward_update(2u128, &gens, &mut rng, &mut db).unwrap();
691 let sk_left = SigkeyManager::get_key(2u128, &db).unwrap();
692 assert_eq!(sk_left.1.len() as u8, l);
693 let sk_right = SigkeyManager::get_key(5u128, &db).unwrap();
694 assert_eq!(sk_right.1.len() as u8, l);
695 assert_eq!(set.t, 2);
696 assert!(!SigkeyManager::has_key(1u128, &db));
697
698 set.fast_forward_update(3u128, &gens, &mut rng, &mut db).unwrap();
700 let sk_left = SigkeyManager::get_key(3u128, &db).unwrap();
701 assert_eq!(sk_left.1.len() as u8, l - 1);
702 let sk_right = SigkeyManager::get_key(4u128, &db).unwrap();
703 assert_eq!(sk_right.1.len() as u8, l - 1);
704 assert_eq!(set.t, 3);
705 assert!(!SigkeyManager::has_key(2u128, &db));
706 assert!(SigkeyManager::has_key(5u128, &db));
707
708 set.fast_forward_update(4u128, &gens, &mut rng, &mut db).unwrap();
710 assert_eq!(set.t, 4);
711 assert!(!SigkeyManager::has_key(3u128, &db));
712 assert!(SigkeyManager::has_key(4u128, &db));
713 assert!(SigkeyManager::has_key(5u128, &db));
714
715 set.fast_forward_update(5u128, &gens, &mut rng, &mut db).unwrap();
717 assert_eq!(set.t, 5);
718 assert!(!SigkeyManager::has_key(4u128, &db));
719
720 set.fast_forward_update(6u128, &gens, &mut rng, &mut db).unwrap();
722 assert_eq!(set.t, 6);
723 assert!(!SigkeyManager::has_key(5u128, &db));
724 assert!(SigkeyManager::has_key(6u128, &db));
725 assert!(SigkeyManager::has_key(7u128, &db));
726
727 set.fast_forward_update(7u128, &gens, &mut rng, &mut db).unwrap();
729 assert_eq!(set.t, 7);
730 assert!(!SigkeyManager::has_key(6u128, &db));
731 assert!(SigkeyManager::has_key(7u128, &db));
732 }
733
734 #[test]
735 fn test_fast_forward_key_update_7() {
736 let mut rng = rand::thread_rng();
739 let T = 7;
740 let l = calculate_l(T).unwrap();
741
742 let mut t = 1u128;
743 {
744 let mut db = InMemorySigKeyDb::new();
745 let (gens, _, mut set, _) =
746 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
747
748 t = 3;
749 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
750 assert!(SigkeyManager::has_key(4u128, &db));
751 assert!(SigkeyManager::has_key(5u128, &db));
752 }
753
754 {
755 let mut db = InMemorySigKeyDb::new();
756 let (gens, _, mut set, _) =
757 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
758
759 t = 4;
760 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
761 assert!(SigkeyManager::has_key(4u128, &db));
762 assert!(SigkeyManager::has_key(5u128, &db));
763 }
764
765 {
766 let mut db = InMemorySigKeyDb::new();
767 let (gens, _, mut set, _) =
768 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
769
770 t = 5;
771 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
772 assert!(SigkeyManager::has_key(5u128, &db));
773 }
774
775 {
776 let mut db = InMemorySigKeyDb::new();
777 let (gens, _, mut set, _) =
778 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
779
780 t = 6;
781 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
782 assert!(SigkeyManager::has_key(6u128, &db));
783 assert!(SigkeyManager::has_key(7u128, &db));
784 }
785 }
786
787 #[test]
788 fn test_fast_forward_key_update_repeat_7() {
789 let mut rng = rand::thread_rng();
792 let T = 7;
793 let mut t = 1u128;
794
795 {
796 let mut db = InMemorySigKeyDb::new();
797 let (gens, _, mut set, _) =
798 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
799
800 t = 2;
801 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
802 assert!(SigkeyManager::has_key(5u128, &db));
803
804 t = 4;
805 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
806 assert!(SigkeyManager::has_key(5u128, &db));
807
808 t = 6;
809 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
810 assert!(SigkeyManager::has_key(6u128, &db));
811 assert!(SigkeyManager::has_key(7u128, &db));
812 }
813
814 {
815 let mut db = InMemorySigKeyDb::new();
816 let (gens, _, mut set, _) =
817 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
818
819 t = 3;
820 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
821 assert!(SigkeyManager::has_key(4u128, &db));
822 assert!(SigkeyManager::has_key(5u128, &db));
823
824 t = 5;
825 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
826
827 t = 7;
828 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
829 }
830
831 {
832 let mut db = InMemorySigKeyDb::new();
833 let (gens, _, mut set, _) =
834 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
835
836 t = 4;
837 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
838 assert!(SigkeyManager::has_key(5u128, &db));
839
840 t = 7;
841 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
842 }
843 }
844
845 #[test]
846 fn test_fast_forward_key_update_15() {
847 let mut rng = rand::thread_rng();
850
851 let T = 15;
852 let mut t;
853
854 {
855 let mut db = InMemorySigKeyDb::new();
856 let (gens, _, mut set, _) =
857 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
858
859 t = 3;
860 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
861 assert!(SigkeyManager::has_key(6u128, &db));
862 assert!(SigkeyManager::has_key(9u128, &db));
863
864 t = 5;
865 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
866 assert!(SigkeyManager::has_key(6u128, &db));
867 assert!(SigkeyManager::has_key(9u128, &db));
868
869 t = 9;
870 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
871 }
872
873 {
874 let mut db = InMemorySigKeyDb::new();
875 let (gens, _, mut set, _) =
876 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
877
878 t = 4;
879 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
880 assert!(SigkeyManager::has_key(5u128, &db));
881 assert!(SigkeyManager::has_key(6u128, &db));
882 assert!(SigkeyManager::has_key(9u128, &db));
883
884 t = 10;
885 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
886 assert!(SigkeyManager::has_key(13u128, &db));
887
888 t = 13;
889 fast_forward_and_check(&mut set, t, &gens, &mut rng, &mut db);
890 }
891 }
892
893 #[test]
894 fn timing_simple_key_update_65535() {
895 let mut rng = rand::thread_rng();
897
898 let T = 65535;
899 let l = calculate_l(T).unwrap();
900 let mut db = InMemorySigKeyDb::new();
901 let (gens, _, mut set, _) = setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
902
903 for i in 1..20 {
904 let start = Instant::now();
905 set.simple_update(&gens, &mut rng, &mut db).unwrap();
906 println!(
907 "For l={}, time to update key from t={} to t={} is {:?}",
908 l,
909 i,
910 i + 1,
911 start.elapsed()
912 );
913 }
914 }
915
916 #[test]
917 fn timing_simple_key_update_1048575() {
918 let mut rng = rand::thread_rng();
920
921 let T = 1048575;
922 let l = calculate_l(T).unwrap();
923 let mut db = InMemorySigKeyDb::new();
924 let (gens, _, mut set, _) = setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
925
926 for i in 1..40 {
927 let start = Instant::now();
928 set.simple_update(&gens, &mut rng, &mut db).unwrap();
929 println!(
930 "For l={}, time to update key from t={} to t={} is {:?}",
931 l,
932 i,
933 i + 1,
934 start.elapsed()
935 );
936 }
937 }
938
939 #[test]
940 fn timing_fast_forward_key_update_65535() {
941 let mut rng = rand::thread_rng();
944 let T = 65535;
945 let l = calculate_l(T).unwrap();
946
947 {
948 let mut db = InMemorySigKeyDb::new();
949 let (gens, _, mut set, _) =
950 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
951
952 let start = Instant::now();
953 set.fast_forward_update(3, &gens, &mut rng, &mut db).unwrap();
954 println!(
955 "For l={}, time to update key from t=1 to t=3 is {:?}",
956 l,
957 start.elapsed()
958 );
959
960 let start = Instant::now();
961 set.fast_forward_update(15, &gens, &mut rng, &mut db).unwrap();
962 println!(
963 "For l={}, time to update key from t=3 to t=15 is {:?}",
964 l,
965 start.elapsed()
966 );
967
968 let start = Instant::now();
969 set.fast_forward_update(35, &gens, &mut rng, &mut db).unwrap();
970 println!(
971 "For l={}, time to update key from t=15 to t=35 is {:?}",
972 l,
973 start.elapsed()
974 );
975
976 let start = Instant::now();
977 set.fast_forward_update(10000, &gens, &mut rng, &mut db).unwrap();
978 println!(
979 "For l={}, time to update key from t=35 to t=10000 is {:?}",
980 l,
981 start.elapsed()
982 );
983
984 let start = Instant::now();
985 set.fast_forward_update(30000, &gens, &mut rng, &mut db).unwrap();
986 println!(
987 "For l={}, time to update key from t=10000 to t=30000 is {:?}",
988 l,
989 start.elapsed()
990 );
991
992 let start = Instant::now();
993 set.fast_forward_update(65535, &gens, &mut rng, &mut db).unwrap();
994 println!(
995 "For l={}, time to update key from t=30000 to t=65535 is {:?}",
996 l,
997 start.elapsed()
998 );
999 }
1000
1001 {
1002 let mut db = InMemorySigKeyDb::new();
1003 let (gens, _, mut set, _) =
1004 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
1005
1006 let start = Instant::now();
1007 set.fast_forward_update(50000, &gens, &mut rng, &mut db).unwrap();
1008 println!(
1009 "For l={}, time to update key from t=1 to t=50000 is {:?}",
1010 l,
1011 start.elapsed()
1012 );
1013
1014 let start = Instant::now();
1015 set.fast_forward_update(65535, &gens, &mut rng, &mut db).unwrap();
1016 println!(
1017 "For l={}, time to update key from t=50000 to t=65535 is {:?}",
1018 l,
1019 start.elapsed()
1020 );
1021 }
1022 }
1023
1024 #[test]
1025 fn timing_fast_forward_key_update_1048575() {
1026 let mut rng = rand::thread_rng();
1028
1029 let T = 1048575;
1030 let l = calculate_l(T).unwrap();
1031
1032 {
1033 let mut db = InMemorySigKeyDb::new();
1034 let (gens, _, mut set, _) =
1035 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
1036
1037 let start = Instant::now();
1038 set.fast_forward_update(3, &gens, &mut rng, &mut db).unwrap();
1039 println!(
1040 "For l={}, time to update key from t=1 to t=3 is {:?}",
1041 l,
1042 start.elapsed()
1043 );
1044
1045 let start = Instant::now();
1046 set.fast_forward_update(19, &gens, &mut rng, &mut db).unwrap();
1047 println!(
1048 "For l={}, time to update key from t=3 to t=19 is {:?}",
1049 l,
1050 start.elapsed()
1051 );
1052
1053 let start = Instant::now();
1054 set.fast_forward_update(4096, &gens, &mut rng, &mut db).unwrap();
1055 println!(
1056 "For l={}, time to update key from t=19 to t=4096 is {:?}",
1057 l,
1058 start.elapsed()
1059 );
1060
1061 let start = Instant::now();
1062 set.fast_forward_update(1048550, &gens, &mut rng, &mut db).unwrap();
1063 println!(
1064 "For l={}, time to update key from t=4096 to t=1048550 is {:?}",
1065 l,
1066 start.elapsed()
1067 );
1068 }
1069
1070 {
1071 let mut db = InMemorySigKeyDb::new();
1072 let (gens, _, mut set, _) =
1073 setup::<ThreadRng>(T, "test_pixel", &mut rng, &mut db).unwrap();
1074
1075 let start = Instant::now();
1076 set.fast_forward_update(19, &gens, &mut rng, &mut db).unwrap();
1077 println!(
1078 "For l={}, time to update key from t=1 to t=19 is {:?}",
1079 l,
1080 start.elapsed()
1081 );
1082
1083 let start = Instant::now();
1084 set.fast_forward_update(65535, &gens, &mut rng, &mut db).unwrap();
1085 println!(
1086 "For l={}, time to update key from t=19 to t=65535 is {:?}",
1087 l,
1088 start.elapsed()
1089 );
1090
1091 let start = Instant::now();
1092 set.fast_forward_update(1048575, &gens, &mut rng, &mut db).unwrap();
1093 println!(
1094 "For l={}, time to update key from t=65535 to t=1048575 is {:?}",
1095 l,
1096 start.elapsed()
1097 );
1098 }
1099 }
1100 }