
/*
 * =====================================================================================
 *
 *       Filename:  hdm_wrapper.c
 *
 *    Description:  HDM wrap/unwrap 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_wrapper.h"

/**
 * @brief
 * unwrap
 *
 * @param[in]  *wrapped_ptr - wrapped object
 * @param[in]  *wrapped_ptr_len - wrapped object length
 * @param[in]  is_wrapped_key - is wrapped object (only for QC)
 * @param[out] *unwrapped_ptr - unwrapped object
 * @param[out] *unwrapped_ptr_len - unwrapped object length
 *
 * @return HDM status code
 */
hdm_return_code_t unwrap(uint8_t *wrapped_ptr, uint32_t *wrapped_ptr_len, uint32_t is_wrapped_key, uint8_t *unwrapped_ptr, uint32_t *unwrapped_ptr_len) {
        HDM_LOG_DEBUG("unwrap()");

        hdm_return_code_t ret = HDM_KEY_ERROR;
        TEE_Result unwrap_ret;
        *unwrapped_ptr_len = HDM_DRK_MAX_BUF_LEN;
        uint8_t TID_PROV[UUID_LENGTH] = {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d};

        if (*wrapped_ptr_len == 0 || *wrapped_ptr_len > HDM_DRK_MAX_BUF_LEN) {
                ret = HDM_KEY_ERROR;
                HDM_LOG("Fail to unwrap hdm key. Invalid wrapped_ptr_len: %d",*wrapped_ptr_len);
                goto exit;
        }

        mcSoHeader_t *hdr = (mcSoHeader_t *)wrapped_ptr;
        if (sizeof(TID_PROV) != UUID_LENGTH || TEE_MemCompare(TID_PROV, hdr->producer.uuid.value, UUID_LENGTH)) {
        HDM_LOG_DEBUG("tlApiUnwrapObject : unexpected src TA name");
        return ret;
        }

        unwrap_ret = tlApiUnwrapObject(wrapped_ptr, *wrapped_ptr_len, unwrapped_ptr, unwrapped_ptr_len,
                              TLAPI_UNWRAP_PERMIT_DELEGATED | TLAPI_UNWRAP_DEFAULT);
        if (unwrap_ret != TLAPI_OK) {
                HDM_LOG_DEBUG("tlApiUnwrapObject failed with ret=0x%08X, exit", unwrap_ret);
                ret = HDM_KEY_ERROR;
                goto exit;
        }

        if (*unwrapped_ptr_len > HDM_DRK_MAX_BUF_LEN) {
                HDM_LOG_DEBUG(TAG "Key Bigger than space.");
                ret = HDM_KEY_ERROR;
                goto exit;
        }

        ret = HDM_STATUS_SUCCESS;
exit:
        return ret;
}
