blob: d2bf2f3e436abf3fde6222ff714c83aa4764df28 [file] [log] [blame]
/*
* Copyright (c) 2019 The Fuchsia Authors
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _TA_VX_HELPER_H_
#define _TA_VX_HELPER_H_
#include <common.h>
#include <tee/ta_vx.h>
/**
* Note: if CONFIG_TA_VX isn't enabled, these functions will still exist,
* but they will all fail.
*
* This is useful due to the tight integration of this code with our boot
* logic; it's best to avoid scattering #ifdefs throughout the verified boot
* code, which we would have to do if these functions didn't exist.
*/
/**
* ta_vx_lock() - Locks the device.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_lock(void);
/**
* ta_vx_lock_if_ephemerally_unlocked()
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_lock_if_ephemerally_unlocked(void);
/**
* ta_vx_unlock() - Unlocks the device.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_unlock(void);
/**
* ta_vx_is_unlocked() - Check if device is unlocked.
* @unlocked: Writes true to this location if unlocked, false otherwise
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_is_unlocked(bool *unlocked);
/**
* ta_vx_read_rollback_index() - Read the rollback index.
* @slot: The rollback index slot to read.
* @rollback_index: Location to write the rollback index.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_read_rollback_index(uint32_t slot, uint64_t *rollback_index);
/**
* ta_vx_write_rollback_index() - Write the rollback index.
* @slot: The rollback index slot to write.
* @rollback_index: The rollback index to write.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_write_rollback_index(uint32_t slot, uint64_t rollback_index);
/**
* ta_vx_read_persistent_value() - Read a named persistent value
* @name: Non-empty NUL-terminated string.
* @buf: Buffer to write value into.
* @buf_len: Length of buf.
* @bytes_read: Location to write the number of bytes read into buf.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_read_persistent_value(const char *name, void *buf, size_t buf_len,
size_t *bytes_read);
/**
* ta_vx_write_persistent_value() - Write/update a named persistent value
* @name: Non-empty NUL-terminated string.
* @val_buf: Buffer holding the value to write.
* @val_buf_len: Length of val_buf.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_write_persistent_value(const char *name, const void *val_buf,
size_t val_buf_len);
/**
* ta_vx_delete_persistent_value() - Delete a named persistent value
* @name: Non-empty NUL-terminated string.
*
* Return: 0 if successful (including when specified value is not found),
* non-zero error code on failure.
*/
int ta_vx_delete_persistent_value(const char *name);
/**
* ta_vx_cprng_draw() - Draw random bytes.
* @buf: Buffer to receive the random bytes.
* @buf_len: Size of buffer and number of random bytes to draw.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_cprng_draw(void *buf, size_t buf_len);
/**
* ta_vx_exit_bootloader_or_panic() - Finalize verified execution policies and
* configurations. Panics on any error.
*/
void ta_vx_exit_bootloader_or_panic(void);
/**
* ta_vx_read_perm_attr() - Read permanent attributes
* @buf: Buffer to write value into.
* @buf_len: Length of buf.
* @bytes_read: Location to write the number of bytes read into buf.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_read_perm_attr(void *buf, size_t buf_len, size_t *bytes_read);
/**
* ta_vx_write_perm_attr() - Write permanent attributes
* @val_buf: Buffer holding the value to write.
* @val_buf_len: Length of val_buf.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_write_perm_attr(const void *val_buf, size_t val_buf_len);
/**
* ta_vx_get_rpmb_status() - Query RPMB provisioning status
*
* @out_status: Receives status bit flags as defined in tee/ta_vx.h for
* TA_VX_CMD_GET_RPMB_STATUS. Can be NULL.
* @out_write_count: Current write counter value of the RPMB partition.
* Can be NULL.
*
* Return: 0 if successful, non-zero error code otherwise.
*/
int ta_vx_get_rpmb_status(uint32_t *out_status, uint32_t *out_write_count);
/**
* ta_vx_provision_rpmb() - Provision RPMB authentication key and initialize
* device lock state to VX_UNLOCKED.
*
* Programming will only be attempted if a key has not been already programmed
* AND RPMB provisioing is not disabled in OTP.
*
* Return: 0 if attempted and successful, non-zero code otherwise.
*/
int ta_vx_provision_rpmb(void);
/**
* ta_vx_reroute_rpmb_till_reboot() - Reroute RPMB traffic till reboot for
* testing.
*
* Return: 0 if successful, non-zero code otherwise.
*/
int ta_vx_reroute_rpmb_till_reboot(void);
/**
* ta_vx_reroute_rpmb_to_software() - Persistently reroute RPMB traffic.
*
* Return: 0 if successful, non-zero code otherwise.
*/
int ta_vx_reroute_rpmb_to_software(void);
/**
* ta_vx_reroute_rpmb_to_hardware() - Permanently restore RPMB traffic.
*
* Return: 0 if successful, non-zero code otherwise.
*/
int ta_vx_reroute_rpmb_to_hardware(void);
/**
* ta_vx_read_perm_attr_hash() - Read permanent attributes hash
* @buf: Buffer to write value into.
* @buf_len: Length of buf.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_read_perm_attr_hash(void *buf, size_t buf_len);
/**
* ta_vx_delete_perm_attr() - Delete permanent attributes if
* lockdown is not enabled.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_delete_perm_attr(void);
/**
* ta_vx_get_perm_attr_status() - Get permanent attributes
* status.
*
* @out_status: Receives status bit flags as defined in tee/ta_vx.h for
* TA_VX_CMD_GET_PERM_ATTR_STATUS. Can be NULL.
*/
int ta_vx_get_perm_attr_status(uint32_t *status);
/**
* ta_vx_lock_perm_attr() - Lock permanent attributes
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_lock_perm_attr(void);
/**
* ta_vx_provision_usb_hash() - Provision USBBOOT hash
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_provision_usb_hash(void);
/**
* ta_vx_get_perm_attr_status() - Get USBBOOT provision
* status.
*
* @out_status: Receives status bit flags as defined in tee/ta_vx.h for
* TA_VX_CMD_GET_USBBOOT_STATUS. Can be NULL.
*/
int ta_vx_get_usbboot_status(uint32_t *status);
/**
* ta_vx_getvar_all() - Query hardware capabilities
*
* @out_caps: Receives VX_HARDWARE_* flags as defined in tee/ta_vx.h
*
* Return: 0 if successful, non-zero error code otherwise.
*/
int ta_vx_getvar_all(uint32_t *out_caps);
#ifdef CONFIG_TA_VX_TESTS
/**
* ta_vx_run_tests() - Run tests defined in the VX TA.
*
* @name: Partial name of the tests to run.
*
* Return: 0 if successful, non-zero error code on failure.
*/
int ta_vx_run_tests(const char *name);
#endif // CONFIG_TA_VX_TESTS
#endif // _TA_VX_HELPER_H_