use serde::{Deserialize, Serialize};
use crate::context_provision::ContextProvisionBundle;
use crate::credentials::CredentialBundle;
use crate::did_secrets::DidSecretsBundle;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct LabeledKey {
pub label: String,
pub key_b64: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SealedPayloadV1 {
AdminCredential(Box<CredentialBundle>),
ContextProvision(Box<ContextProvisionBundle>),
DidSecrets(Box<DidSecretsBundle>),
AdminKeySet(Vec<LabeledKey>),
RawPrivateKey(RawPrivateKey),
TemplateBootstrap(Box<super::template_bootstrap::TemplateBootstrapPayload>),
AdminRotation(Box<super::template_bootstrap::AdminRotationPayload>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawPrivateKey {
pub key_type: String,
pub key_bytes_b64: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DidSignedAssertion {
pub did: String,
pub signature_b64: String,
pub verification_method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AttestationQuoteAssertion {
pub format: String,
pub quote_b64: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AssertionProof {
DidSigned(DidSignedAssertion),
Attested(AttestationQuoteAssertion),
PinnedOnly,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ProducerAssertion {
pub producer_did: String,
pub proof: AssertionProof,
}
#[derive(Debug, Clone)]
pub struct SealedBundle {
pub bundle_id: [u8; 16],
pub digest_algo: String,
pub chunks: Vec<ArmoredChunk>,
}
#[derive(Debug, Clone)]
pub struct ArmoredChunk {
pub chunk_index: u16,
pub total_chunks: u16,
pub sealed_bytes: Vec<u8>,
}