Create vbutil_ec tool for signing EC firmware.

This just adds the vbutil_ec tool (and a simple test of the library
functions related to it).

BUG=chrome-os-partner:7459, chromium-os:27142
TEST=manual

  make
  make runtests

Change-Id: I2a2c4e7cfb8ac6ce2229c5de4252a5cc89321fa5
Reviewed-on: https://gerrit.chromium.org/gerrit/21868
Commit-Ready: Bill Richardson <wfrichar@chromium.org>
Tested-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Stefan Reinauer <reinauer@google.com>
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
This commit is contained in:
Bill Richardson
2012-05-03 08:40:44 -07:00
committed by Gerrit
parent f47291926a
commit 2448d3b3bc
20 changed files with 748 additions and 8 deletions

View File

@@ -6,6 +6,7 @@
*/
/* TODO: change all 'return 0', 'return 1' into meaningful return codes */
#include <string.h>
#include "host_common.h"
@@ -13,6 +14,53 @@
#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,