/*
@file app_main.c
*/

#include "app_main.h"

/**
 * Modify the app name to your specific app name
 */
#if defined(TEST1)
char TZ_APP_NAME[] = {"testgrd"};
#elif defined(TEST2)
char TZ_APP_NAME[] = {"testgrd2"};
#elif defined(TEST3)
char TZ_APP_NAME[] = {"testgrd3"};
#else
char TZ_APP_NAME[] = {"na"};
#endif

/**
  @brief
    Add any app specific initialization code here
    QSEE will call this function after secure app is loaded and
    authenticated
*/
void tz_app_init(void)
{
    //qsee_log_set_mask(QSEE_LOG_MSG_ERROR | QSEE_LOG_MSG_FATAL | QSEE_LOG_MSG_DEBUG | QSEE_LOG_MSG_HIGH);
    qsee_log_set_mask(QSEE_LOG_MSG_DEBUG);
    /*  App specific initialization code*/
    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : Init ", TAG);
}

uint32_t grdm_ICCC_get_rot_test(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    grdm_rot_status_t rot_credential_buffer;
    grdm_default_device_status_t device_status_buffer;

    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getDeviceROTStat((uint32_t *)&device_status_buffer)) {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : current GRDM status in GRDM ICCC : %d", TAG, device_status_buffer.grdm_status);
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : current DEV RoT status in GRDM ICCC : %d", TAG, device_status_buffer.dev_rot_status);
        if (device_status_buffer.dev_rot_status == 1) {
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getDefaultROTCredential((uint32_t *)&rot_credential_buffer)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_state %#x", TAG, rot_credential_buffer.verified_boot_state);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : device_locked %#x", TAG, rot_credential_buffer.device_locked);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : os_version %#x", TAG, rot_credential_buffer.os_version);
                //getStringValueFromROT(OSVERSION_FLAG, rot_credential_buffer.os_version);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : patch_month_year %#x", TAG, rot_credential_buffer.patch_month_year);
                //getStringValueFromROT(PATCHMONTHYEAR_FLAG, rot_credential_buffer.patch_month_year);
                for (int cnt = 0; cnt < 8; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_key[%d] %#x", TAG, cnt, rot_credential_buffer.verified_boot_key[cnt]);
                }
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : boot_patch_level %#x", TAG, rot_credential_buffer.boot_patch_level);
                //getStringValueFromROT(BOOTPATCHLEVEL_FLAG, rot_credential_buffer.boot_patch_level);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : vendor_patch_level %#x", TAG, rot_credential_buffer.vendor_patch_level);
                //getStringValueFromROT(VENDORPATCHLEVEL_FLAG, rot_credential_buffer.vendor_patch_level);
                for (int cnt = 0; cnt < 8; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_hash[%d] %#x", TAG, cnt, rot_credential_buffer.verified_boot_hash[cnt]);
                }
                memcpy(&respmsg->content.iccc_test_rsp.grdm_rot_cred, &rot_credential_buffer, sizeof(rot_credential_buffer));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getDefaultROTCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_DEFAULT_ROT_GET_FAILED;
            }
        } else {
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getROTCredential((uint32_t *)&rot_credential_buffer)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_state %#x", TAG, rot_credential_buffer.verified_boot_state);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : device_locked %#x", TAG, rot_credential_buffer.device_locked);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : os_version %#x", TAG, rot_credential_buffer.os_version);
                //getStringValueFromROT(OSVERSION_FLAG, rot_credential_buffer.os_version);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : patch_month_year %#x", TAG, rot_credential_buffer.patch_month_year);
                //getStringValueFromROT(PATCHMONTHYEAR_FLAG, rot_credential_buffer.patch_month_year);
                for (int cnt = 0; cnt < 8; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_key[%d] %#x", TAG, cnt, rot_credential_buffer.verified_boot_key[cnt]);
                }
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : boot_patch_level %#x", TAG, rot_credential_buffer.boot_patch_level);
                //getStringValueFromROT(BOOTPATCHLEVEL_FLAG, rot_credential_buffer.boot_patch_level);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : vendor_patch_level %#x", TAG, rot_credential_buffer.vendor_patch_level);
                //getStringValueFromROT(VENDORPATCHLEVEL_FLAG, rot_credential_buffer.vendor_patch_level);
                for (int cnt = 0; cnt < 8; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : verified_boot_hash[%d] %#x", TAG, cnt, rot_credential_buffer.verified_boot_hash[cnt]);
                }
                memcpy(&respmsg->content.iccc_test_rsp.grdm_rot_cred, &rot_credential_buffer, sizeof(rot_credential_buffer));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getROTCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ROT_GET_FAILED;
            }
        }
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getDeviceROTStat failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_GET_DEV_ROT_STAT_FAILED;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

uint32_t grdm_ICCC_get_bl_test(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    grdm_bl_status_t bl_credential_buffer;
    grdm_default_device_status_t device_status_buffer;

    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getDeviceROTStat((uint32_t *)&device_status_buffer)) {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : current GRDM status in GRDM ICCC : %d", TAG, device_status_buffer.grdm_status);
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : current DEV RoT status in GRDM ICCC : %d", TAG, device_status_buffer.dev_rot_status);
        if (device_status_buffer.dev_rot_status == 1) {
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getDefaultBLCredential((uint32_t *)&bl_credential_buffer)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : rp_ver %#x", TAG, bl_credential_buffer.rp_ver);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kernel_rp %#x", TAG, bl_credential_buffer.kernel_rp);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : system_rp %#x", TAG, bl_credential_buffer.system_rp);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : test_bit %#x", TAG, bl_credential_buffer.test_bit);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : sec_boot %#x", TAG, bl_credential_buffer.sec_boot);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : react_lock %#x", TAG, bl_credential_buffer.react_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kiwi_lock %#x", TAG, bl_credential_buffer.kiwi_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : frp_lock %#x", TAG, bl_credential_buffer.frp_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cc_mode %#x", TAG, bl_credential_buffer.cc_mode);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : mdm_mode %#x", TAG, bl_credential_buffer.mdm_mode);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : curr_bin_status %#x", TAG, bl_credential_buffer.curr_bin_status);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : afw_value %#x", TAG, bl_credential_buffer.afw_value);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : warranty_bit %#x", TAG, bl_credential_buffer.warranty_bit);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kap_status %#x", TAG, bl_credential_buffer.kap_status);
                for (int cnt = 0; cnt < 12; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : image_status[%d] %#x", TAG, cnt, bl_credential_buffer.image_status[cnt]);
                }
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : image_status_bl %#x", TAG, bl_credential_buffer.image_status_bl);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : WbHistory %#x", TAG, bl_credential_buffer.WbHistory);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : ap_serial_0 %#x", TAG, bl_credential_buffer.ap_serial_0);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : ap_serial_1 %#x", TAG, bl_credential_buffer.ap_serial_1);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : em_status %#x", TAG, bl_credential_buffer.em_status);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : em_token %#x", TAG, bl_credential_buffer.em_token);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : trustboot_flag %#x", TAG, bl_credential_buffer.trustboot_flag);
                memcpy(&respmsg->content.iccc_test_rsp.grdm_bl_cred, &bl_credential_buffer, sizeof(bl_credential_buffer));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getDefaultBLCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_DEFAULT_BL_GET_FAILED;
            }
        } else {
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getBLCredential((uint32_t *)&bl_credential_buffer)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : rp_ver %#x", TAG, bl_credential_buffer.rp_ver);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kernel_rp %#x", TAG, bl_credential_buffer.kernel_rp);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : system_rp %#x", TAG, bl_credential_buffer.system_rp);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : test_bit %#x", TAG, bl_credential_buffer.test_bit);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : sec_boot %#x", TAG, bl_credential_buffer.sec_boot);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : react_lock %#x", TAG, bl_credential_buffer.react_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kiwi_lock %#x", TAG, bl_credential_buffer.kiwi_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : frp_lock %#x", TAG, bl_credential_buffer.frp_lock);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cc_mode %#x", TAG, bl_credential_buffer.cc_mode);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : mdm_mode %#x", TAG, bl_credential_buffer.mdm_mode);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : curr_bin_status %#x", TAG, bl_credential_buffer.curr_bin_status);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : afw_value %#x", TAG, bl_credential_buffer.afw_value);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : warranty_bit %#x", TAG, bl_credential_buffer.warranty_bit);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : kap_status %#x", TAG, bl_credential_buffer.kap_status);
                for (int cnt = 0; cnt < 12; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : image_status[%d] %#x", TAG, cnt, bl_credential_buffer.image_status[cnt]);
                }
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : image_status_bl %#x", TAG, bl_credential_buffer.image_status_bl);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : WbHistory %#x", TAG, bl_credential_buffer.WbHistory);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : ap_serial_0 %#x", TAG, bl_credential_buffer.ap_serial_0);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : ap_serial_1 %#x", TAG, bl_credential_buffer.ap_serial_1);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : em_status %#x", TAG, bl_credential_buffer.em_status);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : em_token %#x", TAG, bl_credential_buffer.em_token);
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : trustboot_flag %#x", TAG, bl_credential_buffer.trustboot_flag);
                memcpy(&respmsg->content.iccc_test_rsp.grdm_bl_cred, &bl_credential_buffer, sizeof(bl_credential_buffer));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getBLCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_BL_GET_FAILED;
            }
        }
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getDeviceROTStat failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_GET_DEV_ROT_STAT_FAILED;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

uint32_t grdm_ICCC_get_iccc_test(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    grdm_iccc_credential_1_t iccc_credential_buffer_1;
    grdm_iccc_credential_2_t iccc_credential_buffer_2;

    uint32_t type = sendmsg->content.iccc_req.type;
    switch (type) {
        case ATN_BLOB_HASH_FLAG:
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ATN_BLOB_HASH_FLAG, (uint32_t *)&iccc_credential_buffer_1)) {
                for (int cnt = 0; cnt < 8; cnt++) {
                    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : atn_blob_hash[%d] %#x", TAG, cnt, iccc_credential_buffer_1.atn_blob_hash[cnt]);
                }
                memcpy(&respmsg->content.iccc_test_rsp.grdm_iccc_cred1, &iccc_credential_buffer_1, sizeof(iccc_credential_buffer_1));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
            }
            break;
        case ICCC_VERSION_FLAG:
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ICCC_VERSION_FLAG, (uint32_t *)&iccc_credential_buffer_2)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : iccc_version %#x", TAG, iccc_credential_buffer_2.iccc_version);
                memcpy(&respmsg->content.iccc_test_rsp.grdm_iccc_cred2, &iccc_credential_buffer_2, sizeof(iccc_credential_buffer_2));
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
            }
            break;
        default:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
            ret = TZ_GRDM_ICCC_ERROR_NOT_SUPPORT;
            break;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

uint32_t grdm_ICCC_set_iccc_test(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;
    uint8_t atn_blob_hash[32] = {0x52, 0x94, 0x31, 0xc2, 0x09, 0xce, 0x01, 0x2a, 0xda, 0xda, 0x58, 0xc4, 0xc9, 0x7f, 0xf2, 0xb4,
                                 0xa2, 0x23, 0x68, 0x90, 0xf7, 0x27, 0x39, 0xb1, 0x8e, 0xd0, 0xda, 0xe3, 0xcb, 0x48, 0x98, 0x2c };

    grdm_iccc_credential_1_t iccc_credential_buffer_1;
    memcpy(&iccc_credential_buffer_1.atn_blob_hash, atn_blob_hash, sizeof(atn_blob_hash));
    grdm_iccc_credential_2_t iccc_credential_buffer_2;
    iccc_credential_buffer_2.iccc_version = 1;

    uint32_t type = sendmsg->content.iccc_req.type;
    switch (type) {
        case ATN_BLOB_HASH_FLAG:
            for (int cnt = 0; cnt < 8; cnt++) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : atn_blob_hash[%d] %#x", TAG, cnt, iccc_credential_buffer_1.atn_blob_hash[cnt]);
            }
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(ATN_BLOB_HASH_FLAG, (uint32_t *)&iccc_credential_buffer_1)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential success", TAG);
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
            }
            break;
        case ICCC_VERSION_FLAG:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : iccc_version %d", TAG, iccc_credential_buffer_2.iccc_version);
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(ICCC_VERSION_FLAG, (uint32_t *)&iccc_credential_buffer_2)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential success", TAG);
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
            }
            break;
        default:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential failure", TAG);
            ret = TZ_GRDM_ICCC_ERROR_NOT_SUPPORT;
            break;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

uint32_t grdm_ICCC_del_iccc_test(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    uint32_t type = sendmsg->content.iccc_req.type;
    switch (type) {
        case ATN_BLOB_HASH_FLAG:
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_deleteCredential(ATN_BLOB_HASH_FLAG)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential success", TAG);
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_DEL_FAILED;
            }
            break;
        case ICCC_VERSION_FLAG:
            if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_deleteCredential(ICCC_VERSION_FLAG)) {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential success", TAG);
            } else {
                qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential failure", TAG);
                ret = TZ_GRDM_ICCC_ERROR_ICCC_DEL_FAILED;
            }
            break;
        default:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_setCredential failure", TAG);
            ret = TZ_GRDM_ICCC_ERROR_NOT_SUPPORT;
            break;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

uint32_t grdm_negative(iccc_test_payload_t *sendmsg, iccc_test_payload_t *respmsg)
{
    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    grdm_iccc_credential_1_t iccc_credential_buffer_1;
    uint32_t ng_flag = 0;

    // grdm_ICCC_getROTCredential
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getROTCredential(NULL)) { // getCred() failed, err = 1, ret = -1011
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getROTCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getROTCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ROT_GET_FAILED;
    }
    // grdm_ICCC_getBLCredential
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getBLCredential(NULL)) { // getCred() failed, err = 1, ret = -1012
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getBLCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getBLCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ROT_GET_FAILED;
    }
    // grdm_ICCC_getCredential
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ng_flag, (uint32_t *)&iccc_credential_buffer_1)) { // check command type permission failed type 0, error -1002
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ATN_BLOB_HASH_FLAG, NULL)) { // getCred() failed, err = 1, ret = -1013
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ICCC_VERSION_FLAG, NULL)) { // getCred() failed, err = 1, ret = -1013
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(ng_flag, NULL)) { // getCred() failed, err = 1, ret = -1013
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(NULL, (uint32_t *)&iccc_credential_buffer_1)) { // check command type permission failed type 0, error -1002
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_getCredential(NULL, NULL)) { // getCred() failed, err = 1, ret = -1013
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_getCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_GET_FAILED;
    }
    // grdm_ICCC_storeCredential
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(ATN_BLOB_HASH_FLAG, NULL)) { // storeCred() failed, err = 1, ret = -1014
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(ng_flag, NULL)) { // storeCred() failed, err = 1, ret = -1014
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(NULL, (uint32_t *)&iccc_credential_buffer_1)) { // check command type permission failed type 0, error -1002
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
    }
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_storeCredential(NULL, NULL)) { // storeCred() failed, err = 1, ret = -1014
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_storeCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_SET_FAILED;
    }
    // grdm_ICCC_deleteCredential
    if (TZ_GRDM_ICCC_SUCCESS == grdm_ICCC_deleteCredential(ng_flag)) { // check command type permission failed type 0, error -1002
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential success", TAG);
    } else {
        qsee_log(QSEE_LOG_MSG_DEBUG, "%s : grdm_ICCC_deleteCredential failure", TAG);
        ret = TZ_GRDM_ICCC_ERROR_ICCC_DEL_FAILED;
    }

    respmsg->content.iccc_test_rsp.ret = ret;
    return ret;
}

/**
  @brief
    App specific command handler
    App executes code based on input command
*/
void tz_app_cmd_handler(void* cmd, uint32 cmdlen, void* rsp, uint32 rsplen)
{    
    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd handler", TAG);

    uint32_t ret = TZ_GRDM_ICCC_SUCCESS;

    tciMessage_t *sendmsg = cmd;
    tciMessage_t *respmsg = rsp;
    uint32_t cmd_id;

    cmd_id = sendmsg->header.id;
    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : tz_app_cmd_handler: cmd_id: %d", TAG, cmd_id);

    switch (cmd_id) {
        case CMD_ICCC_GRDM_GET_ROT_CRED_TEST:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_GET_ROT_CRED_TEST", TAG);
            ret = grdm_ICCC_get_rot_test(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        case CMD_ICCC_GRDM_GET_BL_CRED_TEST:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_GET_BL_CRED_TEST", TAG);
            ret = grdm_ICCC_get_bl_test(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        case CMD_ICCC_GRDM_GET_ICCC_CRED_TEST:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_GET_ICCC_CRED_TEST", TAG);
            ret = grdm_ICCC_get_iccc_test(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        case CMD_ICCC_GRDM_SET_ICCC_CRED_TEST:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_SET_ICCC_CRED_TEST", TAG);
            ret = grdm_ICCC_set_iccc_test(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        case CMD_ICCC_GRDM_DEL_ICCC_CRED_TEST:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_DEL_ICCC_CRED_TEST", TAG);
            ret = grdm_ICCC_del_iccc_test(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        case CMD_ICCC_GRDM_TEST_NEGATIVE:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : cmd case CMD_ICCC_GRDM_TEST_NEGATIVE", TAG);
            ret = grdm_negative(&sendmsg->payload.test, &respmsg->payload.test);
            break;
        default:
            qsee_log(QSEE_LOG_MSG_DEBUG, "%s : received unknown command: %d!", TAG, cmd_id);
            ret = TZ_GRDM_ICCC_UNKNOWN_CMD;
            break;
    }

    respmsg->header.id = RSP_ID(sendmsg->header.id);
    respmsg->header.status = ret;
    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : tz_app_cmd_handler: ret: %d", TAG, ret);
}

/**
  @brief
    App specific shutdown
    App will be given a chance to shutdown gracefully
*/
void tz_app_shutdown(void)
{
    /* app specific shutdown code*/
    qsee_log(QSEE_LOG_MSG_DEBUG, "%s : shutdown", TAG);
    return;
}
