mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-15 20:37:33 +00:00
vboot: replace CreateKernelPreamble() with vboot2 equivalent
Continued refactoring of host library to kernel style / vboot2 structs. BUG=chromium:611535 BRANCH=none TEST=make runtests Change-Id: Ifed376812ed7690eea1ec0dfab958e836f7724a0 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/363951 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
This commit is contained in:
committed by
chrome-bot
parent
0efc4f3ee1
commit
a62ffa8d61
@@ -3,8 +3,6 @@
|
||||
* found in the LICENSE file.
|
||||
*
|
||||
* Host functions for verified boot.
|
||||
*
|
||||
* TODO: change all 'return 0', 'return 1' into meaningful return codes.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
@@ -16,39 +14,99 @@
|
||||
#include "host_key2.h"
|
||||
#include "cryptolib.h"
|
||||
#include "utility.h"
|
||||
#include "vb2_common.h"
|
||||
#include "vboot_common.h"
|
||||
|
||||
VbKernelPreambleHeader *CreateKernelPreamble(
|
||||
uint64_t kernel_version,
|
||||
struct vb2_fw_preamble *vb2_create_fw_preamble(
|
||||
uint32_t firmware_version,
|
||||
const struct vb2_packed_key *kernel_subkey,
|
||||
const struct vb2_signature *body_signature,
|
||||
const struct vb2_private_key *signing_key,
|
||||
uint32_t flags)
|
||||
{
|
||||
uint32_t signed_size = (sizeof(struct vb2_fw_preamble) +
|
||||
kernel_subkey->key_size +
|
||||
body_signature->sig_size);
|
||||
uint32_t block_size = signed_size +
|
||||
vb2_rsa_sig_size(signing_key->sig_alg);
|
||||
|
||||
/* Allocate key block */
|
||||
struct vb2_fw_preamble *h =
|
||||
(struct vb2_fw_preamble *)calloc(block_size, 1);
|
||||
if (!h)
|
||||
return NULL;
|
||||
|
||||
uint8_t *kernel_subkey_dest = (uint8_t *)(h + 1);
|
||||
uint8_t *body_sig_dest = kernel_subkey_dest + kernel_subkey->key_size;
|
||||
uint8_t *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 */
|
||||
vb2_init_packed_key(&h->kernel_subkey, kernel_subkey_dest,
|
||||
kernel_subkey->key_size);
|
||||
if (VB2_SUCCESS !=
|
||||
vb2_copy_packed_key(&h->kernel_subkey, kernel_subkey)) {
|
||||
free(h);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Copy body signature */
|
||||
vb2_init_signature(&h->body_signature,
|
||||
body_sig_dest, body_signature->sig_size, 0);
|
||||
if (VB2_SUCCESS !=
|
||||
vb2_copy_signature(&h->body_signature, body_signature)) {
|
||||
free(h);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Set up signature struct so we can calculate the signature */
|
||||
vb2_init_signature(&h->preamble_signature, block_sig_dest,
|
||||
vb2_rsa_sig_size(signing_key->sig_alg), signed_size);
|
||||
|
||||
/* Calculate signature */
|
||||
struct vb2_signature *sig =
|
||||
vb2_calculate_signature((uint8_t *)h, signed_size, signing_key);
|
||||
vb2_copy_signature(&h->preamble_signature, sig);
|
||||
free(sig);
|
||||
|
||||
/* Return the header */
|
||||
return h;
|
||||
}
|
||||
|
||||
struct vb2_kernel_preamble *vb2_create_kernel_preamble(
|
||||
uint32_t kernel_version,
|
||||
uint64_t body_load_address,
|
||||
uint64_t bootloader_address,
|
||||
uint64_t bootloader_size,
|
||||
const VbSignature *body_signature,
|
||||
uint32_t bootloader_size,
|
||||
const struct vb2_signature *body_signature,
|
||||
uint64_t vmlinuz_header_address,
|
||||
uint64_t vmlinuz_header_size,
|
||||
uint32_t vmlinuz_header_size,
|
||||
uint32_t flags,
|
||||
uint64_t desired_size,
|
||||
uint32_t desired_size,
|
||||
const struct vb2_private_key *signing_key)
|
||||
{
|
||||
VbKernelPreambleHeader *h;
|
||||
uint64_t signed_size = (sizeof(VbKernelPreambleHeader) +
|
||||
uint64_t signed_size = (sizeof(struct vb2_kernel_preamble) +
|
||||
body_signature->sig_size);
|
||||
uint32_t sig_size = vb2_rsa_sig_size(signing_key->sig_alg);
|
||||
uint64_t block_size = signed_size + sig_size;
|
||||
uint8_t *body_sig_dest;
|
||||
uint8_t *block_sig_dest;
|
||||
uint32_t block_size = signed_size + sig_size;
|
||||
|
||||
/* 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 *)calloc(block_size, 1);
|
||||
struct vb2_kernel_preamble *h =
|
||||
(struct vb2_kernel_preamble *)calloc(block_size, 1);
|
||||
if (!h)
|
||||
return NULL;
|
||||
|
||||
body_sig_dest = (uint8_t *)(h + 1);
|
||||
block_sig_dest = body_sig_dest + body_signature->sig_size;
|
||||
uint8_t *body_sig_dest = (uint8_t *)(h + 1);
|
||||
uint8_t *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;
|
||||
@@ -62,18 +120,18 @@ VbKernelPreambleHeader *CreateKernelPreamble(
|
||||
h->flags = flags;
|
||||
|
||||
/* Copy body signature */
|
||||
SignatureInit(&h->body_signature, body_sig_dest,
|
||||
body_signature->sig_size, 0);
|
||||
SignatureCopy(&h->body_signature, body_signature);
|
||||
vb2_init_signature(&h->body_signature, body_sig_dest,
|
||||
body_signature->sig_size, 0);
|
||||
vb2_copy_signature(&h->body_signature, body_signature);
|
||||
|
||||
/* Set up signature struct so we can calculate the signature */
|
||||
SignatureInit(&h->preamble_signature, block_sig_dest,
|
||||
sig_size, signed_size);
|
||||
vb2_init_signature(&h->preamble_signature, block_sig_dest,
|
||||
sig_size, signed_size);
|
||||
|
||||
/* Calculate signature */
|
||||
struct vb2_signature *sigtmp =
|
||||
vb2_calculate_signature((uint8_t *)h, signed_size, signing_key);
|
||||
SignatureCopy(&h->preamble_signature, (VbSignature *)sigtmp);
|
||||
vb2_copy_signature(&h->preamble_signature, sigtmp);
|
||||
free(sigtmp);
|
||||
|
||||
/* Return the header */
|
||||
|
||||
Reference in New Issue
Block a user