use serde::{Deserialize, Serialize};
use crate::jwt::JwtError;
pub const MAX_OPERATION_TTL: u64 = 600;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct OperationId(pub [u8; 32]);
impl OperationId {
pub fn expires_at(self) -> u64 {
let mut bytes = [0; 8];
bytes.copy_from_slice(&self.0[..8]);
u64::from_be_bytes(bytes)
}
pub fn validate(self, now: u64) -> Result<(), JwtError> {
let expiry = self.expires_at();
if now >= expiry || expiry - now > MAX_OPERATION_TTL || self.0[8..] == [0; 24] {
return Err(JwtError::InvalidClaims(
"invalid operation identity or deadline".into(),
));
}
Ok(())
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct OperationClaim {
pub id: OperationId,
pub digest: [u8; 32],
pub genesis_id: [u8; 32],
}