1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 23:48:12 +00:00

config: Set usbTiny whenever there is a possibility that protectPinUiCallback() may be called.

This commit is contained in:
Andrew Kozlik 2019-02-25 13:54:44 +01:00
parent b457797c55
commit b65f61650a
3 changed files with 17 additions and 10 deletions

View File

@ -297,6 +297,7 @@ static secbool config_upgrade_v10(void)
if (config.has_pin) { if (config.has_pin) {
storage_change_pin(PIN_EMPTY, pin_to_int(config.pin)); storage_change_pin(PIN_EMPTY, pin_to_int(config.pin));
} }
while (pin_wait != 0) { while (pin_wait != 0) {
storage_pin_fails_increase(); storage_pin_fails_increase();
pin_wait >>= 1; pin_wait >>= 1;
@ -354,6 +355,8 @@ static secbool config_upgrade_v10(void)
void config_init(void) void config_init(void)
{ {
char oldTiny = usbTiny(1);
config_upgrade_v10(); config_upgrade_v10();
storage_init(&protectPinUiCallback, HW_ENTROPY_DATA, HW_ENTROPY_LEN); storage_init(&protectPinUiCallback, HW_ENTROPY_DATA, HW_ENTROPY_LEN);
@ -372,6 +375,8 @@ void config_init(void)
storage_set(KEY_VERSION, &CONFIG_VERSION, sizeof(CONFIG_VERSION)); storage_set(KEY_VERSION, &CONFIG_VERSION, sizeof(CONFIG_VERSION));
} }
data2hex(config_uuid, sizeof(config_uuid), config_uuid_str); data2hex(config_uuid, sizeof(config_uuid), config_uuid_str);
usbTiny(oldTiny);
} }
void session_clear(bool lock) void session_clear(bool lock)
@ -719,9 +724,12 @@ bool config_containsMnemonic(const char *mnemonic)
/* Check whether pin matches storage. The pin must be /* Check whether pin matches storage. The pin must be
* a null-terminated string with at most 9 characters. * a null-terminated string with at most 9 characters.
*/ */
bool config_containsPin(const char *pin) bool config_unlock(const char *pin)
{ {
return sectrue == storage_unlock(pin_to_int(pin)); char oldTiny = usbTiny(1);
secbool ret = storage_unlock(pin_to_int(pin));
usbTiny(oldTiny);
return sectrue == ret;
} }
bool config_hasPin(void) bool config_hasPin(void)
@ -736,7 +744,9 @@ bool config_changePin(const char *old_pin, const char *new_pin)
return false; return false;
} }
char oldTiny = usbTiny(1);
secbool ret = storage_change_pin(pin_to_int(old_pin), new_pin_int); secbool ret = storage_change_pin(pin_to_int(old_pin), new_pin_int);
usbTiny(oldTiny);
#if DEBUG_LINK #if DEBUG_LINK
if (sectrue == ret) { if (sectrue == ret) {
@ -907,10 +917,12 @@ void config_setAutoLockDelayMs(uint32_t auto_lock_delay_ms)
void config_wipe(void) void config_wipe(void)
{ {
char oldTiny = usbTiny(1);
storage_wipe(); storage_wipe();
if (storage_is_unlocked() != sectrue) { if (storage_is_unlocked() != sectrue) {
storage_unlock(PIN_EMPTY); storage_unlock(PIN_EMPTY);
} }
usbTiny(oldTiny);
random_buffer((uint8_t *)config_uuid, sizeof(config_uuid)); random_buffer((uint8_t *)config_uuid, sizeof(config_uuid));
data2hex(config_uuid, sizeof(config_uuid), config_uuid_str); data2hex(config_uuid, sizeof(config_uuid), config_uuid_str);
autoLockDelayMsCached = secfalse; autoLockDelayMsCached = secfalse;

View File

@ -120,9 +120,8 @@ bool config_dumpNode(HDNodeType *node);
bool config_getPin(char *dest, uint16_t dest_size); bool config_getPin(char *dest, uint16_t dest_size);
#endif #endif
bool config_containsPin(const char *pin); bool config_unlock(const char *pin);
bool config_hasPin(void); bool config_hasPin(void);
void config_setPin(const char *pin);
bool config_changePin(const char *old_pin, const char *new_pin); bool config_changePin(const char *old_pin, const char *new_pin);
bool session_isUnlocked(void); bool session_isUnlocked(void);

View File

@ -204,9 +204,7 @@ bool protectPin(bool use_cached)
} }
} }
usbTiny(1); bool ret = config_unlock(pin);
bool ret = config_containsPin(pin);
usbTiny(0);
if (!ret) { if (!ret) {
fsm_sendFailure(FailureType_Failure_PinInvalid, NULL); fsm_sendFailure(FailureType_Failure_PinInvalid, NULL);
} }
@ -229,7 +227,7 @@ bool protectChangePin(bool removal)
// If removing, defer the check to config_changePin(). // If removing, defer the check to config_changePin().
if (!removal) { if (!removal) {
usbTiny(1); usbTiny(1);
bool ret = config_containsPin(pin); bool ret = config_unlock(pin);
usbTiny(0); usbTiny(0);
if (ret == false) { if (ret == false) {
fsm_sendFailure(FailureType_Failure_PinInvalid, NULL); fsm_sendFailure(FailureType_Failure_PinInvalid, NULL);
@ -265,9 +263,7 @@ bool protectChangePin(bool removal)
} }
} }
usbTiny(1);
bool ret = config_changePin(old_pin, new_pin); bool ret = config_changePin(old_pin, new_pin);
usbTiny(0);
memzero(old_pin, sizeof(old_pin)); memzero(old_pin, sizeof(old_pin));
memzero(new_pin, sizeof(new_pin)); memzero(new_pin, sizeof(new_pin));
if (ret == false) { if (ret == false) {