Index: src/platform/vboot_reference/vkernel/kernel_image.c |
diff --git a/src/platform/vboot_reference/vkernel/kernel_image.c b/src/platform/vboot_reference/vkernel/kernel_image.c |
index 0c323f7299c9622c947ed0831b880b2444b1e7aa..e0b7a55d79c6bba2778e48bf228773aa0077e1e6 100644 |
--- a/src/platform/vboot_reference/vkernel/kernel_image.c |
+++ b/src/platform/vboot_reference/vkernel/kernel_image.c |
@@ -322,10 +322,13 @@ uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) { |
int WriteKernelImage(const char* output_file, |
const KernelImage* image, |
- int is_only_vblock) { |
+ int is_only_vblock, |
+ int is_subkey_out) { |
int fd; |
int success = 1; |
- uint8_t* kernel_blob; |
+ uint8_t* kernel_blob = NULL; |
+ uint8_t* subkey_out_buf = NULL; |
+ uint8_t* subkey_header = NULL; |
uint64_t blob_len; |
if (!image) |
@@ -335,6 +338,26 @@ int WriteKernelImage(const char* output_file, |
output_file); |
return 0; |
} |
+ if (is_subkey_out) { |
+ blob_len = GetKernelHeaderLen(image) + |
+ siglen_map[image->firmware_sign_algorithm]; |
+ subkey_out_buf = (uint8_t*) Malloc(blob_len); |
+ subkey_header = GetKernelHeaderBlob(image); |
+ Memcpy(subkey_out_buf, subkey_header, GetKernelHeaderLen(image)); |
+ Memcpy(subkey_out_buf + GetKernelHeaderLen(image), |
+ image->kernel_key_signature, |
+ siglen_map[image->firmware_sign_algorithm]); |
+ if (blob_len != write(fd, subkey_out_buf, blob_len)) { |
+ debug("Couldn't write Kernel Subkey header to file: %s\n", |
+ output_file); |
+ success = 0; |
+ } |
+ Free(subkey_header); |
+ Free(subkey_out_buf); |
+ close(fd); |
+ return success; |
+ } |
+ |
kernel_blob = GetKernelBlob(image, &blob_len); |
if (!kernel_blob) { |
debug("Couldn't create kernel blob from KernelImage.\n"); |