1use serde::{Serialize, Deserialize};
2use crate::suite::SuiteId;
3use crate::pae::pae_v2_compat;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct RecipientEntry {
7 pub label: String,
9 #[serde(with="serde_bytes")]
11 pub mlkem_ct: Vec<u8>,
12 #[serde(with="serde_bytes")]
14 pub wrap: Vec<u8>,
15 #[serde(default, with="serde_bytes")]
17 pub wrapped_dek: Vec<u8>,
18 #[serde(default)]
20 pub wrap_nonce: [u8; 12],
21 #[serde(default)]
23 pub x25519_pk_fpr: [u8; 8],
24 #[serde(default, with="serde_bytes")]
26 pub x25519_pub: Vec<u8>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct Header {
31 pub magic: [u8; 6],
33 pub chunk_size: u32,
35 pub file_id: [u8; 8],
37 #[serde(default)]
39 pub blake3_of_plain: [u8; 32],
40 pub suite: SuiteId,
42 #[serde(default)]
44 pub kdf_salt: Option<[u8; 32]>,
45 pub recipients: Vec<RecipientEntry>,
47 #[serde(default)]
49 pub eph_x25519_pk: [u8; 32],
50 #[serde(default, with="serde_bytes")]
52 pub mldsa_sig: Vec<u8>,
53 #[serde(default, with="serde_bytes")]
55 pub ed25519_sig: Vec<u8>,
56 #[serde(default)]
58 pub signature_metadata: Option<SignatureMetadata>,
59 pub fin: u8,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct SignatureMetadata {
65 pub signer_id: String,
66 pub algorithm: String,
67 pub public_key: String, }
69
70impl Header {
71 pub fn aead_aad(&self) -> Vec<u8> {
72 pae_v2_compat(self)
74 }
75}