use super::*;
#[derive(Debug, Serialize, Deserialize)]
#[cfg_attr(test, derive(PartialEq))]
pub(crate) struct ResumptionSecretStore {
number_of_secrets: usize,
resumption_secrets: Vec<(GroupEpoch, ResumptionSecret)>,
cursor: usize,
}
impl ResumptionSecretStore {
pub(crate) fn new(number_of_secrets: usize) -> Self {
Self {
number_of_secrets,
resumption_secrets: vec![],
cursor: 0,
}
}
pub(crate) fn add(&mut self, epoch: GroupEpoch, resumption_secret: ResumptionSecret) {
if self.number_of_secrets == 0 {
return;
}
let item = (epoch, resumption_secret);
if self.resumption_secrets.len() < self.number_of_secrets {
self.resumption_secrets.push(item);
self.cursor += 1;
} else {
self.cursor += 1;
self.cursor %= self.resumption_secrets.len();
self.resumption_secrets[self.cursor] = item;
}
}
pub(crate) fn get(&self, epoch: GroupEpoch) -> Option<&ResumptionSecret> {
self.resumption_secrets
.iter()
.find(|&(e, _s)| e == &epoch)
.map(|(_e, s)| s)
}
}