From 10ddedbbac7acb326fb9447c6a1c5f1706017e4b Mon Sep 17 00:00:00 2001 From: kavsrf Date: Sun, 26 Feb 2017 11:42:59 +0300 Subject: PasswordTimeout and infodelay keys in DcsProp DcsProp documented included in VeraCrypt Beta2 patch 1 --- DcsInt/DcsInt.c | 41 ++++++-- Include/Library/PasswordLib.h | 2 + Library/PasswordLib/ConsolePassword.c | 14 +++ Library/PasswordLib/PicturePassword.c | 21 ++++ Library/VeraCryptLib/DcsProp | 182 ++++++++++++++++++++++++++++++++++ Library/VeraCryptLib/DcsVeraCrypt.c | 5 + Library/VeraCryptLib/DcsVeraCrypt.h | 2 + Library/VeraCryptLib/mklinks_src.bat | 2 + README.txt | 13 +++ SecureBoot/readme.txt | 10 +- 10 files changed, 278 insertions(+), 14 deletions(-) create mode 100644 Library/VeraCryptLib/DcsProp create mode 100644 README.txt diff --git a/DcsInt/DcsInt.c b/DcsInt/DcsInt.c index 06f8841..3303c56 100644 --- a/DcsInt/DcsInt.c +++ b/DcsInt/DcsInt.c @@ -986,6 +986,32 @@ VCAuthLoadConfigUpdated(UINT8* secRegion, UINTN secRegionSize) { } } +VOID +Pause( + IN UINTN seconds + ) +{ + if (seconds) { + EFI_INPUT_KEY key; + key = KeyWait(L"%2d \r", seconds, 0, 0); + if (key.UnicodeChar != 0) { + GetKey(); + } + } +} + +VOID +PauseHandleInfo( + IN EFI_HANDLE hndle, + IN UINTN seconds) +{ + if (seconds) { + EfiPrintDevicePath(hndle); + Pause(seconds); + OUT_PRINT(L"\n"); + } +} + ////////////////////////////////////////////////////////////////////////// // Driver Entry Point ////////////////////////////////////////////////////////////////////////// @@ -1007,15 +1033,8 @@ UefiMain( if (gAuthSecRegionSearch) { res = PlatformGetAuthData(&SecRegionData, &SecRegionSize, &SecRegionHandle); if (!EFI_ERROR(res)) { - EFI_INPUT_KEY key; - EfiPrintDevicePath(SecRegionHandle); - OUT_PRINT(L"\n"); VCAuthLoadConfigUpdated(SecRegionData, SecRegionSize); - key = KeyWait(L"%2d \r", 2, 0, 0); - if (key.UnicodeChar != 0) { - GetKey(); - } - OUT_PRINT(L"\n"); + PauseHandleInfo(SecRegionHandle, gSecRegionInfoDelay); } } else if (gRUD != 0) { // RUD defined @@ -1028,10 +1047,10 @@ UefiMain( if (!EFI_ERROR(res) && id != NULL) { INT32 rud; rud = GetCrc32((unsigned char*)id, (int)AsciiStrLen(id)); - OUT_PRINT(L"%d ? %d\n", gRUD, rud); MEM_FREE(id); if (rud == gRUD) { devFound = TRUE; + PauseHandleInfo(SecRegionHandle, gSecRegionInfoDelay); break; } } @@ -1093,9 +1112,9 @@ UefiMain( if (gConfigBuffer != NULL) { TpmMeasure(gConfigBuffer, gConfigBufferSize); // Measure configuration } - if (gTpm->IsConfigured(gTpm) && !gTpm->IsOpen(gTpm)) { + if (gTpm->IsConfigured(gTpm) && !gTpm->IsOpen(gTpm) && gTPMLockedInfoDelay) { ERR_PRINT(L"TPM is configured but locked. Probably boot chain is modified!\n"); - KeyWait(L"%1d\r", 9, 0, 0); + Pause(gTPMLockedInfoDelay); } } diff --git a/Include/Library/PasswordLib.h b/Include/Library/PasswordLib.h index a827b16..25ee1aa 100644 --- a/Include/Library/PasswordLib.h +++ b/Include/Library/PasswordLib.h @@ -24,6 +24,8 @@ extern CHAR8* gPasswordPictureCharsDefault; extern UINTN gPasswordPictureCharsLen; extern UINT8 gPasswordVisible; extern UINT8 gPasswordProgress; +extern int gPasswordTimeout; + extern int gPasswordShowMark; extern VOID* gPictPwdBmp; extern UINTN gPictPwdBmpSize; diff --git a/Library/PasswordLib/ConsolePassword.c b/Library/PasswordLib/ConsolePassword.c index 797ee4a..6894b50 100644 --- a/Library/PasswordLib/ConsolePassword.c +++ b/Library/PasswordLib/ConsolePassword.c @@ -31,6 +31,20 @@ AskConsolePwdInt( UINTN i; gST->ConOut->EnableCursor(gST->ConOut, TRUE); + if (gPasswordTimeout) { + EFI_EVENT InputEvents[2]; + UINTN EventIndex = 0; + InputEvents[0] = gST->ConIn->WaitForKey; + gBS->CreateEvent(EVT_TIMER, 0, (EFI_EVENT_NOTIFY)NULL, NULL, &InputEvents[1]); + gBS->SetTimer(InputEvents[1], TimerPeriodic, 10000000 * gPasswordTimeout); + gBS->WaitForEvent(2, InputEvents, &EventIndex); + gPasswordTimeout = 0; + gBS->CloseEvent(InputEvents[1]); + if (EventIndex == 1) { + *retCode = AskPwdRetCancel; + return ; + } + } do { key = GetKey(); diff --git a/Library/PasswordLib/PicturePassword.c b/Library/PasswordLib/PicturePassword.c index c3831ad..4e46f47 100644 --- a/Library/PasswordLib/PicturePassword.c +++ b/Library/PasswordLib/PicturePassword.c @@ -31,9 +31,11 @@ UINTN gPasswordPictureCharsLen = 95; UINT8 gPasswordVisible = 0; int gPasswordShowMark = 1; UINT8 gPasswordProgress = 1; +int gPasswordTimeout = 0; int gPlatformLocked = 0; int gTPMLocked = 0; +int gTPMLockedInfoDelay = 9; int gSCLocked = 0; @@ -282,6 +284,25 @@ AskPictPwdInt( UINTN pwdAction = PwdActNone; CHAR8 pwdNewChar = 0; + if (gPasswordTimeout) { + UINTN EventIndex = 0; + InputEvents[0] = gST->ConIn->WaitForKey; + eventsCount = 2; + if (gTouchPointer != NULL) { + eventsCount = 3; + InputEvents[2] = gTouchPointer->WaitForInput; + } + gBS->CreateEvent(EVT_TIMER, 0, (EFI_EVENT_NOTIFY)NULL, NULL, &InputEvents[1]); + gBS->SetTimer(InputEvents[1], TimerPeriodic, 10000000 * gPasswordTimeout); + gBS->WaitForEvent(eventsCount, InputEvents, &EventIndex); + gPasswordTimeout = 0; + gBS->CloseEvent(InputEvents[1]); + if (EventIndex == 1) { + *retCode = AskPwdRetCancel; + return; + } + } + InitConsoleControl(); if (gBeepEnabled) { InitSpeaker(); diff --git a/Library/VeraCryptLib/DcsProp b/Library/VeraCryptLib/DcsProp new file mode 100644 index 0000000..e0b6691 --- /dev/null +++ b/Library/VeraCryptLib/DcsProp @@ -0,0 +1,182 @@ + + + + + + 0 + Password: + EFI\VeraCrypt\login.bmp + + + 1 + + 0 + + 0 + + + 10 + + 0 + + + Authorizing... + + Authorization failed. Wrong password, PIM or hash. + + + + + + 0 + + + + Pim: + 0 + 1 + + + + 0 + 0 + + + 0 + + + 0 + + 0 + + + 2 + + + 0 + + + 0 + + 0 + + + 1 + + + + + + + Exit + Exit + Exit + + + + + -1 + + + -1 + + + -1 + + + 1 + + + 0 + + + -1 + + + 1 + 100 + 0 + 1280 + + 1 + + + \ No newline at end of file diff --git a/Library/VeraCryptLib/DcsVeraCrypt.c b/Library/VeraCryptLib/DcsVeraCrypt.c index f4a1e27..5d9be88 100644 --- a/Library/VeraCryptLib/DcsVeraCrypt.c +++ b/Library/VeraCryptLib/DcsVeraCrypt.c @@ -66,6 +66,7 @@ char* gAuthStartMsg = NULL; INT32 gRUD = 0; int gAuthSecRegionSearch = 0; +int gSecRegionInfoDelay = 0; CHAR8* gPlatformKeyFile = NULL; UINTN gPlatformKeyFileSize = 0; @@ -146,6 +147,7 @@ VCAuthLoadConfig() gPasswordProgress = (UINT8)ConfigReadInt("AuthorizeProgress", 1); // print "*" gPasswordVisible = (UINT8)ConfigReadInt("AuthorizeVisible", 0); // show chars gPasswordShowMark = ConfigReadInt("AuthorizeMarkTouch", 1); // show touch points + gPasswordTimeout = (UINT8)ConfigReadInt("PasswordTimeout", 0); // If no password for => gDcsBootForce = ConfigReadInt("DcsBootForce", 1); // Ask password even if no USB marked found. @@ -165,8 +167,11 @@ VCAuthLoadConfig() gRndDefault = ConfigReadInt("Random", 0); gAuthSecRegionSearch = ConfigReadInt("SecRegionSearch", 0); + gSecRegionInfoDelay = ConfigReadInt("SecRegionInfoDelay", 0); + gPlatformLocked = ConfigReadInt("PlatformLocked", 0); gTPMLocked = ConfigReadInt("TPMLocked", 0); + gTPMLockedInfoDelay = ConfigReadInt("TPMLockedInfoDelay", 9); gSCLocked = ConfigReadInt("SCLocked", 0); // Actions for DcsInt diff --git a/Library/VeraCryptLib/DcsVeraCrypt.h b/Library/VeraCryptLib/DcsVeraCrypt.h index e6ee57c..f7a3c8f 100644 --- a/Library/VeraCryptLib/DcsVeraCrypt.h +++ b/Library/VeraCryptLib/DcsVeraCrypt.h @@ -53,9 +53,11 @@ extern char* gAuthErrorMsg; extern INT32 gRUD; extern int gAuthSecRegionSearch; +extern int gSecRegionInfoDelay; extern int gPlatformLocked; extern int gTPMLocked; +extern int gTPMLockedInfoDelay; extern int gSCLocked; extern int gAuthPwdCode; diff --git a/Library/VeraCryptLib/mklinks_src.bat b/Library/VeraCryptLib/mklinks_src.bat index 1126cfa..a62298e 100644 --- a/Library/VeraCryptLib/mklinks_src.bat +++ b/Library/VeraCryptLib/mklinks_src.bat @@ -1,6 +1,8 @@ @echo off pushd %~dp0 +if "%veracrypt_src%"=="" if exist %CD:~0,-28%\VeraCrypt\src set veracrypt_src=%CD:~0,-28%\VeraCrypt\src + call :select_path "%veracrypt_src%" "Select VeraCrypt directory:" set veracrypt_src=%select_path_result% diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..f1c2e66 --- /dev/null +++ b/README.txt @@ -0,0 +1,13 @@ +VeraCrypt EFI Bootloader for EFI Windows system encryption (LGPL) + +DcsProp - Configuration for the loader +SecureBoot - certificates for Secure boot configuration + +Modules: +DcsBoot.efi - Starter +DcsRe.efi - Recovery tool (decrypt etc) +DcsCfg.dcs - configuration from EFI shell +DcsBml.dcs - Boot menu lock runtime driver to prvent Windows modification of boot order +DcsInt.dcs - PreBoot authorization +DcsInfo.dcs - PlatformInfo generation +LegacySpeaker.dcs - driver for ordinary speaker (beep) diff --git a/SecureBoot/readme.txt b/SecureBoot/readme.txt index 6e2dc43..ce2d3d3 100644 --- a/SecureBoot/readme.txt +++ b/SecureBoot/readme.txt @@ -1,13 +1,17 @@ -To update secure boot configuration +Secure Boot: +In order to allow VeraCrypt EFI bootloader to run when EFI Secure Boot is enabled, VeraCrypt EFI bootloader files are signed by custom key(DCS_sign) +whose public part can be loaded into Secure Boot to allow verification of VeraCrypt EFI files. + +to update Secure Boot configuration steps: 1. Enter BIOS configuration 2. Switch Secure boot to setup mode (or custom mode). It deletes PK (platform certificate) and allows to load DCS platform key. 3. Boot Windows 4. execute from admin command prompt - powershell -File sb_set_siglists.ps1 + powershell -ExecutionPolicy Bypass -File sb_set_siglists.ps1 It sets in PK (platform key) - DCS_platform It sets in KEK (key exchange key) - DCS_key_exchange It sets in db - DCS_sign MicWinProPCA2011_2011-10-19 MicCorUEFCA2011_2011-06-27 All DCS modules are protected by DCS_sign. All Windows modules are protected by MicWinProPCA2011_2011-10-19 -All SHIM(linux) modules are protected by MicCorUEFCA2011_2011-06-27 \ No newline at end of file +All SHIM(linux) modules are protected by MicCorUEFCA2011_2011-06-27 \ No newline at end of file -- cgit v1.2.3