Skip to main content

encrypt_stream

Function encrypt_stream 

Source
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。