blob: 0617e17acb07cfd3b61e826595f245e16f29ad1e [file] [log] [blame]
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __EFIVERIFIEDBOOT_H__
#define __EFIVERIFIEDBOOT_H__
/*===========================================================================
INCLUDE FILES
===========================================================================*/
#include <Uefi.h>
/*===========================================================================
MACRO DECLARATIONS
===========================================================================*/
/** @ingroup
Protocol version.
*/
#define QCOM_VERIFIEDBOOT_PROTOCOL_REVISION 0x0000000000010001
#define MAX_PNAME_LENGTH 32
#define MAX_VERSION_LEN 64
/* Protocol GUID definition */
/** @ingroup efi_verifiedboot_protocol */
#define EFI_VERIFIEDBOOT_PROTOCOL_GUID \
{ 0x8e5eff91, 0x21b6, 0x47d3, { 0xaf, 0x2b, 0xc1, 0x5a, 0x1, 0xe0, 0x20, 0xec } }
/*===========================================================================
EXTERNAL VARIABLES
===========================================================================*/
/** @ingroup */
extern EFI_GUID gEfiQcomVerifiedBootProtocolGuid;
/*===========================================================================
TYPE DEFINITIONS
===========================================================================*/
/** @cond */
/* Protocol declaration. */
typedef struct _QCOM_VERIFIEDBOOT_PROTOCOL QCOM_VERIFIEDBOOT_PROTOCOL;
/** @endcond */
/*
* Device State operations
*/
typedef enum _vb_device_state_op_t
{
READ_CONFIG,
WRITE_CONFIG,
DEVICE_STATE_MAX = (int)0xFFFFFFFFULL,
} vb_device_state_op_t;
typedef enum _boot_state_t
{
GREEN,
ORANGE,
YELLOW,
RED,
BOOT_STATE_MAX = (int)0xFFFFFFFFULL,
}boot_state_t;
typedef struct _device_info_vb_t
{
BOOLEAN is_unlocked;
BOOLEAN is_unlock_critical;
}device_info_vb_t;
/*===========================================================================
FUNCTION DEFINITIONS
===========================================================================*/
/**
* Read/ Write Device state info for VB
* For Write: The in_buf has the data to be written
* and the size of the data is provided in in_buf_len.
* out_buf will be ignored
* For Read: The api will return data read in out_buf
* and the size of the data is provided in out_buf_len.
* in_buf will be ignored
*
* @param vb_device_state_op_t op
* Enum to select read or write.
*
* @param void *buf
* Pointer to the buffer
* For Write, caller will allocate memory according to
* the data to be written
* For Read, caller will allocate memory and provide the
* length in buf_len, API will return the data read len.
* If allocated memory is less than data present, error
* will be returned and the required size will be provided
* in buf_len
*
* @param uint32_t *buf_len
* Size of the buffer
*
* @return int
* Success: handle to be used for all calls to
* Secure app. Always greater than zero.
* Failure: Error code (negative only).
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_RW_DEVICE_STATE )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This,
IN vb_device_state_op_t op,
IN OUT UINT8 *buf,
IN OUT UINT32 buf_len
);
/**
* Initialize Verified Boot
*
* @param device_info_vb_t *devinfo
* Device info data
*
* @return int
* Success: handle to be used for all calls to
* Secure app. Always greater than zero.
* Failure: Error code (negative only).
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_DEVICE_INIT )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This,
IN device_info_vb_t *devinfo
);
/**
* Send Milestone to TZ
* API will send end milestone command to TZ
* @return int
* Status:
* 0 - Success
* Negative value indicates failure.
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_SEND_MILESTONE )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This
);
/**
* Return if the device is secure or not
* API will set the State flag to indicate if its a secure device
* @return int
* Status:
* 0 - Success
* Negative value indicates failure.
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_IS_DEVICE_SECURE )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This,
OUT BOOLEAN *State
);
/**
* Send ROT to Keymaster
* API will construct the ROT payload and provide
* it to Keymaster TA
* @return int
* Status:
* 0 - Success
* Negative value indicates failure.
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_SEND_ROT )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This
);
/**
* Authenticate Linux Image based on VB
*
* @param UINT8 pname[MAX_PNAME_LENGTH]
* Pname of image to be authenticated
*
* @param UINT32*img
* Pointer to the img loaded from "pname" partition
*
* @param uint32_t img_len
* Size of the img
*
* @param boot_state bootstate
* Enum of the boot state of the device.
*
* @return int
* Status:
* 0 - Success
* Negative value indicates failure.
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_VERIFY_IMAGE )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This,
IN UINT8 pname[MAX_PNAME_LENGTH],
IN UINT8 *img,
IN UINT32 img_len,
OUT boot_state_t *bootstate
);
/**
* Send Delete CMD to Keymaster
*
* @return int
* Status:
* 0 - Success
* Negative value indicates failure.
*/
typedef
EFI_STATUS
(EFIAPI *QCOM_VB_RESET_STATE )
(
IN QCOM_VERIFIEDBOOT_PROTOCOL *This
);
/*===========================================================================
PROTOCOL INTERFACE
===========================================================================*/
/** @ingroup
@par Summary
Android VERIFIEDBOOT Protocol interface.
@par Parameters
@inputprotoparams
*/
struct _QCOM_VERIFIEDBOOT_PROTOCOL {
UINT64 Revision;
QCOM_VB_RW_DEVICE_STATE VBRwDeviceState;
QCOM_VB_DEVICE_INIT VBDeviceInit;
QCOM_VB_SEND_ROT VBSendRot;
QCOM_VB_SEND_MILESTONE VBSendMilestone;
QCOM_VB_VERIFY_IMAGE VBVerifyImage;
QCOM_VB_RESET_STATE VBDeviceResetState;
QCOM_VB_IS_DEVICE_SECURE VBIsDeviceSecure;
};
#endif /* __EFIVERIFIEDBOOT_H__ */