Files
OpenCellular/host/lib21/host_keyblock.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

78 lines
2.0 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 "vb2_common.h"
#include "host_common.h"
#include "host_key2.h"
#include "host_keyblock2.h"
#include "host_misc.h"
#include "host_signature2.h"
int vb2_keyblock_create(struct vb2_keyblock **kb_ptr,
const struct vb2_public_key *data_key,
const struct vb2_private_key **signing_keys,
uint32_t signing_key_count,
uint32_t flags,
const char *desc)
{
struct vb2_keyblock kb = {
.c.magic = VB2_MAGIC_KEYBLOCK,
.c.struct_version_major = VB2_KEYBLOCK_VERSION_MAJOR,
.c.struct_version_minor = VB2_KEYBLOCK_VERSION_MAJOR,
.c.fixed_size = sizeof(kb),
.flags = flags,
.sig_count = signing_key_count,
};
struct vb2_packed_key *key = NULL;
uint32_t sig_size;
uint8_t *buf;
*kb_ptr = NULL;
/* Determine component sizes */
if (!desc)
desc = data_key->desc;
kb.c.desc_size = vb2_desc_size(desc);
kb.key_offset = kb.c.fixed_size + kb.c.desc_size;
if (vb2_sig_size_for_keys(&sig_size, signing_keys, signing_key_count))
return VB2_KEYBLOCK_CREATE_SIG_SIZE;
if (vb2_public_key_pack(&key, data_key))
return VB2_KEYBLOCK_CREATE_DATA_KEY;
kb.sig_offset = kb.key_offset + key->c.total_size;
kb.c.total_size = kb.sig_offset + sig_size;
/* Allocate buffer and copy header and data key */
buf = calloc(1, kb.c.total_size);
if (!buf) {
free(key);
return VB2_KEYBLOCK_CREATE_ALLOC;
}
memcpy(buf, &kb, sizeof(kb));
if (kb.c.desc_size)
strcpy((char *)buf + kb.c.fixed_size, desc);
memcpy(buf + kb.key_offset, key, key->c.total_size);
free(key);
/* Sign the keyblock */
if (vb2_sign_object_multiple(buf, kb.sig_offset, signing_keys,
signing_key_count)) {
free(buf);
return VB2_KEYBLOCK_CREATE_SIGN;
}
*kb_ptr = (struct vb2_keyblock *)buf;
return VB2_SUCCESS;
}