Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Unified Diff: src/platform/vboot_reference/utils/firmware_image.c

Issue 1088001: Add --describe flag to {firmware|kernel}_utility. (Closed)
Patch Set: Review fixes Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/platform/vboot_reference/utils/firmware_image.c
diff --git a/src/platform/vboot_reference/utils/firmware_image.c b/src/platform/vboot_reference/utils/firmware_image.c
index e7dcde93eb76814815756a96305e8eb8e39a08c0..ab41fec910dc26679dc1e89140a0aea8dd0463ff 100644
--- a/src/platform/vboot_reference/utils/firmware_image.c
+++ b/src/platform/vboot_reference/utils/firmware_image.c
@@ -53,6 +53,7 @@ FirmwareImage* ReadFirmwareImage(const char* input_file) {
int firmware_sign_key_len;
int signature_len;
uint8_t* firmware_buf;
+ uint8_t header_checksum[FIELD_LEN(header_checksum)];
MemcpyState st;
FirmwareImage* image = FirmwareImageNew();
@@ -102,6 +103,15 @@ FirmwareImage* ReadFirmwareImage(const char* input_file) {
FIELD_LEN(firmware_key_version));
StatefulMemcpy(&st, image->header_checksum, FIELD_LEN(header_checksum));
+ /* Check whether the header checksum matches. */
+ CalculateFirmwareHeaderChecksum(image, header_checksum);
+ if (SafeMemcmp(header_checksum, image->header_checksum,
+ FIELD_LEN(header_checksum))) {
+ fprintf(stderr, "Invalid firmware header checksum!\n");
+ Free(firmware_buf);
+ return NULL;
+ }
+
/* Read key signature. */
StatefulMemcpy(&st, image->firmware_key_signature,
FIELD_LEN(firmware_key_signature));
@@ -136,6 +146,26 @@ int GetFirmwareHeaderLen(const FirmwareImage* image) {
FIELD_LEN(firmware_key_version) + FIELD_LEN(header_checksum));
}
+void CalculateFirmwareHeaderChecksum(const FirmwareImage* image,
+ uint8_t* header_checksum) {
+ uint8_t* checksum;
+ DigestContext ctx;
+ DigestInit(&ctx, SHA512_DIGEST_ALGORITHM);
+ DigestUpdate(&ctx, (uint8_t*) &image->header_len,
+ sizeof(image->header_len));
+ DigestUpdate(&ctx, (uint8_t*) &image->firmware_sign_algorithm,
+ sizeof(image->firmware_sign_algorithm));
+ DigestUpdate(&ctx, image->firmware_sign_key,
+ RSAProcessedKeySize(image->firmware_sign_algorithm));
+ DigestUpdate(&ctx, (uint8_t*) &image->firmware_key_version,
+ sizeof(image->firmware_key_version));
+ checksum = DigestFinal(&ctx);
+ Memcpy(header_checksum, checksum, FIELD_LEN(header_checksum));
+ Free(checksum);
+ return;
+}
+
+
uint8_t* GetFirmwareHeaderBlob(const FirmwareImage* image) {
uint8_t* header_blob = NULL;
MemcpyState st;
@@ -262,11 +292,9 @@ void PrintFirmwareImage(const FirmwareImage* image) {
/* Print header. */
printf("Header Length = %d\n"
- "Algorithm Id = %d\n"
- "Signature Algorithm = %s\n"
- "Key Version = %d\n\n",
+ "Firmware Signature Algorithm = %s\n"
+ "Firmware Key Version = %d\n\n",
image->header_len,
- image->firmware_sign_algorithm,
algo_strings[image->firmware_sign_algorithm],
image->firmware_key_version);
/* TODO(gauravsh): Output hash and key signature here? */
« no previous file with comments | « src/platform/vboot_reference/tests/kernel_image_tests.c ('k') | src/platform/vboot_reference/utils/firmware_utility.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698