Index: firmware/lib/vboot_common.c |
diff --git a/firmware/lib/vboot_common.c b/firmware/lib/vboot_common.c |
index be76b054fa3f8f846edf096c6662efe885e0e77a..abba130bf6489494b35f2ae89a520c874ff76c1b 100644 |
--- a/firmware/lib/vboot_common.c |
+++ b/firmware/lib/vboot_common.c |
@@ -1,4 +1,4 @@ |
-/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
+/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
* |
@@ -19,6 +19,7 @@ char* kVbootErrors[VBOOT_ERROR_MAX] = { |
"Public key invalid.", |
"Preamble invalid.", |
"Preamble signature check failed.", |
+ "Shared data invalid." |
}; |
@@ -377,3 +378,67 @@ int VerifyKernelPreamble(const VbKernelPreambleHeader* preamble, |
/* Success */ |
return VBOOT_SUCCESS; |
} |
+ |
+ |
+int VbSharedDataInit(VbSharedDataHeader* header, uint64_t size) { |
+ if (size < sizeof(VbSharedDataHeader)) { |
+ VBDEBUG(("Not enough data for header.\n")); |
+ return VBOOT_SHARED_DATA_INVALID; |
+ } |
+ if (size < VB_SHARED_DATA_MIN_SIZE) { |
+ VBDEBUG(("Shared data buffer too small.\n")); |
+ return VBOOT_SHARED_DATA_INVALID; |
+ } |
+ |
+ if (!header) |
+ return VBOOT_SHARED_DATA_INVALID; |
+ |
+ /* Zero the header */ |
+ Memset(header, 0, sizeof(VbSharedDataHeader)); |
+ |
+ /* Initialize fields */ |
+ header->struct_version = VB_SHARED_DATA_VERSION; |
+ header->struct_size = sizeof(VbSharedDataHeader); |
+ header->data_size = size; |
+ header->data_used = sizeof(VbSharedDataHeader); |
+ |
+ /* Success */ |
+ return VBOOT_SUCCESS; |
+} |
+ |
+ |
+uint64_t VbSharedDataReserve(VbSharedDataHeader* header, uint64_t size) { |
+ uint64_t offs = header->data_used; |
+ |
+ if (!header || size > header->data_size - header->data_used) { |
+ VBDEBUG(("VbSharedData buffer out of space.\n")); |
+ return 0; /* Not initialized, or not enough space left. */ |
+ } |
+ header->data_used += size; |
+ return offs; |
+} |
+ |
+ |
+int VbSharedDataSetKernelKey(VbSharedDataHeader* header, |
+ const VbPublicKey* src) { |
+ |
+ VbPublicKey *kdest = &header->kernel_subkey; |
+ |
+ if (!header) |
+ return VBOOT_SHARED_DATA_INVALID; |
+ |
+ /* Attempt to allocate space for the key, if it hasn't been allocated yet */ |
+ if (!header->kernel_subkey_data_offset) { |
+ header->kernel_subkey_data_offset = VbSharedDataReserve(header, |
+ src->key_size); |
+ if (!header->kernel_subkey_data_offset) |
+ return VBOOT_SHARED_DATA_INVALID; |
+ header->kernel_subkey_data_size = src->key_size; |
+ } |
+ |
+ /* Copy the kernel sign key blob into the destination buffer */ |
+ PublicKeyInit(kdest, (uint8_t*)header + header->kernel_subkey_data_offset, |
+ header->kernel_subkey_data_size); |
+ |
+ return PublicKeyCopy(kdest, src); |
+} |