From 6c0ce6d3ca273f12e1cb4018144bee8e6131d30d Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Thu, 8 Jul 2021 15:57:37 +0200 Subject: [PATCH] common: allow disabling of timeout for password entry In case a user has to enter a complicated password it is sometimes desireable to give the user more time than the default timeout. Enabling this feature will disable the timeout entirely in case the user presses the key before entering any other character. Signed-off-by: Steffen Jaeckel Reviewed-by: Simon Glass --- common/Kconfig.boot | 8 ++++++++ common/autoboot.c | 12 +++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/common/Kconfig.boot b/common/Kconfig.boot index fe60ad0..f9551b2 100644 --- a/common/Kconfig.boot +++ b/common/Kconfig.boot @@ -860,6 +860,14 @@ config AUTOBOOT_KEYED_CTRLC Setting this variable provides an escape sequence from the limited "password" strings. +config AUTOBOOT_NEVER_TIMEOUT + bool "Make the password entry never time-out" + depends on AUTOBOOT_KEYED && AUTOBOOT_ENCRYPTION && CRYPT_PW + help + This option removes the timeout from the password entry + when the user first presses the key before entering + any other character. + config AUTOBOOT_STOP_STR_ENABLE bool "Enable fixed string to stop autobooting" depends on AUTOBOOT_KEYED && AUTOBOOT_ENCRYPTION diff --git a/common/autoboot.c b/common/autoboot.c index 832ef7c..2564ef8 100644 --- a/common/autoboot.c +++ b/common/autoboot.c @@ -63,6 +63,10 @@ static int menukey; * or * the config value CONFIG_AUTOBOOT_STOP_STR_CRYPT * + * In case the config value CONFIG_AUTOBOOT_NEVER_TIMEOUT has been enabled + * this function never times out if the user presses the key + * before starting to enter the password. + * * @etime: Timeout value ticks (stop when get_ticks() reachs this) * @return 0 if autoboot should continue, 1 if it should stop */ @@ -72,6 +76,7 @@ static int passwd_abort_crypt(uint64_t etime) char presskey[DELAY_STOP_STR_MAX_LENGTH]; u_int presskey_len = 0; int abort = 0; + int never_timeout = 0; int err; if (IS_ENABLED(CONFIG_AUTOBOOT_STOP_STR_ENABLE) && !crypt_env_str) @@ -91,6 +96,11 @@ static int passwd_abort_crypt(uint64_t etime) if ((presskey[presskey_len] == '\r') || (presskey[presskey_len] == '\n')) { + if (IS_ENABLED(CONFIG_AUTOBOOT_NEVER_TIMEOUT) && + !presskey_len) { + never_timeout = 1; + continue; + } presskey[presskey_len] = '\0'; err = crypt_compare(crypt_env_str, presskey, &abort); @@ -104,7 +114,7 @@ static int passwd_abort_crypt(uint64_t etime) presskey_len++; } } - } while (get_ticks() <= etime); + } while (never_timeout || get_ticks() <= etime); return abort; } -- 2.7.4