use core::time::Duration;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AlgorithmHint {
Symmetric128,
Symmetric256,
Ed25519,
X25519,
P256,
P384,
Rsa2048,
Rsa3072,
Rsa4096,
Hmac,
Other,
}
#[derive(Debug, Clone)]
pub struct KeyMetadata {
registered_since_epoch: Duration,
length: usize,
algorithm: Option<AlgorithmHint>,
}
impl KeyMetadata {
#[allow(dead_code)] #[must_use]
pub(crate) fn new(
registered_since_epoch: Duration,
length: usize,
algorithm: Option<AlgorithmHint>,
) -> Self {
Self {
registered_since_epoch,
length,
algorithm,
}
}
#[must_use]
pub fn length(&self) -> usize {
self.length
}
#[must_use]
pub fn algorithm(&self) -> Option<AlgorithmHint> {
self.algorithm
}
#[must_use]
pub fn registered_since_epoch(&self) -> Duration {
self.registered_since_epoch
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fields_round_trip() {
let meta = KeyMetadata::new(
Duration::from_secs(1_700_000_000),
32,
Some(AlgorithmHint::Symmetric256),
);
assert_eq!(meta.length(), 32);
assert_eq!(meta.algorithm(), Some(AlgorithmHint::Symmetric256));
assert_eq!(
meta.registered_since_epoch(),
Duration::from_secs(1_700_000_000)
);
}
#[test]
fn algorithm_hint_is_optional() {
let meta = KeyMetadata::new(Duration::ZERO, 16, None);
assert!(meta.algorithm().is_none());
}
}