
/*
 * =====================================================================================
 *
 *       Filename:  hdm_rpmb.c
 *
 *    Description:  HDM RPMB manipulation
 *
 *        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.
 *
 * =====================================================================================
 */

/** Includes */
#include "hdm_rpmb.h"

/**
 * @brief
 * hdm_rpmb_init
 * RPMB initialization
 *
 * @param[in]  *rpmbSession - rpmbSession
 *
 * @return HDM status code
 */
hdm_return_code_t hdm_rpmb_init(uint32_t *rpmbSession) {
        HDM_LOG_DEBUG("hdm_rpmb_init()");

        *rpmbSession = TEE_RpmbOpenSession((uint32_t) TZ_RPMB_HDM_PARTITION_ID);
        if (rpmbSession == 0xFFFFFFFF) {
                HDM_LOG("RPMB is unavailable : 0x%x", *rpmbSession);
                return HDM_RPMB_FAIL;
        }
        return HDM_STATUS_SUCCESS;

}

/**
 * @brief
 * hdm_rpmb_read
 * Read RPMB data
 *
 * @param[in]  *rpmbSession - rpmbSession
 * @param[out] *data        - data buffer with RPMB content
 * @param[in]  *data_len    - read data length
 *
 * @return HDM status code
 */
hdm_return_code_t hdm_rpmb_read(uint32_t *rpmbSession, uint8_t *data, uint32_t data_len) {
        HDM_LOG_DEBUG("hdm_rpmb_read()");

        int tee_ret = TEE_SUCCESS;

        TEE_RpmbReadData(*rpmbSession, data, data_len, &tee_ret);
        if (tee_ret != TEE_SUCCESS) {
                HDM_LOG("Failed to read RPMB : 0x%x", tee_ret);
                return HDM_RPMB_FAIL;
        }

        HDM_LOG_DEBUG("-- (hdm_rpmb_read) -- ");
        HDM_LOG_DEBUG("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x ", data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
        HDM_LOG_DEBUG("0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x ", data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15]);


        HDM_LOG("Success to read RPMB : 0x%x", tee_ret);

        return HDM_STATUS_SUCCESS;
}

/**
 * @brief
 * hdm_rpmb_write
 * Write data on RPMB
 *
 * @param[in]  *rpmbSession - rpmbSession
 * @param[out] *data     - data buffer with RPMB content
 * @param[in]  *data_len - read data length
 *
 * @return HDM status code
 */
hdm_return_code_t hdm_rpmb_write(uint32_t *rpmbSession, uint8_t *data, uint32_t data_len) {
        HDM_LOG_DEBUG("hdm_rpmb_write() data_len : %d", data_len);

        TEE_Result tee_ret = TEE_SUCCESS;

        TEE_RpmbWriteData(*rpmbSession, data, data_len, &tee_ret);
        if (tee_ret != TEE_SUCCESS) {
                HDM_LOG("Failed to write RPMB : 0x%x", tee_ret);
                return HDM_RPMB_FAIL;
        }

        HDM_LOG_DEBUG("success to write RPMB : 0x%x", tee_ret);
        return HDM_STATUS_SUCCESS;
}

/**
 * @brief
 * hdm_rpmb_close
 * Close session RPMB
 *
 * @param[in]  *rpmbSession - rpmbSession
 *
 * @return HDM status code
 */
hdm_return_code_t hdm_rpmb_close(uint32_t *rpmbSession) {
        HDM_LOG_DEBUG("hdm_rpmb_close()");

        TEE_Result tee_result = TEE_SUCCESS;

        tee_result = TEE_RpmbCloseSession(*rpmbSession);
        if (tee_result == 0xFFFFFFFF) {
                HDM_LOG("RPMB - Fail to close session ret = 0x%x", tee_result);
                return HDM_RPMB_FAIL;
        }
        return HDM_STATUS_SUCCESS;

}

