
/*
 * =====================================================================================
 *
 *       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;

        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;
        }

#if defined(SEC_SDK30) || defined(SEC_SDK40)
        SO_AccessControlInfoType ac_info;

        TEEC_UUID creator_uuid = (TEEC_UUID) HDM_UNWRAP_PROV_UUID;  
        TEE_MemFill(&ac_info, 0, sizeof ac_info);

        TEE_MemMove(&ac_info.ta_id, &creator_uuid, sizeof(TEEC_UUID));
        TEE_MemMove(&ac_info.auth_id, HDM_UNWRAP_PROV_TA_AUTH_CRYPTOSUITE, strlen(HDM_UNWRAP_PROV_TA_AUTH_CRYPTOSUITE));
        ac_info.access_flags = DELEGATED_TA_ID_AC;

        unwrap_ret = TEES_CheckSecureObjectCreator(wrapped_ptr, *wrapped_ptr_len, &ac_info); 
        if (unwrap_ret != TEE_SUCCESS) {
                HDM_LOG_DEBUG("TEES_CheckSecureObjectCreator failed with ret=0x%08X, exit", unwrap_ret);
                ret = HDM_KEY_ERROR;
                goto exit;
        }
#endif

        unwrap_ret = TEES_UnwrapSecureObject(wrapped_ptr, *wrapped_ptr_len, unwrapped_ptr, unwrapped_ptr_len);
        if (unwrap_ret != TEE_SUCCESS) {
                HDM_LOG_DEBUG("TEES_UnwrapSecureObject 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;
}
