/* 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 "2sysincludes.h" #include "2common.h" #include "2misc.h" #include "sysincludes.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" VbError_t VbGbbReadData(struct vb2_context *ctx, uint32_t offset, uint32_t size, void *buf) { struct vb2_shared_data *sd = vb2_get_sd(ctx); /* This is the old API, for backwards compatibility */ if (!sd->gbb) return VBERROR_INVALID_GBB; if (offset + size > sd->gbb_size) return VBERROR_INVALID_GBB; memcpy(buf, ((uint8_t *)sd->gbb) + offset, size); return VBERROR_SUCCESS; } VbError_t VbGbbReadHWID(struct vb2_context *ctx, char *hwid, uint32_t max_size) { struct vb2_shared_data *sd = vb2_get_sd(ctx); if (!max_size) return VBERROR_INVALID_PARAMETER; *hwid = '\0'; StrnAppend(hwid, "{INVALID}", max_size); if (!ctx) return VBERROR_INVALID_GBB; if (0 == sd->gbb->hwid_size) { VB2_DEBUG("VbHWID(): invalid hwid size\n"); return VBERROR_SUCCESS; /* oddly enough! */ } if (sd->gbb->hwid_size > max_size) { VB2_DEBUG("VbDisplayDebugInfo(): invalid hwid offset/size\n"); return VBERROR_INVALID_PARAMETER; } return VbGbbReadData(ctx, sd->gbb->hwid_offset, sd->gbb->hwid_size, hwid); } static VbError_t VbGbbReadKey(struct vb2_context *ctx, uint32_t offset, VbPublicKey **keyp) { VbPublicKey hdr, *key; VbError_t ret; uint32_t size; ret = VbGbbReadData(ctx, 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 = malloc(size); ret = VbGbbReadData(ctx, offset, size, key); if (ret) { free(key); return ret; } *keyp = key; return VBERROR_SUCCESS; } VbError_t VbGbbReadRootKey(struct vb2_context *ctx, VbPublicKey **keyp) { struct vb2_shared_data *sd = vb2_get_sd(ctx); return VbGbbReadKey(ctx, sd->gbb->rootkey_offset, keyp); } VbError_t VbGbbReadRecoveryKey(struct vb2_context *ctx, VbPublicKey **keyp) { struct vb2_shared_data *sd = vb2_get_sd(ctx); return VbGbbReadKey(ctx, sd->gbb->recovery_key_offset, keyp); }