Files
OpenCellular/host/lib21/host_fw_preamble.c
Randall Spangler 308d254092 vboot2: Get rid of extra '2' at end of new struct names
Now that lib20 and lib21 are distinct, they can have overlapping
struct names.  This will be cleaner in the long run, since vboot 2.0
(lib20) is just a temporary stepping stone to vboot 2.1 (lib21).  It
would be a shame to need to carry around the overhead of that extra
digit forever.

No functional changes, just a lot of renaming.

BUG=chromium:423882
BRANCH=none
TEST=make runtests && VBOOT2=1 make runtests (works with/withoug VBOOT2 flag)
     And compile firmware for veyron_pinky

Change-Id: I25f348fd31e32d08ca576836dfdd1278828765a1
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/233183
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
2014-12-05 00:02:00 +00:00

83 lines
2.1 KiB
C

/* Copyright (c) 2014 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 keyblocks
*/
#include "2sysincludes.h"
#include "2common.h"
#include "2rsa.h"
#include "host_common.h"
#include "host_fw_preamble2.h"
#include "host_key2.h"
#include "host_keyblock2.h"
#include "host_misc.h"
#include "host_signature2.h"
#include "vb2_common.h"
int vb2_fw_preamble_create(struct vb2_fw_preamble **fp_ptr,
const struct vb2_private_key *signing_key,
const struct vb2_signature **hash_list,
uint32_t hash_count,
uint32_t fw_version,
uint32_t flags,
const char *desc)
{
struct vb2_fw_preamble fp = {
.c.magic = VB2_MAGIC_FW_PREAMBLE,
.c.struct_version_major = VB2_FW_PREAMBLE_VERSION_MAJOR,
.c.struct_version_minor = VB2_FW_PREAMBLE_VERSION_MAJOR,
.c.fixed_size = sizeof(fp),
.c.desc_size = vb2_desc_size(desc),
.flags = flags,
.fw_version = fw_version,
.hash_count = hash_count,
};
uint32_t hash_next;
uint32_t sig_size;
uint8_t *buf;
int i;
*fp_ptr = NULL;
/* Determine component sizes */
hash_next = fp.hash_offset = fp.c.fixed_size + fp.c.desc_size;
for (i = 0; i < hash_count; i++)
hash_next += hash_list[i]->c.total_size;
fp.sig_offset = hash_next;
if (vb2_sig_size_for_key(&sig_size, signing_key, NULL))
return VB2_FW_PREAMBLE_CREATE_SIG_SIZE;
fp.c.total_size = fp.sig_offset + sig_size;
/* Allocate buffer and copy components */
buf = calloc(fp.c.total_size, 1);
if (!buf)
return VB2_FW_PREAMBLE_CREATE_ALLOC;
memcpy(buf, &fp, sizeof(fp));
if (fp.c.desc_size)
strcpy((char *)buf + fp.c.fixed_size, desc);
hash_next = fp.hash_offset;
for (i = 0; i < hash_count; i++) {
memcpy(buf + hash_next, hash_list[i],
hash_list[i]->c.total_size);
hash_next += hash_list[i]->c.total_size;
}
/* Sign the preamble */
if (vb2_sign_object(buf, fp.sig_offset, signing_key, NULL)) {
free(buf);
return VB2_FW_PREAMBLE_CREATE_SIGN;
}
*fp_ptr = (struct vb2_fw_preamble *)buf;
return VB2_SUCCESS;
}