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

Unified Diff: firmware/lib/vboot_common.c

Issue 6626045: Pass VbSharedData between LoadFirmware() and LoadKernel() (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/vboot_reference.git@master
Patch Set: Fixed load_kernel_test Created 9 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: firmware/lib/vboot_common.c
diff --git a/firmware/lib/vboot_common.c b/firmware/lib/vboot_common.c
index be76b054fa3f8f846edf096c6662efe885e0e77a..a2bdbefe607b58cb5039c181f7dc4ceb22a7c283 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,61 @@ 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 (!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);
Bill Richardson 2011/03/09 20:52:20 What is the relationship between data_size and dat
Randall Spangler 2011/03/09 21:11:35 There is. See the first if() in this func. size i
+
+ /* 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)
+ return 0; /* Not initialize, 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);
+}

Powered by Google App Engine
This is Rietveld 408576698