Files
OpenCellular/host/lib/host_common2.c
Randall Spangler f7559e4b46 futility: Use vboot 2.0 APIs for public keys
This replaces calls to the old vboot 1 APIs with their vboot 2.0
equivalents.

BUG=chromium:611535
BRANCH=none
TEST=make runtests

Change-Id: Ieb1a127577c6428c47ac088c3aaa0d0dad6275a8
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/356541
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
2016-09-02 01:28:37 -07:00

82 lines
2.3 KiB
C

/* 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.
*/
#include <string.h>
#include "2sysincludes.h"
#include "2common.h"
#include "2rsa.h"
#include "host_common.h"
#include "host_key2.h"
#include "cryptolib.h"
#include "utility.h"
#include "vb2_common.h"
#include "vboot_common.h"
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 preamble */
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;
}