From fdfe9f849c15dc4b864a72fcbc5266edb68171c1 Mon Sep 17 00:00:00 2001 From: kavsrf Date: Sun, 5 Feb 2017 23:45:29 +0300 Subject: DcsCfg dumps of secregion and tables --- DcsCfg/DcsCfg.h | 7 +++++ DcsCfg/DcsCfgCrypt.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ DcsCfg/DcsCfgMain.c | 22 ++++++++++++++ Include/Library/DcsCfgLib.h | 5 ++++ Library/DcsCfgLib/GptEdit.c | 45 ++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+) diff --git a/DcsCfg/DcsCfg.h b/DcsCfg/DcsCfg.h index 8a9a15a..6fda422 100644 --- a/DcsCfg/DcsCfg.h +++ b/DcsCfg/DcsCfg.h @@ -95,6 +95,13 @@ EFI_STATUS SecRigionAdd( IN UINTN regIdx ); + +EFI_STATUS +SecRigionDump( + IN EFI_HANDLE hBio, + IN CHAR16 *prefix + ); + ////////////////////////////////////////////////////////////////////////// // Set DcsInt parameters ////////////////////////////////////////////////////////////////////////// diff --git a/DcsCfg/DcsCfgCrypt.c b/DcsCfg/DcsCfgCrypt.c index 94f8768..dc87534 100644 --- a/DcsCfg/DcsCfgCrypt.c +++ b/DcsCfg/DcsCfgCrypt.c @@ -18,6 +18,7 @@ https://opensource.org/licenses/LGPL-3.0 #include #include #include +#include #include #include @@ -1371,6 +1372,77 @@ error: return res; } +EFI_STATUS +SecRigionDump( + IN EFI_HANDLE hBio, + IN CHAR16 *prefix + ) +{ + EFI_STATUS res = EFI_SUCCESS; + EFI_BLOCK_IO_PROTOCOL* bio; + DCS_AUTH_DATA_MARK* adm = NULL; + UINT32 crc; + UINT8* SecRegionData = NULL; + UINTN SecRegionSize = 0; + UINTN SecRegionOffset = 0; + UINTN saveSize = 0; + UINTN idx = 0; + CHAR16 name[128]; + + adm = (DCS_AUTH_DATA_MARK*)MEM_ALLOC(512); + if (adm == NULL) { + ERR_PRINT(L"no memory\n"); + return EFI_BUFFER_TOO_SMALL; + } + + bio = EfiGetBlockIO(hBio); + if (bio == NULL) { + ERR_PRINT(L"No block IO"); + res = EFI_ACCESS_DENIED; + goto err; + } + + CE(bio->ReadBlocks(bio, bio->Media->MediaId, 61, 512, adm)); + CE(gBS->CalculateCrc32(&adm->PlatformCrc, sizeof(*adm) - 4, &crc)); + + if (adm->HeaderCrc != crc) { + res = EFI_INVALID_PARAMETER; + } + + SecRegionSize = adm->AuthDataSize * 128 * 1024; + SecRegionData = MEM_ALLOC(SecRegionSize); + if (SecRegionData == NULL) { + res = EFI_BUFFER_TOO_SMALL; + goto err; + } + CE(bio->ReadBlocks(bio, bio->Media->MediaId, 62, SecRegionSize, SecRegionData)); + + do { + // EFI tables? + if (TablesVerify(SecRegionSize - SecRegionOffset, SecRegionData + SecRegionOffset)) { + EFI_TABLE_HEADER *mhdr = (EFI_TABLE_HEADER *)(SecRegionData + SecRegionOffset); + UINTN tblZones = (mhdr->HeaderSize + 1024 * 128 - 1) / (1024 * 128); + saveSize = tblZones * 1024 * 128; + } else { + saveSize = 1024 * 128; + } + UnicodeSPrint(name, sizeof(name), L"%s%d", prefix, idx); + CE(FileSave(NULL, name, SecRegionData + SecRegionOffset, saveSize)); + OUT_PRINT(L"%s saved\n", name); + idx += saveSize / (1024 * 128); + SecRegionOffset += saveSize; + } while (SecRegionOffset < SecRegionSize); + +err: + if (EFI_ERROR(res)) { + ERR_PRINT(L"%r\n", res); + } + MEM_FREE(adm); + MEM_FREE(SecRegionData); + return res; +} + + EFI_STATUS SecRigionAdd( IN UINTN regIdx diff --git a/DcsCfg/DcsCfgMain.c b/DcsCfg/DcsCfgMain.c index ec92b25..daf0fb0 100644 --- a/DcsCfg/DcsCfgMain.c +++ b/DcsCfg/DcsCfgMain.c @@ -75,6 +75,7 @@ https://opensource.org/licenses/LGPL-3.0 #define OPT_SECREGION_MARK L"-srm" #define OPT_SECREGION_WIPE L"-srw" #define OPT_SECREGION_ADD L"-sra" +#define OPT_SECREGION_DUMP L"-srdump" #define OPT_WIPE L"-wipe" #define OPT_OS_DECRYPT L"-osdecrypt" #define OPT_OS_RESTORE_KEY L"-osrestorekey" @@ -88,8 +89,10 @@ https://opensource.org/licenses/LGPL-3.0 #define OPT_TBL_NAME L"-tbn" #define OPT_TBL_DELETE L"-tbd" #define OPT_TBL_APPEND L"-tba" +#define OPT_TBL_DUMP L"-tbdump" STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + { OPT_TBL_DUMP, TypeValue }, { OPT_TBL_FILE, TypeValue }, { OPT_TBL_ZERO, TypeFlag }, { OPT_TBL_LIST, TypeFlag }, @@ -137,6 +140,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { { OPT_SECREGION_MARK, TypeValue }, { OPT_SECREGION_WIPE, TypeValue }, { OPT_SECREGION_ADD, TypeValue }, + { OPT_SECREGION_DUMP, TypeValue }, { OPT_WIPE, TypeDoubleValue }, { OPT_OS_DECRYPT, TypeFlag }, { OPT_OS_RESTORE_KEY, TypeFlag }, @@ -264,6 +268,13 @@ DcsCfgMain( res = TablesNew(opt1, opt2); } + if (ShellCommandLineGetFlag(Package, OPT_TBL_DUMP)) + { + CONST CHAR16* opt = NULL; + opt = ShellCommandLineGetValue(Package, OPT_TBL_DUMP); + res = TablesDump((CHAR16*)opt); + } + if (ShellCommandLineGetFlag(Package, OPT_TBL_LIST)) { if (gDcsTables == NULL) TablesLoad(); OUT_PRINT(L"Size = %d, Zones=%d\n", gDcsTablesSize, (gDcsTablesSize + 128 * 1024 - 1) / (128 * 1024)); @@ -692,6 +703,17 @@ DcsCfgMain( } } + if (ShellCommandLineGetFlag(Package, OPT_SECREGION_DUMP)) { + if (ShellCommandLineGetFlag(Package, OPT_DISK_START)) { + CONST CHAR16* opt = NULL; + opt = ShellCommandLineGetValue(Package, OPT_SECREGION_DUMP); + SecRigionDump(gBIOHandles[BioIndexStart], (CHAR16*)opt); + } else { + ERR_PRINT(L"Select disk"); + return EFI_INVALID_PARAMETER; + } + } + // Encrypt, decrypt, change password if (ShellCommandLineGetFlag(Package, OPT_DISK_CHECK)) { DisksAuthCheck(); diff --git a/Include/Library/DcsCfgLib.h b/Include/Library/DcsCfgLib.h index 259004e..4c8153b 100644 --- a/Include/Library/DcsCfgLib.h +++ b/Include/Library/DcsCfgLib.h @@ -138,6 +138,11 @@ TablesList( IN VOID* tables ); +EFI_STATUS +TablesDump( + IN CHAR16 *prefix + ); + ////////////////////////////////////////////////////////////////////////// // Random ////////////////////////////////////////////////////////////////////////// diff --git a/Library/DcsCfgLib/GptEdit.c b/Library/DcsCfgLib/GptEdit.c index d486909..5545791 100644 --- a/Library/DcsCfgLib/GptEdit.c +++ b/Library/DcsCfgLib/GptEdit.c @@ -14,6 +14,7 @@ https://opensource.org/licenses/LGPL-3.0 #include #include #include +#include #include #include @@ -814,6 +815,50 @@ err: return res; } +EFI_STATUS +TablesDump( + IN CHAR16 *prefix + ) { + EFI_TABLE_HEADER *mhdr = NULL; + EFI_STATUS res = EFI_SUCCESS; + CHAR16 name[128]; + + if (gDcsTables == NULL) { + CE(TablesLoad()); + } + + mhdr = (EFI_TABLE_HEADER *)gDcsTables; + if (gDcsTables != NULL && + mhdr->Signature == EFITABLE_HEADER_SIGN && + GptHeaderCheckCrc(gDcsTablesSize, mhdr)) { + UINT8* raw = (UINT8*)gDcsTables; + UINTN rawSize = mhdr->HeaderSize; + UINTN tpos = sizeof(EFI_TABLE_HEADER); + while (tpos < rawSize) { + EFI_TABLE_HEADER *hdr = (EFI_TABLE_HEADER *)(raw + tpos); + CHAR8 asc_sign[sizeof(hdr->Signature) + 1] = { 0 }; + CopyMem(asc_sign, &hdr->Signature, sizeof(hdr->Signature)); + asc_sign[sizeof(hdr->Signature)] = 0; + UnicodeSPrint(name, sizeof(name), L"%s%a", prefix, asc_sign); + OUT_PRINT(L"%s, SZ=%d", name, hdr->HeaderSize); + if (!GptHeaderCheckCrc(rawSize - tpos, hdr)) { + ERR_PRINT(L" - wrong crc\n"); + return EFI_CRC_ERROR; // wrong crc + } + CE(FileSave(NULL, name, raw + tpos + sizeof(EFI_TABLE_HEADER), hdr->HeaderSize - sizeof(EFI_TABLE_HEADER))); + OUT_PRINT(L" - saved\n"); + tpos += hdr->HeaderSize; + } + return EFI_SUCCESS; + } + +err: + if (EFI_ERROR(res)) { + ERR_PRINT(L"Tables load error %r\n", res); + } + return res; +} + EFI_STATUS TablesNew( IN CONST CHAR16* signStr, -- cgit v1.2.3