/*
 * Copyright (c) 2019 The Fuchsia Authors
 *
 * SPDX-License-Identifier:	BSD-3-Clause
 */

#ifndef _ZIRCON_VBOOT_H_
#define _ZIRCON_VBOOT_H_

#include <abr/abr.h>
#include <libavb/libavb.h>
#include <libavb_atx/libavb_atx.h>

typedef enum {
	AVB_ATX_LOCKED,
	AVB_ATX_UNLOCKED,
} AvbAtxLockState;

typedef enum {
	AVB_ATX_SLOT_MARKED_SUCCESSFUL,
	AVB_ATX_SLOT_NOT_MARKED_SUCCESSFUL,
} AvbAtxSlotState;

/* Add extra zbi items from vbmeta into |zbi| container */
int zircon_vboot_add_extra_zbi_items(zbi_header_t *zbi, size_t capacity);

/**
 * Loads zircon image using A/B/R scheme.
 *
 * @loadaddr: address at which to load the Zircon image.
 * @loadsize: size of the load buffer.
 * @force_recovery: trigger a force boot into recovery (R slot).
 *
 * Return: 0 if successful, negative value on failure.
 */
int zircon_vboot_img_load(unsigned char *loadaddr, size_t loadsize,
			  bool force_recovery);

/* Performs a full load + verification of the indicated slot.
 *
 * @loadaddr: address at which to load the Zircon image.
 * @loadsize: size of the load buffer.
 * @requested_partitions: partitions to verify.
 * @ab_suffix: slot suffix to load and verify.
 * @lock_state: if AVB_ATX_UNLOCKED, verification errors will be allowed (see
 *              AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR for details).
 * @slot_state: if AVB_ATX_SLOT_MARKED_SUCCESSFUL, minimum rollback index values
 *              will be bumped to match the values in the verified slot (on
 *              success).
 * @verify_data: see |out_data| for avb_slot_verify().
 */
AvbSlotVerifyResult
zircon_vboot_slot_verify(unsigned char *loadaddr, size_t loadsize,
			 const char *const *requested_partitions,
			 const char *ab_suffix, AvbAtxLockState lock_state,
			 AvbAtxSlotState slot_state,
			 AvbSlotVerifyData **verify_data);

/* Get current slot to boot */
const char *zircon_vboot_get_current_slot(void);

/* Get slot info for |slot_number| slot.
 *
 * Returns > 0 if an error occured.
 */
int zircon_vboot_get_slot_info(int slot_number, AbrSlotInfo *info);

/* Set slot active */
int zircon_vboot_set_slot_active(int slot_number);

/* Generate unlock challenge */
int zircon_vboot_generate_unlock_challenge(AvbAtxUnlockChallenge *out);

/* Validate unlock credential */
int zircon_vboot_validate_unlock_credential(AvbAtxUnlockCredential *in,
					    bool *out_is_trusted);

/* True if ZVB is enabled */
bool zircon_is_vboot_enabled(void);

/* Fills |hash| with the permanent attributes SHA256 hash. */
AvbIOResult
avb_read_permanent_attributes_hash(AvbAtxOps *atx_ops,
				   uint8_t hash[AVB_SHA256_DIGEST_SIZE]);

#if defined(CONFIG_ZIRCON_VBOOT_UNLOCK)
/* True if ZVB unlock feature is enabled */
bool zircon_is_vboot_unlock_enabled(void);

/* Permanently disable ZVB unlock feature */
int zircon_vboot_disable_vboot_unlock(void);

/* set ZVB unlock state */
int zircon_vboot_set_unlock(bool unlock);
#endif /* CONFIG_ZIRCON_VBOOT_UNLOCK */

#endif // _ZIRCON_VBOOT_H_
