fix(crypto): K-02 — format v3 chunk replay protection with generation aad

This commit is contained in:
2026-09-19 00:52:13 +02:00
parent ad531d8393
commit 36a4094336
9 changed files with 553 additions and 99 deletions
+10
View File
@@ -115,6 +115,7 @@ pub fn read_carrier_block(
&chunk_rec.nonce,
&chunk_rec.tag,
format_version,
chunk_rec.generation,
)?;
// Das outer_decrypted enthält: inner_nonce (12B) || inner_tag (16B) || inner_ct_len (4B LE) || inner_ct || CSPRNG-Padding
@@ -149,6 +150,7 @@ pub fn read_carrier_block(
&inner_nonce,
&inner_tag,
format_version,
chunk_rec.generation,
)?;
Ok(inner_plaintext)
@@ -167,6 +169,8 @@ pub fn write_carrier_block(
plaintext: &[u8],
format_version: u32,
) -> Result<()> {
let gen = 0u64;
// 1. Innere Schicht verschlüsseln (mit dek_inner = DEK_1)
let (inner_ct, inner_nonce, inner_tag) = encrypt_chunk(
dek_inner,
@@ -174,6 +178,7 @@ pub fn write_carrier_block(
block_idx,
plaintext,
format_version,
gen,
)?;
let inner_ct_len = inner_ct.len() as u32;
@@ -208,12 +213,14 @@ pub fn write_carrier_block(
block_idx,
&outer_plaintext,
format_version,
gen,
)?;
// 4. In SQLite schreiben (in-place Überschreiben des bestehenden Chunks)
db.write_chunk(
carrier_node_id,
block_idx,
gen,
&outer_nonce,
&outer_tag,
&outer_ct,
@@ -234,17 +241,20 @@ pub fn shred_carrier_block(
let mut noise = vec![0u8; CHUNK_SIZE];
OsRng.fill_bytes(&mut noise);
let gen = 0u64;
let (outer_ct, outer_nonce, outer_tag) = encrypt_chunk(
dek_outer,
carrier_node_id,
block_idx,
&noise,
format_version,
gen,
)?;
db.write_chunk(
carrier_node_id,
block_idx,
gen,
&outer_nonce,
&outer_tag,
&outer_ct,