use serde::{Deserialize, Serialize};
use super::registry::Registry;
pub type Version = u16;
pub const CURRENT_VERSION: Version = 1;
pub type PrfSalt = Vec<u8>;
pub type WrappedKey = Vec<u8>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SealedCredential {
#[serde(with = "crate::wire::b64bytes")]
pub credential_id: Vec<u8>,
#[serde(with = "crate::wire::b64bytes")]
pub prf_salt: PrfSalt,
#[serde(with = "crate::wire::b64bytes")]
pub wrapped_key: WrappedKey,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SealedState {
pub version: Version,
pub registry: Registry,
pub credentials: Vec<SealedCredential>,
#[serde(with = "crate::wire::b64bytes")]
pub ciphertext: Vec<u8>,
}
impl SealedState {
pub fn find_credential(&self, credential_id: &[u8]) -> Option<&SealedCredential> {
self.credentials
.iter()
.find(|c| c.credential_id == credential_id)
}
pub fn credential_iter(&self) -> impl Iterator<Item = (&[u8], &[u8])> {
self.credentials
.iter()
.map(|c| (c.credential_id.as_slice(), c.prf_salt.as_slice()))
}
}