From afd17a13ba81454335da9d747356eac1ccc9807a Mon Sep 17 00:00:00 2001 From: shchmue Date: Mon, 18 May 2020 16:51:37 -0600 Subject: [PATCH] Add memcmp result checks to avoid gcc optimization --- source/keys/key_sources.inl | 2 +- source/keys/keys.c | 14 +++----------- source/keys/save.c | 2 +- source/main.c | 2 +- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/source/keys/key_sources.inl b/source/keys/key_sources.inl index dca7303..1388713 100644 --- a/source/keys/key_sources.inl +++ b/source/keys/key_sources.inl @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -static const u8 zeros[0x10] = {0}; +static u8 zeros[0x10] = {0}; static const u8 keyblob_key_source[][0x10] = { {0xDF, 0x20, 0x6F, 0x59, 0x44, 0x54, 0xEF, 0xDC, 0x70, 0x74, 0x48, 0x3B, 0x0D, 0xED, 0x9F, 0xD3}, //1.0.0 diff --git a/source/keys/keys.c b/source/keys/keys.c index c29ab2c..52bcdce 100644 --- a/source/keys/keys.c +++ b/source/keys/keys.c @@ -84,7 +84,7 @@ static inline u32 _read_le_u32(const void *buffer, u32 offset) { } // key functions -static bool _key_exists(const void *data) { return memcmp(data, zeros, 0x10); }; +static int _key_exists(const void *data) { return memcmp(data, zeros, 0x10) != 0; }; static void _save_key(const char *name, const void *data, u32 len, char *outbuf); static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf); static void _generate_kek(u32 ks, const void *key_source, void *master_key, const void *kek_seed, const void *key_seed); @@ -334,7 +334,7 @@ get_tsec: ; emummc_storage_read(&storage, 0x180000 / NX_EMMC_BLOCKSIZE + i, 1, keyblob_block); se_aes_key_set(3, keyblob_mac_key[i], 0x10); se_aes_cmac(3, keyblob_mac, 0x10, keyblob_block + 0x10, 0xa0); - if (memcmp(keyblob_block, keyblob_mac, 0x10)) { + if (memcmp(keyblob_block, keyblob_mac, 0x10) != 0) { EPRINTFARGS("Keyblob %x corrupt.", i); gfx_hexdump(i, keyblob_block, 0x10); gfx_hexdump(i, keyblob_mac, 0x10); @@ -527,8 +527,6 @@ pkg2_done: for (u32 j = 0; j < 3; j++) { _generate_kek(8, fs_keys[2 + j], master_key[i], aes_kek_generation_source, NULL); se_aes_crypt_block_ecb(8, 0, key_area_key[j][i], aes_key_generation_source); - if (j == 2) - gfx_hexdump(i, key_area_key[j][i], 0x10); } } se_aes_key_set(8, master_key[i], 0x10); @@ -936,7 +934,7 @@ get_titlekeys: u8 *db = M + 0x21; _mgf1_xor(salt, 0x20, db, 0xdf); _mgf1_xor(db, 0xdf, salt, 0x20); - if (memcmp(db, null_hash, 0x20)) + if (memcmp(db, null_hash, 0x20) != 0) continue; memcpy(titlekeys + 0x10 * _titlekey_count, db + 0xcf, 0x10); _titlekey_count++; @@ -1090,14 +1088,8 @@ static void _save_key(const char *name, const void *data, u32 len, char *outbuf) static void _save_key_family(const char *name, const void *data, u32 start_key, u32 num_keys, u32 len, char *outbuf) { char temp_name[0x40] = {0}; - if (memcmp(name, "key_area_key_system", 19) == 0) { - gfx_hexdump(0, data, num_keys * 0x10); - } for (u32 i = 0; i < num_keys; i++) { sprintf(temp_name, "%s_%02x", name, i + start_key); - if (memcmp(name, "key_area_key_system", 19) == 0) { - gfx_printf("attempt save key %x\n", i); - } _save_key(temp_name, data + i * len, len, outbuf); } } diff --git a/source/keys/save.c b/source/keys/save.c index 8e11c9a..ea958d3 100644 --- a/source/keys/save.c +++ b/source/keys/save.c @@ -279,7 +279,7 @@ void save_ivfc_storage_read(integrity_verification_storage_ctx_t *ctx, void *buf hash[0x1F] |= 0x80; free(data_buffer); - if (memcmp(hash_buffer, hash, 0x20)) { + if (memcmp(hash_buffer, hash, 0x20) != 0) { ctx->block_validities[block_index] = VALIDITY_INVALID; } else { ctx->block_validities[block_index] = VALIDITY_VALID; diff --git a/source/main.c b/source/main.c index 855a4af..41fe132 100644 --- a/source/main.c +++ b/source/main.c @@ -237,7 +237,7 @@ void launch_tools() if (file_sec) { - if (memcmp("sd:/", file_sec, 4)) + if (memcmp("sd:/", file_sec, 4) != 0) { memcpy(dir + strlen(dir), "/", 2); memcpy(dir + strlen(dir), file_sec, strlen(file_sec) + 1);