/* 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.
*
* High-level firmware API for loading and verifying rewritable firmware.
* (Firmware portion)
*/
#include "sysincludes.h"
#include "bmpblk_header.h"
#include "region.h"
#include "gbb_access.h"
#include "gbb_header.h"
#include "load_kernel_fw.h"
#include "utility.h"
#include "vboot_api.h"
#include "vboot_struct.h"
static VbError_t VbGbbReadKey(VbCommonParams *cparams, uint32_t offset,
VbPublicKey **keyp)
{
VbPublicKey hdr, *key;
VbError_t ret;
uint32_t size;
ret = VbRegionReadData(cparams, VB_REGION_GBB, offset,
sizeof(VbPublicKey), &hdr);
if (ret)
return ret;
/* Deal with a zero-size key (used in testing) */
size = hdr.key_offset + hdr.key_size;
if (size < sizeof(hdr))
size = sizeof(hdr);
key = VbExMalloc(size);
ret = VbRegionReadData(cparams, VB_REGION_GBB, offset, size, key);
if (ret) {
VbExFree(key);
return ret;
}
*keyp = key;
return VBERROR_SUCCESS;
}
VbError_t VbGbbReadRootKey(VbCommonParams *cparams, VbPublicKey **keyp)
{
return VbGbbReadKey(cparams, cparams->gbb->rootkey_offset, keyp);
}
VbError_t VbGbbReadRecoveryKey(VbCommonParams *cparams, VbPublicKey **keyp)
{
return VbGbbReadKey(cparams, cparams->gbb->recovery_key_offset, keyp);
}