diff options
Diffstat (limited to 'MokManager.c')
| -rw-r--r-- | MokManager.c | 97 |
1 files changed, 51 insertions, 46 deletions
diff --git a/MokManager.c b/MokManager.c index ae8d4eb4..8224d753 100644 --- a/MokManager.c +++ b/MokManager.c @@ -392,24 +392,64 @@ static UINT8 list_keys (void *MokNew, UINTN MokNewSize) return 1; } -static UINT8 mok_enrollment_prompt (void *MokNew, UINTN MokNewSize) +static UINT8 get_line (UINT32 *length, CHAR16 *line, UINT32 line_max, UINT8 show) { EFI_INPUT_KEY key; + int count = 0; + + do { + key = get_keystroke(); + + if ((count >= line_max && + key.UnicodeChar != CHAR_BACKSPACE) || + key.UnicodeChar == CHAR_NULL || + key.UnicodeChar == CHAR_TAB || + key.UnicodeChar == CHAR_LINEFEED || + key.UnicodeChar == CHAR_CARRIAGE_RETURN) { + continue; + } + + if (count == 0 && key.UnicodeChar == CHAR_BACKSPACE) { + continue; + } else if (key.UnicodeChar == CHAR_BACKSPACE) { + if (show) { + Print(L"\b"); + } + line[--count] = '\0'; + continue; + } + + if (show) { + Print(L"%c", key.UnicodeChar); + } + + line[count++] = key.UnicodeChar; + } while (key.UnicodeChar != CHAR_CARRIAGE_RETURN); + Print(L"\n"); + + *length = count; + + return 1; +} + +static UINT8 mok_enrollment_prompt (void *MokNew, UINTN MokNewSize) +{ + CHAR16 line[1]; + UINT32 length; do { if (!list_keys(MokNew, MokNewSize)) { return 0; } - Print(L"Enroll the key(s) or list the key(s) again? (y/n/l): "); + Print(L"Enroll the key(s)? (y/n): "); - key = get_keystroke(); - Print(L"%c\n", key.UnicodeChar); + get_line (&length, line, 1, 1); - if (key.UnicodeChar == 'Y' || key.UnicodeChar == 'y') { + if (line[0] == 'Y' || line[0] == 'y') { return 1; } - } while (key.UnicodeChar == 'L' || key.UnicodeChar == 'l'); + } while (line[0] != 'N' && line[0] != 'n'); Print(L"Abort\n"); @@ -417,14 +457,14 @@ static UINT8 mok_enrollment_prompt (void *MokNew, UINTN MokNewSize) } static UINT8 mok_deletion_prompt () { - EFI_INPUT_KEY key; + CHAR16 line[1]; + UINT32 length; Print(L"Erase all stored keys? (y/N): "); - key = get_keystroke(); - Print(L"%c\n", key.UnicodeChar); + get_line (&length, line, 1, 1); - if (key.UnicodeChar == 'Y' || key.UnicodeChar == 'y') { + if (line[0] == 'Y' || line[0] == 'y') { return 1; } @@ -433,41 +473,6 @@ static UINT8 mok_deletion_prompt () { return 0; } -static UINT8 get_password (UINT32 *length, CHAR16 *password) -{ - EFI_INPUT_KEY key; - CHAR16 input[PASSWORD_MAX]; - int count = 0; - - do { - key = get_keystroke(); - - if ((count >= PASSWORD_MAX && - key.UnicodeChar != CHAR_BACKSPACE) || - key.UnicodeChar == CHAR_NULL || - key.UnicodeChar == CHAR_TAB || - key.UnicodeChar == CHAR_LINEFEED || - key.UnicodeChar == CHAR_CARRIAGE_RETURN) { - continue; - } - - if (count == 0 && key.UnicodeChar == CHAR_BACKSPACE) { - continue; - } else if (key.UnicodeChar == CHAR_BACKSPACE) { - input[--count] = '\0'; - continue; - } - - input[count++] = key.UnicodeChar; - } while (key.UnicodeChar != CHAR_CARRIAGE_RETURN); - Print(L"\n"); - - *length = count; - CopyMem(password, input, count * sizeof(CHAR16)); - - return 1; -} - static EFI_STATUS compute_pw_hash (void *MokNew, UINTN MokNewSize, CHAR16 *password, UINT32 pw_length, UINT8 *hash) { @@ -538,7 +543,7 @@ static EFI_STATUS store_keys (void *MokNew, UINTN MokNewSize) while (fail_count < 3) { Print(L"Password(%d-%d characters): ", PASSWORD_MIN, PASSWORD_MAX); - get_password(&pw_length, password); + get_line(&pw_length, password, PASSWORD_MAX, 0); if (pw_length < 8) { Print(L"At least %d characters for the password\n", |
