From 1ffa239b5ae57c2a0f0fc3ecb26110df41dcdff7 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Thu, 8 Mar 2018 19:48:35 -0800 Subject: [PATCH] Fix async expMod output + smcUnwrapAesWrappedTitlekey --- exosphere/src/se.c | 4 ++-- exosphere/src/sealedkeys.c | 1 + exosphere/src/smc_api.c | 18 +++++++++--------- exosphere/src/smc_user.c | 8 ++++++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/exosphere/src/se.c b/exosphere/src/se.c index 0a63154d0..5fc883804 100644 --- a/exosphere/src/se.c +++ b/exosphere/src/se.c @@ -311,8 +311,8 @@ void se_exp_mod(unsigned int keyslot, void *buf, size_t size, unsigned int (*cal } /* Endian swap the input. */ - for (size_t i = size; i > 0; i--) { - stack_buf[i] = *((uint8_t *)buf + size - i); + for (size_t i = 0; i < size; i++) { + stack_buf[i] = *((uint8_t *)buf + size - i - 1); } diff --git a/exosphere/src/sealedkeys.c b/exosphere/src/sealedkeys.c index b71a4fe44..2041ae79a 100644 --- a/exosphere/src/sealedkeys.c +++ b/exosphere/src/sealedkeys.c @@ -1,4 +1,5 @@ #include +#include #include "utils.h" #include "sealedkeys.h" diff --git a/exosphere/src/smc_api.c b/exosphere/src/smc_api.c index d72ed83d0..19411a917 100644 --- a/exosphere/src/smc_api.c +++ b/exosphere/src/smc_api.c @@ -150,8 +150,6 @@ void clear_priv_smc_in_progress(void) { uint32_t (*g_smc_callback)(void *, uint64_t) = NULL; uint64_t g_smc_callback_key = 0; -static _Atomic(int) g_num_smcs_called = 0; - uint64_t try_set_smc_callback(uint32_t (*callback)(void *, uint64_t)) { uint64_t key; if (g_smc_callback_key) { @@ -201,15 +199,17 @@ void call_smc_handler(uint32_t handler_id, smc_args_t *args) { generic_panic(); } - int num_called = atomic_fetch_add(&g_num_smcs_called, 1); - - /* DEBUG: use num_called to determine panic behavior. */ - if (num_called == 0x21A) { - panic(COLOR_F); - } - + /* Call function. */ args->X[0] = smc_handler(args); + if (args->X[0]) + { + MAKE_REG32(get_iram_address_for_debug() + 0x4FF0) = handler_id; + MAKE_REG32(get_iram_address_for_debug() + 0x4FF4) = smc_id; + MAKE_REG32(get_iram_address_for_debug() + 0x4FF8) = get_core_id(); + *(volatile smc_args_t *)(get_iram_address_for_debug() + 0x4F00) = *args; + panic(PANIC_REBOOT); + } (void)result; /* FIXME: result unused */ } diff --git a/exosphere/src/smc_user.c b/exosphere/src/smc_user.c index d25bf046f..bca882666 100644 --- a/exosphere/src/smc_user.c +++ b/exosphere/src/smc_user.c @@ -557,8 +557,10 @@ uint32_t user_unwrap_rsa_oaep_wrapped_titlekey(smc_args_t *args) { void *user_modulus = (void *)args->X[2]; unsigned int master_key_rev = (unsigned int)args->X[7]; - if (master_key_rev >= MASTERKEY_REVISION_MAX) { + if (mkey_get_revision() > 0 && master_key_rev >= MASTERKEY_REVISION_MAX) { return 2; + } else { + master_key_rev = 0; } /* Copy user data into secure memory. */ @@ -615,8 +617,10 @@ uint32_t user_unwrap_aes_wrapped_titlekey(smc_args_t *args) { unsigned int master_key_rev = (unsigned int)args->X[3]; - if (master_key_rev >= MASTERKEY_REVISION_MAX) { + if (mkey_get_revision() > 0 && master_key_rev >= MASTERKEY_REVISION_MAX) { return 2; + } else { + master_key_rev = 0; } tkey_set_master_key_rev(master_key_rev);