/* 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.
 *
 * Access to portions of the GBB using the region API.
 */

#ifndef VBOOT_REFERENCE_GBB_ACCESS_H_
#define VBOOT_REFERENCE_GBB_ACCESS_H_

#include "vboot_api.h"

struct BmpBlockHeader;
struct ImageInfo;
struct GoogleBinaryBlockHeader;
struct ScreenLayout;
struct VbPublicKey;

/**
 * Read the GBB header
 *
 * This accesses the GBB and reads its header.
 *
 * @param cparams	Vboot common parameters
 * @param gbb		Place to put GBB header
 */
VbError_t VbGbbReadHeader_static(VbCommonParams *cparams,
				 struct GoogleBinaryBlockHeader *gbb);

/**
 * Read the root key from the GBB
 *
 * @param cparams	Vboot common parameters
 * @param keyp		Returns a pointer to the key. The caller must call
 *			free() on the key when finished with it.
 * @return VBERROR_... error, VBERROR_SUCCESS on success,
 */
VbError_t VbGbbReadRootKey(VbCommonParams *cparams,
			   struct VbPublicKey **keyp);

/**
 * Read the recovery key from the GBB
 *
 * @param cparams	Vboot common parameters
 * @param keyp		Returns a pointer to the key. The caller must call
 *			free() on the key when finished with it.
 * @return VBERROR_... error, VBERROR_SUCCESS on success,
 */
VbError_t VbGbbReadRecoveryKey(VbCommonParams *cparams,
			       struct VbPublicKey **keyp);

/**
 * Read the bitmap block header from the GBB
 *
 * @param cparams	Vboot common parameters
 * @param hdr		The header is placed in this block
 * @return VBERROR_... error, VBERROR_SUCCESS on success,
 */
VbError_t VbGbbReadBmpHeader(VbCommonParams *cparams,
			     struct BmpBlockHeader *hdr);

/**
 * Read a image from the GBB
 *
 * The caller must call free() on *image_datap when finished with it.
 *
 * @param cparams	Vboot common parameters
 * @param localization	Localization/language number
 * @param screen_index	Index of screen to display (VB_SCREEN_...)
 * @param image_num	Image number within the screen
 * @param layout	Returns layout information (x, y position)
 * @param image_info	Returns information about the image (format)
 * @param image_datap	Returns a pointer to the image data
 * @param iamge_data_sizep	Return size of image data
 * @return VBERROR_... error, VBERROR_SUCCESS on success,
 */
VbError_t VbGbbReadImage(VbCommonParams *cparams,
			 uint32_t localization, uint32_t screen_index,
			 uint32_t image_num, struct ScreenLayout *layout,
			 struct ImageInfo *image_info, char **image_datap,
			 uint32_t *image_data_sizep);

#endif
