| /* SPDX-License-Identifier: BSD-2-Clause */ |
| /* Copyright (c) 2018, Linaro Limited */ |
| /* Copyright (c) 2019-2020, Google */ |
| |
| #ifndef __TA_VX_H |
| #define __TA_VX_H |
| |
| #define TA_VX_UUID { 0x99dc95b2, 0x938e, 0x47eb, \ |
| { 0x80, 0xe8, 0x94, 0x04, 0xae, 0x8a, 0x13, 0x85 } } |
| |
| #define TA_VX_MAX_ROLLBACK_LOCATIONS 32 |
| #define TA_VX_NONCE_SIZE 32 |
| |
| typedef enum vx_lock_state { |
| VX_LOCKED = 0, |
| VX_UNLOCKED = 1, |
| } vx_lock_state_t; |
| |
| /* VX variables. */ |
| typedef enum vx_variable { |
| VX_VAR_NONE = 0x0, |
| VX_VAR_DEV_KEY_ENABLED = 0x01, |
| VX_VAR_OUT_OF_BOOTLOADER = 0x02, |
| VX_VAR_EPHEMERALLY_UNLOCKED = 0x04, |
| } vx_variable_t; |
| |
| /* |
| * Gets the rollback index corresponding to the given rollback index slot. |
| * |
| * in params[0].value.a: rollback index slot |
| * out params[1].value.a: upper 32 bits of rollback index |
| * out params[1].value.b: lower 32 bits of rollback index |
| */ |
| #define TA_VX_CMD_READ_ROLLBACK_INDEX 0 |
| |
| /* |
| * Updates the rollback index corresponding to the given rollback index slot. |
| * |
| * Will refuse to update a slot with a lower value. |
| * |
| * in params[0].value.a: rollback index slot |
| * in params[1].value.a: upper 32 bits of rollback index |
| * in params[1].value.b: lower 32 bits of rollback index |
| */ |
| #define TA_VX_CMD_WRITE_ROLLBACK_INDEX 1 |
| |
| /* |
| * Gets the lock state of the device. |
| * |
| * out params[0].value.a: VX_LOCKED/VX_UNLOCKED defined above. |
| */ |
| #define TA_VX_CMD_READ_LOCK_STATE 2 |
| |
| /* |
| * Sets the lock state of the device. |
| * |
| * If the lock state is changed all rollback slots will be reset to 0 |
| * |
| * in params[0].value.a: VX_LOCKED/VX_UNLOCKED defined above. |
| */ |
| #define TA_VX_CMD_WRITE_LOCK_STATE 3 |
| |
| /* |
| * Reads a persistent value corresponding to the given name. |
| * |
| * in params[0].memref: persistent value name |
| * inout params[1].memref: read persistent value buffer |
| */ |
| #define TA_VX_CMD_READ_PERSIST_VALUE 4 |
| |
| /* |
| * Writes a persistent value corresponding to the given name. |
| * |
| * in params[0].memref: persistent value name |
| * in params[1].memref: persistent value buffer to write |
| */ |
| #define TA_VX_CMD_WRITE_PERSIST_VALUE 5 |
| |
| /* |
| * Notifies the TA that the main Bootloader is exiting. |
| */ |
| #define TA_VX_CMD_EXIT_BOOTLOADER 6 |
| |
| /* |
| * Regenerates the random nonce associated with the device lock state. |
| * |
| * This command is now deprecated. New code should use TA_VX_CMD_REFRESH_NONCE( |
| * kFDRNonceID, kFDRNonceIDSize); |
| */ |
| #define TA_VX_CMD_REFRESH_LOCK_STATE_NONCE 7 |
| |
| /* |
| * Read the current random nonce associated with the device lock state. |
| * |
| * This command is now deprecated. New code should use TA_VX_CMD_GET_NONCE( |
| * kFDRNonceID, kFDRNonceIDSize); |
| * |
| * inout params[0].memref: Caller allocated buffer to receive |
| * the nonce. The buffer must be at least |
| * TA_VX_NONCE_SIZE bytes. |
| */ |
| #define TA_VX_CMD_GET_LOCK_STATE_NONCE 8 |
| |
| /* |
| * Enumerate named persistent values. |
| * |
| * out params[0].value.a: total found. |
| * inout params[1].memref: Buffer to receive all names in the |
| * format: name1\0name2\0... |
| */ |
| #define TA_VX_CMD_ENUMERATE_PERSIST_VALUES 9 |
| |
| |
| /* |
| * Draw random bytes from the TEE's CPRNG. |
| * |
| * inout params[0].memref: Buffer to receive all the random bytes |
| */ |
| #define TA_VX_CMD_CPRNG_DRAW 10 |
| |
| /* |
| * Delete a persistent value by name. |
| * |
| * Does nothing and returns success if such a value does not exist. |
| * |
| * in params[0].memref: persistent value name |
| */ |
| #define TA_VX_CMD_DELETE_PERSIST_VALUE 11 |
| |
| /* |
| * Writes permanent attributes data |
| * |
| * in params[0].memref: permanent attributes buffer to write |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_WRITE_PERM_ATTR 12 |
| |
| /* |
| * Reads permanent attributes data |
| * |
| * inout params[0].memref: read permanent attributes buffer |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_READ_PERM_ATTR 13 |
| |
| enum vx_rpmb_status { |
| /* eMMC claims the RPMB key has been programmed. */ |
| VX_RPMB_AUTH_KEY_PROGRAMMED = 0x01, |
| |
| /* RPMB key has been verified by the firmware. */ |
| VX_RPMB_AUTH_KEY_VERIFIED = 0x02, |
| |
| /* RPMB provisioning is no longer allowed (mitigates key phishing). */ |
| VX_RPMB_PROVISIONING_ALLOWED = 0x04, |
| |
| /* Reroute RPMB traffic (to REE controlled storage). */ |
| VX_RPMB_REROUTING_TRAFFIC = 0x08, |
| }; |
| |
| /* Reads the RPMB provisioning status. |
| * |
| * Args: |
| * out params[0].value.a: Status flags (VX_RPMB_*). |
| * out params[0].value.b: Write counter value [0 ~ MAX_UINT32). |
| * |
| * Returns: |
| * TEE_SUCCESS if status determination has been definitive and successful. |
| * Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_GET_RPMB_STATUS 14 |
| |
| /* Provisions the RPMB partition. |
| * |
| * Steps: |
| * 1. If the authentication key is not programmed AND RPMB provisioning is |
| * allowed as indicated by an OTP bit, program and verify the key. |
| * 2. Initialize device lock state to VX_UNLOCKED. |
| * 3. Blow the RPMB provisioning disable bit to never ever attempt programming |
| * the RPMB key again. |
| * |
| * The secret key to be programmed is derived in the TEE-OS from the hardware |
| * unique key (HUK) and the eMMC device ID. A TEE supplicant must be running on |
| * the REE side to feed RPMB partition information to TEE upon request. |
| * |
| * Since eMMC and SoC are separate silicon packages and communications between |
| * them are not authenticated until the shared key is programmed (as plaintext |
| * across the bus), RPMB provisioning must be carried out in a trusted |
| * environment (read factory). Once provisioning is done, it will never be |
| * attempted again because of the blown OTP bit without replacing the SoC. |
| * |
| * Args: None |
| * |
| * Returns: |
| * TEE_SUCCESS if RPMB has been successfully provisioned a new key and the |
| * device lock state has been initialized to VX_UNLOCKED. |
| * |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_PROVISION_RPMB 15 |
| |
| /* |
| * Reads the permanent attributes hash |
| * |
| * inout params[0].memref: read permanent attributes hash buffer |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_READ_PERM_ATTR_HASH 16 |
| |
| /* |
| * Lock permanent attributes. Permanent attributes can't be changed |
| * after locking. |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_LOCK_PERM_ATTR 17 |
| |
| typedef enum { |
| /* Programmed to RPMB. */ |
| VX_PERM_ATTR_PROGRAMMED = (1 << 0), |
| |
| /* SHA256 digest stored in OTP. */ |
| VX_PERM_ATTR_LOCKED = (1 << 1), |
| |
| /* Hardcoded. */ |
| VX_PERM_ATTR_HARDCODED = (1 << 2), |
| } perm_attr_status_t; |
| |
| /* |
| * Get the current permanent attributes status |
| * |
| * out params[0].value.a: Status flags (VX_PERM_ATTR_*). |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_GET_PERM_ATTR_STATUS 18 |
| |
| /* |
| * Deletes permanent attributes (fails if locked). |
| * |
| * Returns |
| * TEE_SUCCESS on success, |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_DELETE_PERM_ATTR 19 |
| |
| #define TA_VX_CMD_SET_OPTIONS_DEPRECATED 20 |
| #define TA_VX_CMD_UNSET_OPTIONS_DEPRECATED 21 |
| |
| /* Provisions the USBBOOT password hash. |
| * |
| * Args: None |
| * |
| * Returns: |
| * TEE_SUCCESS if USBBOOT password hash has been successfully provisioned. |
| * |
| * TEE_ERROR_* otherwise. |
| */ |
| #define TA_VX_CMD_PROVISION_USBBOOT_PWD_HASH 22 |
| |
| enum vx_usbboot_status { |
| /* If set, USBBOOT password hash was provisioned. |
| * Default unset. */ |
| VX_USBBOOT_PWD_PROVISIONED = (1 << 0), |
| /* If set, USBBOOT password hash value is locked and its OTP area |
| * can't be changed. Default unset. */ |
| VX_USBBOOT_PWD_LOCKED = (1 << 1), |
| /* If set, USBBOOT password usage was turned on. Default unset. */ |
| VX_USBBOOT_PWD_ENABLED = (1 << 2), |
| }; |
| |
| /* Reads the USBBOOT provisioning status. |
| * |
| * Args: |
| * out params[0].value.a: Status flags (VX_USBBOOT_*). |
| * |
| * Returns: |
| * TEE_SUCCESS if status determination has been definitive and successful. |
| * Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_GET_USBBOOT_STATUS 23 |
| |
| /* Sets the OTA Config option. |
| * |
| * Args: |
| * in params[0].value.a: config option. |
| * |
| * Returns: |
| * TEE_SUCCESS if the option value was set successfully. |
| * Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_OTA_CONFIG_SET 24 |
| |
| /* Reads the OTA Config option. |
| * |
| * Args: |
| * in params[0].value.a: default value for option, which will be returned if |
| * there is no stored value in secure storage. |
| * out params[1].value.a: config option |
| * |
| * Returns: |
| * TEE_SUCCESS if the option value was read successfully. |
| * Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_OTA_CONFIG_GET 25 |
| |
| /* |
| * Delete the OTA Config. |
| * |
| * Returns: |
| * TEE_SUCCESS if the config was deleted successfully. |
| * Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_OTA_CONFIG_DELETE 26 |
| |
| /* |
| * Query VX variables. |
| * |
| * out params[0].value.a: or'ed VX_VAR_* |
| */ |
| #define TA_VX_CMD_GETVAR_ALL 27 |
| |
| /* |
| * Force reroute RPMB until reboot. |
| * |
| * For testing on dev-key hardware only. |
| * |
| * Returns: |
| * TEE_SUCCESS if successful. Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_REROUTE_RPMB_TILL_REBOOT 28 |
| |
| /* |
| * Force reroute RPMB to REE-controlled secure storage. |
| * |
| * Works on dev-key hardware only. |
| * |
| * Returns: |
| * TEE_SUCCESS if successful. Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_REROUTE_RPMB_TO_SOFTWARE 29 |
| |
| /* |
| * Force route RPMB to hardware (eMMC). |
| * |
| * Works on dev-key hardware only. |
| * |
| * Returns: |
| * TEE_SUCCESS if successful. Otherwise TEE_ERROR_*. |
| */ |
| #define TA_VX_CMD_REROUTE_RPMB_TO_HARDWARE 30 |
| |
| /** |
| * Persistent Nonces Management. |
| */ |
| |
| /* |
| * Get a nonce by ID. The nonce is generated if not already exists. |
| * |
| * in params[0].memref: Nonce ID (arbitrary bytes, length > 0). |
| * inout params[1].memref: Caller allocated buffer to receive |
| * the nonce. The buffer must be at least |
| * TA_VX_NONCE_SIZE bytes. |
| */ |
| #define TA_VX_CMD_GET_NONCE 0x101 |
| |
| /* |
| * Refresh/rotate a nonce by ID. The nonce is generated if not found. |
| * |
| * in params[0].memref: Nonce ID (arbitrary bytes, length > 0). |
| * |
| * Returns TEE_ERROR_NOT_SUPPORTED if the underlying hardware does not support |
| * rotations. |
| */ |
| #define TA_VX_CMD_REFRESH_NONCE 0x102 |
| |
| /* |
| * Run internal tests defined in the VX TA. |
| * |
| * These tests are disabled by default and is meant to be manually enabled |
| * as needed in ta/vx/Makefile by setting CFG_TA_VX_TESTS=y. |
| * |
| * in params[0].memref: name of tests to run (matches *${name}*). |
| */ |
| #define TA_VX_CMD_RUN_TESTS 0xFF01 |
| |
| #endif /*__TA_VX_H*/ |