@@ -214,6 +214,7 @@ static void tamper_truncate(void) {
214
214
/* extend */
215
215
truncate_file ("extend_0" , g_input_size + 1 );
216
216
truncate_file ("extend_1" , g_input_size + PF_NODE_SIZE / 2 );
217
+ // TODO: tampering below goes undetected during decryption!!
217
218
truncate_file ("extend_2" , g_input_size + PF_NODE_SIZE );
218
219
truncate_file ("extend_3" , g_input_size + PF_NODE_SIZE + PF_NODE_SIZE / 2 );
219
220
}
@@ -271,23 +272,36 @@ static void pf_encrypt(const void* decrypted, size_t size, const pf_key_t* key,
271
272
} while (0)
272
273
273
274
/* if update is true, also create a file with correct metadata MAC */
274
- #define BREAK_PF (suffix , update , ...) do { \
275
- __BREAK_PF(suffix, __VA_ARGS__); \
276
- if (update) { \
277
- __BREAK_PF(suffix "_fixed", __VA_ARGS__ { \
278
- pf_encrypt(meta_dec, sizeof(*meta_dec), &g_meta_key, \
279
- &meta->plaintext_part.metadata_mac, meta->encrypted_part, \
280
- "metadata"); \
281
- } ); \
282
- } \
283
- } while (0)
284
-
285
- #define BREAK_MHT (suffix , ...) do { \
286
- __BREAK_PF(suffix, __VA_ARGS__ { \
287
- pf_encrypt(mht_dec, sizeof(*mht_dec), &meta_dec->root_mht_node_key, \
288
- &meta_dec->root_mht_node_mac, mht_enc, "mht"); \
289
- } ); \
290
- } while (0)
275
+ #define BREAK_PLN (suffix , update , ...) \
276
+ do { \
277
+ __BREAK_PF(suffix, __VA_ARGS__); \
278
+ if (update) { \
279
+ __BREAK_PF( \
280
+ suffix "_fixed", __VA_ARGS__ { \
281
+ pf_encrypt(meta_dec, sizeof(*meta_dec), &g_meta_key, \
282
+ &meta->plaintext_part.metadata_mac, meta->encrypted_part, \
283
+ "metadata"); \
284
+ }); \
285
+ } \
286
+ } while (0)
287
+
288
+ #define BREAK_DEC (suffix , ...) \
289
+ do { \
290
+ __BREAK_PF( \
291
+ suffix, __VA_ARGS__ { \
292
+ pf_encrypt(meta_dec, sizeof(*meta_dec), &g_meta_key, \
293
+ &meta->plaintext_part.metadata_mac, meta->encrypted_part, "metadata"); \
294
+ }); \
295
+ } while (0)
296
+
297
+ #define BREAK_MHT (suffix , ...) \
298
+ do { \
299
+ __BREAK_PF( \
300
+ suffix, __VA_ARGS__ { \
301
+ pf_encrypt(mht_dec, sizeof(*mht_dec), &meta_dec->root_mht_node_key, \
302
+ &meta_dec->root_mht_node_mac, mht_enc, "mht"); \
303
+ }); \
304
+ } while (0)
291
305
292
306
#define LAST_BYTE (array ) (((uint8_t*)&array)[sizeof(array) - 1])
293
307
@@ -303,60 +317,51 @@ static void tamper_modify(void) {
303
317
FATAL ("Out of memory\n" );
304
318
305
319
/* plain part of the metadata isn't covered by the MAC so no point updating it */
306
- BREAK_PF ("meta_plain_id_0" , /*update=*/ false,
307
- { meta -> plaintext_part .file_id = 0 ; });
308
- BREAK_PF ( "meta_plain_id_1 " , /*update=*/ false,
309
- { meta -> plaintext_part .file_id = UINT64_MAX ; });
310
- BREAK_PF ( "meta_plain_version_0 " , /*update=*/ false,
311
- { meta -> plaintext_part .major_version = 0 ; });
312
- BREAK_PF ( "meta_plain_version_1" , /*update=*/ false,
313
- { meta -> plaintext_part . major_version = 0xff ; });
314
- BREAK_PF ("meta_plain_version_2" , /*update=*/ false,
315
- { meta -> plaintext_part .minor_version = 0xff ; });
320
+ BREAK_PLN ("meta_plain_id_0" , /*update=*/ false, { meta -> plaintext_part . file_id = 0 ; });
321
+ BREAK_PLN ( "meta_plain_id_1" , /*update=*/ false, { meta -> plaintext_part .file_id = UINT64_MAX ; });
322
+ BREAK_PLN ( "meta_plain_version_0 " , /*update=*/ false,
323
+ { meta -> plaintext_part .major_version = 0 ; });
324
+ BREAK_PLN ( "meta_plain_version_1 " , /*update=*/ false,
325
+ { meta -> plaintext_part .major_version = 0xff ; });
326
+ // TODO: tampering below goes undetected during decryption!!
327
+ // -> currently minor_version is not looked at all during processing of files!!
328
+ BREAK_PLN ("meta_plain_version_2" , /*update=*/ false,
329
+ { meta -> plaintext_part .minor_version = 0xff ; });
316
330
317
331
/* metadata_key_nonce is the keying material for encrypted metadata key derivation, so create
318
332
* also PFs with updated MACs */
319
- BREAK_PF ("meta_plain_nonce_0" , /*update=*/ true,
320
- { meta -> plaintext_part .metadata_key_nonce [0 ] ^= 1 ; });
321
- BREAK_PF ("meta_plain_nonce_1" , /*update=*/ true,
322
- { LAST_BYTE (meta -> plaintext_part .metadata_key_nonce ) ^= 0xfe ; });
323
- BREAK_PF ("meta_plain_mac_0" , /*update=*/ true,
324
- { meta -> plaintext_part .metadata_mac [0 ] ^= 0xfe ; });
325
- BREAK_PF ("meta_plain_mac_1" , /*update=*/ true,
326
- { LAST_BYTE (meta -> plaintext_part .metadata_mac ) &= 1 ; });
327
-
328
- BREAK_PF ("meta_enc_filename_0" , /*update=*/ true,
329
- { meta_dec -> file_path [0 ] = 0 ; });
330
- BREAK_PF ("meta_enc_filename_1" , /*update=*/ true,
331
- { meta_dec -> file_path [0 ] ^= 1 ; });
332
- BREAK_PF ("meta_enc_filename_2" , /*update=*/ true,
333
- { LAST_BYTE (meta_dec -> file_path ) ^= 0xfe ; });
334
- BREAK_PF ("meta_enc_size_0" , /*update=*/ true,
335
- { meta_dec -> file_size = 0 ; });
336
- BREAK_PF ("meta_enc_size_1" , /*update=*/ true,
337
- { meta_dec -> file_size = g_input_size - 1 ; });
338
- BREAK_PF ("meta_enc_size_2" , /*update=*/ true,
339
- { meta_dec -> file_size = g_input_size + 1 ; });
340
- BREAK_PF ("meta_enc_size_3" , /*update=*/ true,
341
- { meta_dec -> file_size = UINT64_MAX ; });
342
- BREAK_PF ("meta_enc_mht_key_0" , /*update=*/ true,
343
- { meta_dec -> root_mht_node_key [0 ] ^= 1 ; });
344
- BREAK_PF ("meta_enc_mht_key_1" , /*update=*/ true,
345
- { LAST_BYTE (meta_dec -> root_mht_node_key ) ^= 0xfe ; });
346
- BREAK_PF ("meta_enc_mht_mac_0" , /*update=*/ true,
347
- { meta_dec -> root_mht_node_mac [0 ] ^= 1 ; });
348
- BREAK_PF ("meta_enc_mht_mac_1" , /*update=*/ true,
349
- { LAST_BYTE (meta_dec -> root_mht_node_mac ) ^= 0xfe ; });
350
- BREAK_PF ("meta_enc_data_0" , /*update=*/ true,
351
- { meta_dec -> file_data [0 ] ^= 0xfe ; });
352
- BREAK_PF ("meta_enc_data_1" , /*update=*/ true,
353
- { LAST_BYTE (meta_dec -> file_data ) ^= 1 ; });
333
+ BREAK_PLN ("meta_plain_nonce_0" , /*update=*/ true,
334
+ { meta -> plaintext_part .metadata_key_nonce [0 ] ^= 1 ; });
335
+ BREAK_PLN ("meta_plain_nonce_1" , /*update=*/ true,
336
+ { LAST_BYTE (meta -> plaintext_part .metadata_key_nonce ) ^= 0xfe ; });
337
+ BREAK_PLN ("meta_plain_mac_0" , /*update=*/ false, // update would overwrite the tampering
338
+ { meta -> plaintext_part .metadata_mac [0 ] ^= 0xfe ; });
339
+ BREAK_PLN ("meta_plain_mac_1" , /*update=*/ false, // update would overwrite the tampering
340
+ { LAST_BYTE (meta -> plaintext_part .metadata_mac ) ^= 1 ; });
341
+
342
+ BREAK_DEC ("meta_enc_filename_0" , { meta_dec -> file_path [0 ] = 0 ; });
343
+ BREAK_DEC ("meta_enc_filename_1" , { meta_dec -> file_path [0 ] ^= 1 ; });
344
+ // TODO: tampering below goes undetected during decryption!!
345
+ BREAK_DEC ("meta_enc_filename_2" , { LAST_BYTE (meta_dec -> file_path ) ^= 0xfe ; });
346
+ // TODO: tampering below goes undetected during decryption!!
347
+ BREAK_DEC ("meta_enc_size_0" , { meta_dec -> file_size = 0 ; });
348
+ BREAK_DEC ("meta_enc_size_1" , { meta_dec -> file_size = g_input_size - 1 ; });
349
+ BREAK_DEC ("meta_enc_size_2" , { meta_dec -> file_size = g_input_size + 1 ; });
350
+ BREAK_DEC ("meta_enc_size_3" , { meta_dec -> file_size = UINT64_MAX ; });
351
+ BREAK_DEC ("meta_enc_mht_key_0" , { meta_dec -> root_mht_node_key [0 ] ^= 1 ; });
352
+ BREAK_DEC ("meta_enc_mht_key_1" , { LAST_BYTE (meta_dec -> root_mht_node_key ) ^= 0xfe ; });
353
+ BREAK_DEC ("meta_enc_mht_mac_0" , { meta_dec -> root_mht_node_mac [0 ] ^= 1 ; });
354
+ BREAK_DEC ("meta_enc_mht_mac_1" , { LAST_BYTE (meta_dec -> root_mht_node_mac ) ^= 0xfe ; });
355
+ // TODO: tampering in below two goes undetected during decryption.
356
+ // However, as we re-encrypt the data it is properly encrypted just undetectably different from
357
+ // the original version?! I.e., below two cases do not make sense and should be removed?!
358
+ BREAK_DEC ("meta_enc_data_0" , { meta_dec -> file_data [0 ] ^= 0xfe ; });
359
+ BREAK_DEC ("meta_enc_data_1" , { LAST_BYTE (meta_dec -> file_data ) ^= 1 ; });
354
360
355
361
/* padding is ignored */
356
- BREAK_PF ("meta_padding_0" , /*update=*/ false,
357
- { meta -> padding [0 ] ^= 1 ; });
358
- BREAK_PF ("meta_padding_1" , /*update=*/ false,
359
- { LAST_BYTE (meta -> padding ) ^= 0xfe ; });
362
+ // TODO: remove as as they are ignored decryption always works?
363
+ BREAK_DEC ("meta_padding_0" , { meta -> padding [0 ] ^= 1 ; });
364
+ BREAK_DEC ("meta_padding_1" , { LAST_BYTE (meta -> padding ) ^= 0xfe ; });
360
365
361
366
BREAK_MHT ("mht_0" , { mht_dec -> data_nodes_crypto [0 ].key [0 ] ^= 1 ; });
362
367
BREAK_MHT ("mht_1" , { mht_dec -> data_nodes_crypto [0 ].mac [0 ] ^= 1 ; });
@@ -380,11 +385,9 @@ static void tamper_modify(void) {
380
385
});
381
386
382
387
/* data nodes start from node #2 */
383
- BREAK_PF ("data_0" , /*update=*/ false,
384
- { * (out + 2 * PF_NODE_SIZE ) ^= 1 ; });
385
- BREAK_PF ("data_1" , /*update=*/ false,
386
- { * (out + 3 * PF_NODE_SIZE - 1 ) ^= 1 ; });
387
- BREAK_PF ("data_2" , /*update=*/ false, {
388
+ BREAK_PLN ("data_0" , /*update=*/ false, { * (out + 2 * PF_NODE_SIZE ) ^= 1 ; });
389
+ BREAK_PLN ("data_1" , /*update=*/ false, { * (out + 3 * PF_NODE_SIZE - 1 ) ^= 1 ; });
390
+ BREAK_PLN ("data_2" , /*update=*/ false, {
388
391
/* swap data nodes */
389
392
memcpy (out + 2 * PF_NODE_SIZE , g_input_data + 3 * PF_NODE_SIZE , PF_NODE_SIZE );
390
393
memcpy (out + 3 * PF_NODE_SIZE , g_input_data + 2 * PF_NODE_SIZE , PF_NODE_SIZE );
0 commit comments