Fixed NVAR DataOnly+Auth variables

- such variable have a new timestamp in extended header, but no hash
This commit is contained in:
Nikolaj Schlej 2016-07-14 19:28:02 +02:00
parent 72116d01c0
commit feb74c3299
2 changed files with 38 additions and 19 deletions

View File

@ -17,7 +17,7 @@
UEFITool::UEFITool(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::UEFITool),
version(tr("NE Alpha31"))
version(tr("NE Alpha32"))
{
clipboard = QApplication::clipboard();

View File

@ -3010,7 +3010,8 @@ USTATUS FfsParser::parseNvarStore(const UModelIndex & index)
bool isDataOnly = false;
bool hasExtendedHeader = false;
bool hasChecksum = false;
bool hasTimestampAndHash = false;
bool hasTimestamp = false;
bool hasHash = false;
bool hasGuidIndex = false;
UINT32 guidIndex = 0;
@ -3149,6 +3150,19 @@ USTATUS FfsParser::parseNvarStore(const UModelIndex & index)
// Entry with authenticated write (for SecureBoot)
if (entryHeader->Attributes & NVRAM_NVAR_ENTRY_AUTH_WRITE) {
if ((entryHeader->Attributes & NVRAM_NVAR_ENTRY_DATA_ONLY)) {// Data only auth. variables has no hash
if ((UINT32)tail.size() < sizeof(UINT64)) {
msgExtDataTooShort = true;
isInvalid = true;
// Do not parse further
goto parsing_done;
}
timestamp = *(UINT64*)(tail.constData() + sizeof(UINT8));
hasTimestamp = true;
msgUnknownExtDataFormat = false;
}
else { // Full or link variable have hash
if ((UINT32)tail.size() < sizeof(UINT64) + SHA256_HASH_SIZE) {
msgExtDataTooShort = true;
isInvalid = true;
@ -3158,16 +3172,18 @@ USTATUS FfsParser::parseNvarStore(const UModelIndex & index)
timestamp = *(UINT64*)(tail.constData() + sizeof(UINT8));
hash = tail.mid(sizeof(UINT64) + sizeof(UINT8), SHA256_HASH_SIZE);
hasTimestampAndHash = true;
hasTimestamp = true;
hasHash = true;
msgUnknownExtDataFormat = false;
}
}
}
// Entry is data-only (nameless and GUIDless entry or link)
if (entryHeader->Attributes & NVRAM_NVAR_ENTRY_DATA_ONLY) { // Data-only attribute is set
isInvalidLink = true;
UModelIndex nvarIndex;
// Search prevously added entries for a link to this variable //TODO:replace with linked lists
// Search prevously added entries for a link to this variable
for (int i = 0; i < model->rowCount(index); i++) {
nvarIndex = index.child(i, 0);
PARSING_DATA nvarPdata = parsingDataFromUModelIndex(nvarIndex);
@ -3269,15 +3285,18 @@ parsing_done:
extendedHeaderSize, extendedHeaderSize,
extendedAttributes) + nvarExtendedAttributesToUString(extendedAttributes) + UString(")");
// Checksum
// Add checksum
if (hasChecksum)
info += usprintf("\nChecksum: %02Xh", storedChecksum) +
(calculatedChecksum ? usprintf(", invalid, should be %02Xh", 0x100 - calculatedChecksum) : UString(", valid"));
// Authentication data
if (hasTimestampAndHash) {
info += usprintf("\nTimestamp: %" PRIX64 "h\nHash: ",
timestamp) + UString(hash.toHex().constData());
}
// Add timestamp
if (hasTimestamp)
info += usprintf("\nTimestamp: %" PRIX64 "h", timestamp);
// Add hash
if (hasHash)
info += UString("\nHash: ") + UString(hash.toHex().constData());
}
// Add correct offset to parsing data