Skip to main content

pixel_sig/
keys.rs

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/// MasterSecret will be cleared on drop as FieldElement is cleared on drop
18#[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// The public key can be in group G1 or G2.
40#[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/// Proof of Possession of signing key. It is a signature on the verification key and can be
78/// group in G1 or G2. But it is in different group than Verkey.
79/// If Verkey is in G2 then proof of possession is in G1 and vice versa.
80#[derive(Clone, Debug, Serialize, Deserialize)]
81pub struct ProofOfPossession {
82    pub value: SignatureGroup,
83}
84
85/// Keypair consisting of a master secret, the corresponding verkey and the proof of possession
86/// Type GPrime denotes group for public key and type G denotes group for proof of possession.
87#[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    /// Generate proof of possession
119    pub fn gen_pop(vk: &Verkey, x: &MasterSecret) -> ProofOfPossession {
120        ProofOfPossession {
121            value: Self::msg_for_pop(vk) * &x.value,
122        }
123    }
124
125    /// Verify proof of possession
126    pub fn verify_pop(pop: &ProofOfPossession, vk: &Verkey, gen: &VerkeyGroup) -> bool {
127        // check e(pop, gen) == e(hash(PoP||vk), vk) which is same as e(hash(PoP||vk), vk) * e(pop, gen)^-1 == 1
128        // e(hash(PoP||vk), vk) * e(pop, gen)^-1 = e(hash(PoP||vk), vk) * e(pop, gen^-1)
129        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/// Secret key sk can be seen as (sk', sk'') where sk'' is itself a vector with initial (and max) length l+1
140/// Sigkey will be cleared on drop as both G1 and G2 elements are cleared on drop
141#[derive(Clone, Debug, Serialize, Deserialize)]
142pub struct Sigkey(pub VerkeyGroup, pub Vec<SignatureGroup>);
143
144impl Sigkey {
145    /// Create secret key for the beginning, i.e. t=1
146    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        // g^r
157        let sk_prime = gen * &r;
158        let mut sk_prime_prime = vec![];
159        // h^x
160        let h_x = &gens[0] * &master_secret.value;
161        // h_0^r
162        let h0_r = &gens[1] * &r;
163        // h^x * h_0^r
164        sk_prime_prime.push(h_x + &h0_r);
165        for i in 2..gens.len() {
166            // h_i^r
167            sk_prime_prime.push(&gens[i] * &r);
168        }
169        Ok(Self(sk_prime, sk_prime_prime))
170    }
171}
172
173/// `T` denotes the maximum time period supported and `t` denotes the current time period.
174/// #[derive(Clone, Debug, Serialize, Deserialize)]
175pub 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    /// Update time by 1
205    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        // sk.1.len() + path_len == l+1
215        debug_assert_eq!(self.l as usize + 1, sk.1.len() + path_len);
216
217        // Index of key that will be removed
218        let removed_key_idx: u128;
219
220        if path_len < (self.l as usize - 1) {
221            // Create signing keys for left and right child
222            let c = sk.0.clone();
223            let d = sk.1[0].clone();
224
225            // key for left child
226            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            // key for right child
232            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            // d * e_j^2
239            let mut sk_right_prime_prime = vec![&d + (sk.1[1].double())];
240            // h_0 * h_1^path[0] * h_2^path[1] * ... h_k^path[-1]
241            let path_factor = calculate_path_factor(path_right, &gens)?;
242            // d * e_j^2 * (h_0 * h_1^path[0] * h_2^path[1] * ... h_k^path[-1])^r
243            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            // Update the set with keys for both children and remove key corresponding to current time period
251            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            // Current node is at leaf, so remove current leaf. Already have rest of the keys.
261            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    /// Update time to given `t`
269    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            // Simple update is more efficient
292            let removed = self.simple_update(gens, rng, db)?;
293            return Ok(vec![removed]);
294        }
295
296        // Find key for t and all of t's successors
297        let t_path = from_node_num_to_path(t, self.l)?;
298        let successor_paths = node_successor_paths(t, self.l)?;
299        // The set might already have keys for some successors, filter them out.
300        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(_) => (), // Key and thus all needed successors already present
310            Err(_) => {
311                // Key absent. Calculate the highest predecessor path and key to derive necessary children.
312                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                    // Calculate key for time t
331                    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        // Remove all nodes except successors and the node for time t.
352        let all_key_node_nums: HashSet<_> = db.get_key_indices();
353        // Keep successors
354        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        // Keep the node for time being forwarded to
359        node_num_to_keep.insert(t);
360        // Remove all others
361        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    /// Derive signing key denoted by path `key_path` using its predecessor node's signing key `pred_sk`
372    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
413/// Key-value database interface that needs to be implemented for storing signing keys.
414/// Signing key are db values whereas db keys are the time period for which the signing key needs to be used.
415pub trait SigKeyDb {
416    fn insert_key(&mut self, t: u128, sig_key: Sigkey);
417
418    /// Removes key from database and zeroes it out
419    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    /// Returns indices (time periods) for all present keys
426    fn get_key_indices(&self) -> HashSet<u128>;
427}
428
429/// An in-memory database for storing signing keys. Uses hashmap. Should only be used for testing.
430pub 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/// Create master secret, verkey, PoP, SigkeyManager for t = 1, a set with only 1 key and proof of possession.
469#[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    // For benchmarking
486    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        // Create key and then update time by 1 repeatedly
546
547        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        // t=2
554        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        // t=3
563        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        // t=4
573        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        // t=5
580        set.simple_update(&gens, &mut rng, &mut db).unwrap();
581        assert_eq!(set.t, 5);
582        assert!(!SigkeyManager::has_key(4u128, &db));
583
584        // t=6
585        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        // t=7
592        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        // Create key and then update time by 1 repeatedly
601
602        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        // t=2
610        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        // t=3
620        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        // t=4
630        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        // t=5
638        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        // t=6
645        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        // t=7
652        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        // t=8
659        set.simple_update(&gens, &mut rng, &mut db).unwrap();
660
661        // t=9
662        set.simple_update(&gens, &mut rng, &mut db).unwrap();
663
664        // t=10
665        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        // t=11
671        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        // Create key and then fast forward update time
681
682        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        // t=2
690        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        // t=3
699        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        // t=4
709        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        // t=5
716        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        // t=6
721        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        // t=7
728        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        // Create key and then fast forward update
737
738        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        // Create key and then fast forward update repeatedly
790
791        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        // Create key and then fast forward update
848
849        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        // For tree with l=16, supports 2^16 - 1 = 65535 keys
896        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        // For tree with l=20, supports 2^20 - 1 = 1048575 keys
919        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        // For tree with l=16, supports 2^16 - 1 = 65535 keys
942
943        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        // For tree with l=20, supports 2^20 - 1 = 1048575 keys
1027        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    // TODO: More tests with random values using node_successors function.
1101}