pub fn encrypt_stream<R: Read, W: Write + Seek>(
input: &mut R,
plaintext_len: u64,
keks: &[Kek],
vault_salt: &[u8; 16],
opts: &EncryptOptions,
rnd: &RandomMaterial,
out: &mut W,
progress: Option<ProgressFn<'_>>,
finalize_folder_index: Option<FinalizeFolderIndex<'_>>,
) -> Result<StreamedFile>Expand description
流式加密:从 input 读恰好 plaintext_len 字节明文,把完整的 omy 文件写进 out。
与 encrypt_with_progress 产出逐字节相同的文件(给定相同 FEK 与随机材料
时),但内存占用与文件大小无关:原来要把整个明文读进内存、再在内存里拼出
整个密文,几 GB 的视频峰值是文件大小的两倍以上。
做法:头部的长度只取决于各 TLV 的长度(与内容无关),所以先写同长度的 零占位,逐块加密写载荷,同时累计内容哈希与压缩索引;最后 seek 回开头写入 真正的头部。头部 MAC 覆盖的都是这时才确定的字段,占位不会进入 MAC。
input 实际长度与 plaintext_len 不符(文件在加密过程中被改动)时报错,
而不是写出一个与头部声明不一致的文件。
§Errors
与 encrypt_with_progress 一致;另外读写失败返回 Error::Io,
定稿的 FOLDER_INDEX 长度与占位不同返回 Error::MalformedHeader。