diff options
-rw-r--r-- | firmware/include/vboot_struct.h | 46 | ||||
-rw-r--r-- | host/include/host_common.h | 64 | ||||
-rw-r--r-- | host/lib/host_common.c | 274 |
3 files changed, 140 insertions, 244 deletions
diff --git a/firmware/include/vboot_struct.h b/firmware/include/vboot_struct.h index d98ba114..8023cdc9 100644 --- a/firmware/include/vboot_struct.h +++ b/firmware/include/vboot_struct.h @@ -94,52 +94,6 @@ typedef struct VbKeyBlockHeader { /****************************************************************************/ -#define EC_PREAMBLE_HEADER_VERSION_MAJOR 1 -#define EC_PREAMBLE_HEADER_VERSION_MINOR 0 - -/* Flags for VbECPreambleHeader.flags */ - -/* - * Use the normal boot path from the read-only firmware, instead of verifying - * the body signature. - */ -#define VB_EC_PREAMBLE_USE_RO_NORMAL 0x00000001 - -/* - * Premable block for EC rewritable firmware, version 1.0. - * - * The firmware preamble header should be followed by: - * 1) The signature data for the firmware body, pointed to by - * body_signature.sig_offset. - * 2) The signature data for (header + body signature data), pointed - * to by preamble_signature.sig_offset. - */ -typedef struct VbECPreambleHeader { - /* - * Size of this preamble, including keys, signatures, and padding, in - * bytes - */ - uint64_t preamble_size; - /* Signature for this preamble (header + * body signature) */ - VbSignature preamble_signature; - /* Version of this header format */ - uint32_t header_version_major; - /* Version of this header format */ - uint32_t header_version_minor; - /* Firmware version */ - uint64_t firmware_version; - /* Digest for the firmware body */ - VbSignature body_digest; - /* Flags; see VB_EC_PREAMBLE_* */ - uint32_t flags; - /* Human-readable ASCII, null-padded */ - char name[128]; -} __attribute__((packed)) VbECPreambleHeader; - -#define EXPECTED_VB_EC_PREAMBLE_HEADER1_0_SIZE 76 - -/****************************************************************************/ - #define FIRMWARE_PREAMBLE_HEADER_VERSION_MAJOR 2 #define FIRMWARE_PREAMBLE_HEADER_VERSION_MINOR 1 diff --git a/host/include/host_common.h b/host/include/host_common.h index 6fa8b3e3..40ce212a 100644 --- a/host/include/host_common.h +++ b/host/include/host_common.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. +/* Copyright (c) 2013 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. * @@ -8,8 +8,10 @@ #ifndef VBOOT_REFERENCE_HOST_COMMON_H_ #define VBOOT_REFERENCE_HOST_COMMON_H_ -/* Host is allowed direct use of stdlib funcs such as malloc() and free(), - * since it's using the stub implementation from firmware/lib/stub. */ +/* + * Host is allowed direct use of stdlib funcs such as malloc() and free(), + * since it's using the stub implementation from firmware/lib/stub. + */ #define _STUB_IMPLEMENTATION_ #include "cryptolib.h" @@ -21,42 +23,34 @@ #include "vboot_api.h" #include "vboot_struct.h" - -/* Creates an EC preamble, signed with [signing_key]. - * Caller owns the returned pointer, and must free it with Free(). +/** + * Create a firmware preamble, signed with [signing_key]. * - * Returns NULL if error. */ -VbECPreambleHeader* CreateECPreamble( - uint64_t firmware_version, - const VbSignature* body_signature, - const VbPrivateKey* signing_key, - uint32_t flags, - const char* name); - - -/* Creates a firmware preamble, signed with [signing_key]. * Caller owns the returned pointer, and must free it with Free(). * - * Returns NULL if error. */ -VbFirmwarePreambleHeader* CreateFirmwarePreamble( - uint64_t firmware_version, - const VbPublicKey* kernel_subkey, - const VbSignature* body_signature, - const VbPrivateKey* signing_key, - uint32_t flags); - - -/* Creates a kernel preamble, signed with [signing_key]. + * Returns NULL if error. + */ +VbFirmwarePreambleHeader *CreateFirmwarePreamble( + uint64_t firmware_version, + const VbPublicKey *kernel_subkey, + const VbSignature *body_signature, + const VbPrivateKey *signing_key, + uint32_t flags); + +/** + * Create a kernel preamble, signed with [signing_key]. + * * Caller owns the returned pointer, and must free it with Free(). * - * Returns NULL if error. */ -VbKernelPreambleHeader* CreateKernelPreamble( - uint64_t kernel_version, - uint64_t body_load_address, - uint64_t bootloader_address, - uint64_t bootloader_size, - const VbSignature* body_signature, - uint64_t desired_size, - const VbPrivateKey* signing_key); + * Returns NULL if error. + */ +VbKernelPreambleHeader *CreateKernelPreamble( + uint64_t kernel_version, + uint64_t body_load_address, + uint64_t bootloader_address, + uint64_t bootloader_size, + const VbSignature *body_signature, + uint64_t desired_size, + const VbPrivateKey *signing_key); #endif /* VBOOT_REFERENCE_HOST_COMMON_H_ */ diff --git a/host/lib/host_common.c b/host/lib/host_common.c index 3aceddd6..9f6121de 100644 --- a/host/lib/host_common.c +++ b/host/lib/host_common.c @@ -1,179 +1,127 @@ -/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. +/* Copyright (c) 2013 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. * * Host functions for verified boot. + * + * TODO: change all 'return 0', 'return 1' into meaningful return codes. */ -/* TODO: change all 'return 0', 'return 1' into meaningful return codes */ #include <string.h> #include "host_common.h" - #include "cryptolib.h" #include "utility.h" #include "vboot_common.h" -VbECPreambleHeader* CreateECPreamble( - uint64_t firmware_version, - const VbSignature* body_digest, - const VbPrivateKey* signing_key, - uint32_t flags, - const char* name) { - - VbECPreambleHeader* h; - uint64_t signed_size = (sizeof(VbECPreambleHeader) + body_digest->sig_size); - uint64_t block_size = signed_size + siglen_map[signing_key->algorithm]; - uint8_t* body_digest_dest; - uint8_t* block_sig_dest; - VbSignature *sigtmp; - - /* Allocate key block */ - h = (VbECPreambleHeader*)malloc(block_size); - if (!h) - return NULL; - Memset(h, 0, block_size); - body_digest_dest = (uint8_t*)(h + 1); - block_sig_dest = body_digest_dest + body_digest->sig_size; - - h->header_version_major = EC_PREAMBLE_HEADER_VERSION_MAJOR; - h->header_version_minor = EC_PREAMBLE_HEADER_VERSION_MINOR; - h->preamble_size = block_size; - h->firmware_version = firmware_version; - h->flags = flags; - if (name) - strncpy(h->name, name, sizeof(h->name)); - - /* Copy body hash */ - SignatureInit(&h->body_digest, body_digest_dest, - body_digest->sig_size, 0); - SignatureCopy(&h->body_digest, body_digest); - - /* Set up signature struct so we can calculate the signature */ - SignatureInit(&h->preamble_signature, block_sig_dest, - siglen_map[signing_key->algorithm], signed_size); - - /* Calculate signature */ - sigtmp = CalculateSignature((uint8_t*)h, signed_size, signing_key); - SignatureCopy(&h->preamble_signature, sigtmp); - free(sigtmp); - - /* Return the header */ - return h; -} - -VbFirmwarePreambleHeader* CreateFirmwarePreamble( - uint64_t firmware_version, - const VbPublicKey* kernel_subkey, - const VbSignature* body_signature, - const VbPrivateKey* signing_key, - uint32_t flags) { - - VbFirmwarePreambleHeader* h; - uint64_t signed_size = (sizeof(VbFirmwarePreambleHeader) + - kernel_subkey->key_size + - body_signature->sig_size); - uint64_t block_size = signed_size + siglen_map[signing_key->algorithm]; - uint8_t* kernel_subkey_dest; - uint8_t* body_sig_dest; - uint8_t* block_sig_dest; - VbSignature *sigtmp; - - /* Allocate key block */ - h = (VbFirmwarePreambleHeader*)malloc(block_size); - if (!h) - return NULL; - Memset(h, 0, block_size); - kernel_subkey_dest = (uint8_t*)(h + 1); - body_sig_dest = kernel_subkey_dest + kernel_subkey->key_size; - block_sig_dest = body_sig_dest + body_signature->sig_size; - - h->header_version_major = FIRMWARE_PREAMBLE_HEADER_VERSION_MAJOR; - h->header_version_minor = FIRMWARE_PREAMBLE_HEADER_VERSION_MINOR; - h->preamble_size = block_size; - h->firmware_version = firmware_version; - h->flags = flags; - - /* Copy data key */ - PublicKeyInit(&h->kernel_subkey, kernel_subkey_dest, - kernel_subkey->key_size); - PublicKeyCopy(&h->kernel_subkey, kernel_subkey); - - /* Copy body signature */ - SignatureInit(&h->body_signature, body_sig_dest, - body_signature->sig_size, 0); - SignatureCopy(&h->body_signature, body_signature); - - /* Set up signature struct so we can calculate the signature */ - SignatureInit(&h->preamble_signature, block_sig_dest, - siglen_map[signing_key->algorithm], signed_size); - - /* Calculate signature */ - sigtmp = CalculateSignature((uint8_t*)h, signed_size, signing_key); - SignatureCopy(&h->preamble_signature, sigtmp); - free(sigtmp); - - /* Return the header */ - return h; +VbFirmwarePreambleHeader *CreateFirmwarePreamble( + uint64_t firmware_version, + const VbPublicKey *kernel_subkey, + const VbSignature *body_signature, + const VbPrivateKey *signing_key, + uint32_t flags) +{ + VbFirmwarePreambleHeader *h; + uint64_t signed_size = (sizeof(VbFirmwarePreambleHeader) + + kernel_subkey->key_size + + body_signature->sig_size); + uint64_t block_size = signed_size + siglen_map[signing_key->algorithm]; + uint8_t *kernel_subkey_dest; + uint8_t *body_sig_dest; + uint8_t *block_sig_dest; + VbSignature *sigtmp; + + /* Allocate key block */ + h = (VbFirmwarePreambleHeader *)malloc(block_size); + if (!h) + return NULL; + + Memset(h, 0, block_size); + kernel_subkey_dest = (uint8_t *)(h + 1); + body_sig_dest = kernel_subkey_dest + kernel_subkey->key_size; + block_sig_dest = body_sig_dest + body_signature->sig_size; + + h->header_version_major = FIRMWARE_PREAMBLE_HEADER_VERSION_MAJOR; + h->header_version_minor = FIRMWARE_PREAMBLE_HEADER_VERSION_MINOR; + h->preamble_size = block_size; + h->firmware_version = firmware_version; + h->flags = flags; + + /* Copy data key */ + PublicKeyInit(&h->kernel_subkey, kernel_subkey_dest, + kernel_subkey->key_size); + PublicKeyCopy(&h->kernel_subkey, kernel_subkey); + + /* Copy body signature */ + SignatureInit(&h->body_signature, body_sig_dest, + body_signature->sig_size, 0); + SignatureCopy(&h->body_signature, body_signature); + + /* Set up signature struct so we can calculate the signature */ + SignatureInit(&h->preamble_signature, block_sig_dest, + siglen_map[signing_key->algorithm], signed_size); + + /* Calculate signature */ + sigtmp = CalculateSignature((uint8_t *)h, signed_size, signing_key); + SignatureCopy(&h->preamble_signature, sigtmp); + free(sigtmp); + + /* Return the header */ + return h; } - -/* Creates a kernel preamble, signed with [signing_key]. - * Caller owns the returned pointer, and must free it with free(). - * - * Returns NULL if error. */ -VbKernelPreambleHeader* CreateKernelPreamble( - uint64_t kernel_version, - uint64_t body_load_address, - uint64_t bootloader_address, - uint64_t bootloader_size, - const VbSignature* body_signature, - uint64_t desired_size, - const VbPrivateKey* signing_key) { - - VbKernelPreambleHeader* h; - uint64_t signed_size = (sizeof(VbKernelPreambleHeader) + - body_signature->sig_size); - uint64_t block_size = signed_size + siglen_map[signing_key->algorithm]; - uint8_t* body_sig_dest; - uint8_t* block_sig_dest; - VbSignature *sigtmp; - - /* If the block size is smaller than the desired size, pad it */ - if (block_size < desired_size) - block_size = desired_size; - - /* Allocate key block */ - h = (VbKernelPreambleHeader*)malloc(block_size); - Memset(h, 0, block_size); - - if (!h) - return NULL; - body_sig_dest = (uint8_t*)(h + 1); - block_sig_dest = body_sig_dest + body_signature->sig_size; - - h->header_version_major = KERNEL_PREAMBLE_HEADER_VERSION_MAJOR; - h->header_version_minor = KERNEL_PREAMBLE_HEADER_VERSION_MINOR; - h->preamble_size = block_size; - h->kernel_version = kernel_version; - h->body_load_address = body_load_address; - h->bootloader_address = bootloader_address; - h->bootloader_size = bootloader_size; - - /* Copy body signature */ - SignatureInit(&h->body_signature, body_sig_dest, - body_signature->sig_size, 0); - SignatureCopy(&h->body_signature, body_signature); - - /* Set up signature struct so we can calculate the signature */ - SignatureInit(&h->preamble_signature, block_sig_dest, - siglen_map[signing_key->algorithm], signed_size); - - /* Calculate signature */ - sigtmp = CalculateSignature((uint8_t*)h, signed_size, signing_key); - SignatureCopy(&h->preamble_signature, sigtmp); - free(sigtmp); - - /* Return the header */ - return h; +VbKernelPreambleHeader *CreateKernelPreamble( + uint64_t kernel_version, + uint64_t body_load_address, + uint64_t bootloader_address, + uint64_t bootloader_size, + const VbSignature *body_signature, + uint64_t desired_size, + const VbPrivateKey *signing_key) +{ + VbKernelPreambleHeader *h; + uint64_t signed_size = (sizeof(VbKernelPreambleHeader) + + body_signature->sig_size); + uint64_t block_size = signed_size + siglen_map[signing_key->algorithm]; + uint8_t *body_sig_dest; + uint8_t *block_sig_dest; + VbSignature *sigtmp; + + /* If the block size is smaller than the desired size, pad it */ + if (block_size < desired_size) + block_size = desired_size; + + /* Allocate key block */ + h = (VbKernelPreambleHeader *)malloc(block_size); + if (!h) + return NULL; + + Memset(h, 0, block_size); + body_sig_dest = (uint8_t *)(h + 1); + block_sig_dest = body_sig_dest + body_signature->sig_size; + + h->header_version_major = KERNEL_PREAMBLE_HEADER_VERSION_MAJOR; + h->header_version_minor = KERNEL_PREAMBLE_HEADER_VERSION_MINOR; + h->preamble_size = block_size; + h->kernel_version = kernel_version; + h->body_load_address = body_load_address; + h->bootloader_address = bootloader_address; + h->bootloader_size = bootloader_size; + + /* Copy body signature */ + SignatureInit(&h->body_signature, body_sig_dest, + body_signature->sig_size, 0); + SignatureCopy(&h->body_signature, body_signature); + + /* Set up signature struct so we can calculate the signature */ + SignatureInit(&h->preamble_signature, block_sig_dest, + siglen_map[signing_key->algorithm], signed_size); + + /* Calculate signature */ + sigtmp = CalculateSignature((uint8_t *)h, signed_size, signing_key); + SignatureCopy(&h->preamble_signature, sigtmp); + free(sigtmp); + + /* Return the header */ + return h; } |