Index: src/platform/vboot_reference/utils/kernel_image.c |
diff --git a/src/platform/vboot_reference/utils/kernel_image.c b/src/platform/vboot_reference/utils/kernel_image.c |
index 8201137a4f32fb2c53c48c4bc38eb36bd7ef8b81..a1b943f83a556fecd489bdf24dca60eb24e582e9 100644 |
--- a/src/platform/vboot_reference/utils/kernel_image.c |
+++ b/src/platform/vboot_reference/utils/kernel_image.c |
@@ -132,6 +132,7 @@ KernelImage* ReadKernelImage(const char* input_file) { |
/* Read the kernel config. */ |
StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version)); |
StatefulMemcpy(&st, &image->options.version, FIELD_LEN(options.version)); |
+ StatefulMemcpy(&st, &image->options.cmd_line, FIELD_LEN(options.cmd_line)); |
StatefulMemcpy(&st, &image->options.kernel_len, |
FIELD_LEN(options.kernel_len)); |
StatefulMemcpy(&st, &image->options.kernel_load_addr, |
@@ -193,7 +194,8 @@ uint8_t* GetKernelHeaderBlob(const KernelImage* image) { |
} |
int GetKernelConfigLen(const KernelImage* image) { |
- return (FIELD_LEN(kernel_version) + FIELD_LEN(options.version) + |
+ return (FIELD_LEN(kernel_version) + |
+ FIELD_LEN(options.version) + FIELD_LEN(options.cmd_line) + |
FIELD_LEN(options.kernel_len) + FIELD_LEN(options.kernel_load_addr) + |
FIELD_LEN(options.kernel_entry_addr)); |
} |
@@ -208,6 +210,7 @@ uint8_t* GetKernelConfigBlob(const KernelImage* image) { |
StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); |
StatefulMemcpy_r(&st, image->options.version, FIELD_LEN(options.version)); |
+ StatefulMemcpy_r(&st, image->options.cmd_line, FIELD_LEN(options.cmd_line)); |
StatefulMemcpy_r(&st, &image->options.kernel_len, |
FIELD_LEN(options.kernel_len)); |
StatefulMemcpy_r(&st, &image->options.kernel_load_addr, |
@@ -314,11 +317,13 @@ void PrintKernelImage(const KernelImage* image) { |
/* Print preamble. */ |
printf("Kernel Version = %d\n" |
"Kernel Config Version = %d.%d\n" |
+ "Kernel Config command line = %s\n" |
"kernel Length = %" PRId64 "\n" |
"Kernel Load Address = %" PRId64 "\n" |
"Kernel Entry Address = %" PRId64 "\n\n", |
image->kernel_version, |
image->options.version[0], image->options.version[1], |
+ image->options.cmd_line, |
image->options.kernel_len, |
image->options.kernel_load_addr, |
image->options.kernel_entry_addr); |
@@ -420,11 +425,7 @@ int VerifyKernelConfig(RSAPublicKey* kernel_sign_key, |
int algorithm, |
int* kernel_len) { |
uint32_t len, config_len; |
- config_len = (FIELD_LEN(kernel_version) + |
- FIELD_LEN(options.version)+ |
- FIELD_LEN(options.kernel_len) + |
- FIELD_LEN(options.kernel_load_addr) + |
- FIELD_LEN(options.kernel_entry_addr)); |
+ config_len = GetKernelConfigLen(NULL); |
if (!RSAVerifyBinary_f(NULL, kernel_sign_key, /* Key to use */ |
config_blob, /* Data to verify */ |
config_len, /* Length of data */ |
@@ -432,8 +433,9 @@ int VerifyKernelConfig(RSAPublicKey* kernel_sign_key, |
algorithm)) |
return VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED; |
- Memcpy(&len, config_blob + (FIELD_LEN(kernel_version)+ |
- FIELD_LEN(options.version)), |
+ Memcpy(&len, |
+ config_blob + (FIELD_LEN(kernel_version) + FIELD_LEN(options.version) + |
+ FIELD_LEN(options.cmd_line)), |
sizeof(len)); |
*kernel_len = (int) len; |
return 0; |
@@ -506,11 +508,7 @@ int VerifyKernel(const uint8_t* firmware_key_blob, |
} |
/* Only continue if kernel data verification succeeds. */ |
kernel_ptr = (config_ptr + |
- FIELD_LEN(kernel_version) + |
- FIELD_LEN(options.version) + |
- FIELD_LEN(options.kernel_len) + |
- FIELD_LEN(options.kernel_entry_addr) + |
- FIELD_LEN(options.kernel_load_addr) + |
+ GetKernelConfigLen(NULL) + /* Skip config block/signature. */ |
kernel_signature_len); |
if ((error_code = VerifyKernelData(kernel_sign_key, kernel_ptr, kernel_len, |
@@ -587,8 +585,10 @@ int VerifyKernelImage(const RSAPublicKey* firmware_key, |
DigestInit(&ctx, image->kernel_sign_algorithm); |
DigestUpdate(&ctx, (uint8_t*) &image->kernel_version, |
FIELD_LEN(kernel_version)); |
- DigestUpdate(&ctx, (uint8_t*) &image->options.version, |
+ DigestUpdate(&ctx, (uint8_t*) image->options.version, |
FIELD_LEN(options.version)); |
+ DigestUpdate(&ctx, (uint8_t*) image->options.cmd_line, |
+ FIELD_LEN(options.cmd_line)); |
DigestUpdate(&ctx, (uint8_t*) &image->options.kernel_len, |
FIELD_LEN(options.kernel_len)); |
DigestUpdate(&ctx, (uint8_t*) &image->options.kernel_load_addr, |