
/*
 * =====================================================================================
 *
 *       Filename:  tz_hdm_interface.h
 *
 *    Description:  Commom interface for HDM
 *
 *        Version:  1.0
 *        Created:  09/16/2019 15:26:11 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *        Company:  Samsung Electronics
 *        Copyright (c) 2015 by Samsung Electronics, All rights reserved.
 *
 * =====================================================================================
 */

#ifndef _TZ_HDM_INTERFACE_H_
#define _TZ_HDM_INTERFACE_H_

/**
 * Includes
 */
#include "stdint.h"
#include "tz_msg.h"

/**
 * Length
 */
#define JWS_LEN               8192
#define NWS_INFO_LEN          128
#define HDM_DRK_MAX_BUF_LEN   4096
#define SERVICE_NAME_LEN      32

/**
 * HDM Commands
 */
#define CMD_VERIFY_POLICY           0x00000001
#define CMD_APPLY_POLICY            0x00000002
#define CMD_LOAD_POLICY             0x00000003
#define CMD_BL_GET_POLICY           0x00000004
#define CMD_RELEASE_SHARED_BUF_MEM  0x00000005
#define CMD_GET_DEVICE_ID           0x00000006
#define CMD_GET_POLICY              0x00000007
#define CMD_BL_GET_STATUS           0x00000008

/**
 * Possible return codes
 */
typedef enum hdm_return_code {
        HDM_STATUS_SUCCESS               = 0x0,
        HDM_STATUS_FAIL                  = 0x1,
        HDM_INVALID_JWS                  = 0x2,
        HDM_JWS_INVALID_FORMAT           = 0x3,
        HDM_JWS_NULL                     = 0x4,
        HDM_JWS_INVALID_LENGTH           = 0x5,
        HDM_INVALID_SIGNATURE            = 0x6,
        HDM_INVALID_CERTCHAIN            = 0x7,
        HDM_INVALID_CA                   = 0x8,
        HDM_VERIFY_POLICY_FAIL           = 0x9,
        HDM_APPLY_POLICY_FAIL            = 0xA,
        HDM_LOAD_POLICY_FAIL             = 0xB,
        HDM_COMPUTE_HASH_FAIL            = 0xC,
        HDM_RPMB_FAIL                    = 0xD,
        HDM_GEN_RPMB_HASH_FAIL           = 0xE,
        HDM_RPMB_INTEGRITY_FAIL          = 0xF,
        HDM_GEN_DEVICE_ID_FAIL           = 0x10,
        HDM_KEY_ERROR                    = 0x11,
        HDM_SIGNATURE_ERROR              = 0x12,
        HDM_CERT_DRK_FAIL                = 0x13,
        HDM_ALLOC_ERROR                  = 0x14,
        HDM_GEN_RESPONSE_FAIL            = 0x15,
        HDM_BUF_SIZE_ERROR               = 0x16,
        HDM_CONVERT_DER_CERT_FAIL        = 0x17,
        HDM_DEVICE_ID_CHECK_FAIL         = 0x18,
        HDM_DEVICE_OK                    = 0x19,
        HDM_DEVICE_COMPROMISED           = 0x1A,
        HDM_WRONG_POLICY_VERSION         = 0x1B,
        HDM_UNWRAP_DECAPSULATE_ERROR     = 0x1C,
        HDM_UNWRAP_APP_NAME_FAILED       = 0x1D,
        HDM_UNWRAP_FAILED_WRAP           = 0x1E,
        HDM_UNWRAP_FAILED_NO_KEY         = 0x1F,
        HDM_UNWRAP_FAILED                = 0x20,
        HDM_UNWRAP_VERSION_MISMATCH      = 0x21,
        HDM_UNWRAP_UNKNOWN               = 0x22,
        HDM_UNWRAP_LOAD_KEY_ERROR        = 0x23,
        HDM_UNWRAP_KEY_LENGTH_FAILED     = 0x24,
        HDM_RPMB_MAGIC_FAIL              = 0x25,
        HDM_APPLY_DEFAULT_POLICY         = 0x26,
        HDM_RPMB_NOT_PROVISIONED         = 0x27,
        HDM_ICCC_RW_FAIL                 = 0x28,
        HDM_JSON_FAIL                    = 0x29,
        HDM_DEREGISTER_SHARED_BUF_FAIL   = 0x2A,
        HDM_REGISTER_SHARED_BUF_FAIL     = 0x2B,
        HDM_GET_POLICY_FAIL              = 0x2C,
        HDM_INVALID_RPMB_VERSION_VALUE   = 0x2D,
        HDM_RPMB_IS_FULL                 = 0x2E,
        HDM_RPMB_SERVICE_NAME_MISMATCH   = 0x2F,
        HDM_INVALID_SERVICE_NAME         = 0x30,
        HDM_READ_EM_STATUS_FAIL          = 0x31,
        HDM_INVALID_CN_CHECK             = 0x32,
        HDM_INVALID_REQUEST_LEN          = 0x33,
        HDM_INVALID_REQ_ID               = 0x34,
        HDM_SERVICE_NAME_NOT_FOUND       = 0x35,

} hdm_return_code_t;

/**
 * Normal world info
 */
typedef struct {
        uint8_t serial_number[NWS_INFO_LEN];
        uint8_t imei_0[NWS_INFO_LEN];
        uint8_t hash_imei[NWS_INFO_LEN];
        uint8_t mac_addr[NWS_INFO_LEN];
        uint8_t hdm_key[HDM_DRK_MAX_BUF_LEN];
        uint32_t hdm_key_len;
        uint32_t is_wrapped_key;
} __attribute__ ((packed)) hdm_nwd_info_t;

/**
 * Service info
 */
typedef struct {
        uint8_t  service_name[SERVICE_NAME_LEN];
        uint32_t service_request_len;
        uint8_t  service_request_id[NWS_INFO_LEN];
} __attribute__ ((packed)) service_info_t;

/**
 * HDM message
 */
typedef struct {
        uint32_t len;
        uint8_t data[JWS_LEN];
        uint32_t policy_value;
} __attribute__ ((packed)) tci_jws_message_t;

/**
 * TCI message
 */
typedef struct {
        tz_msg_header_t header;
        tci_jws_message_t jws_message;
        hdm_nwd_info_t nwd_info;
        service_info_t service_info;
} __attribute__ ((packed)) tci_message_t;

#endif /* _TZ_HDM_INTERFACE_H_ */
