use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
use uuid::Uuid;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[repr(u8)]
pub enum PrivacyTier {
Open = 0,
AtRest = 1,
CpuTee = 2,
GpuCc = 3,
GpuTeeIo = 4,
}
impl PrivacyTier {
pub fn requires_attestation(&self) -> bool {
*self >= PrivacyTier::CpuTee
}
pub fn requires_kbs(&self) -> bool {
*self >= PrivacyTier::CpuTee
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum AttestationType {
SevSnp {
report: Vec<u8>,
vcek_cert: Vec<u8>,
platform_cert_chain: Vec<u8>,
},
Tdx {
quote: Vec<u8>,
collateral: Vec<u8>,
},
H100Cc {
gpu_attestation: Vec<u8>,
cpu_attestation: Box<AttestationType>,
},
BlackwellTeeIo {
tee_io_report: Vec<u8>,
mig_config: Option<MigConfiguration>,
},
SimEid {
eid: String,
signature: Vec<u8>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigConfiguration {
pub instance_id: u32,
pub memory_size_mb: u64,
pub compute_units: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NodeSecurityMode {
SoftwareOnly,
SimOnly,
SimTee,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct KeyId(pub Uuid);
impl KeyId {
pub fn new() -> Self {
Self(Uuid::new_v4())
}
}
#[derive(Debug, Clone)]
pub struct RootKey {
pub id: KeyId,
pub created_at: DateTime<Utc>,
pub hsm_handle: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TenantKek {
pub id: KeyId,
pub tenant_id: String,
pub wrapped_key: Vec<u8>, pub created_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentDek {
pub id: KeyId,
pub agent_id: String,
pub tenant_id: String,
pub wrapped_key: Vec<u8>, pub created_at: DateTime<Utc>,
pub rotation_due: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionKey {
pub id: KeyId,
pub agent_id: String,
pub hpke_wrapped_key: Vec<u8>,
pub enclave_public_key: Vec<u8>,
pub created_at: DateTime<Utc>,
pub expires_at: DateTime<Utc>,
pub tier: PrivacyTier,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct KeyAuthorizationRequest {
pub attestation: AttestationType,
pub capability_token: CapabilityToken,
pub session_public_key: Vec<u8>, pub requested_keys: Vec<KeyRequest>,
pub nonce: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct KeyRequest {
pub key_type: KeyRequestType,
pub agent_id: String,
pub tenant_id: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum KeyRequestType {
TenantKek,
AgentDek,
SessionKey { duration_secs: u64 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapabilityToken {
pub id: String,
pub subject: String, pub tier: PrivacyTier,
pub permissions: Vec<String>,
pub issued_at: DateTime<Utc>,
pub expires_at: Option<DateTime<Utc>>,
pub chain_signature: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct KeyAuthorizationResponse {
pub session_id: Uuid,
pub authorized_keys: Vec<AuthorizedKey>,
pub expires_at: DateTime<Utc>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AuthorizedKey {
pub key_id: KeyId,
pub hpke_wrapped_key: Vec<u8>,
pub metadata: KeyMetadata,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct KeyMetadata {
pub key_type: String,
pub tier: PrivacyTier,
pub restrictions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyAuditEntry {
pub id: Uuid,
pub timestamp: DateTime<Utc>,
pub operation: KeyOperation,
pub actor: String,
pub key_id: Option<KeyId>,
pub success: bool,
pub details: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KeyOperation {
Create,
Wrap,
Unwrap,
Rotate,
Destroy,
Authorize,
Revoke,
}