/**
 * \file blowfish_utils.c
 * \brief BlowFish helper functions
 * \author Roman Pasechnik (r.pasechnik@samsung.com)
 * \date Created Feb 21, 2014
 * \par In Samsung Ukraine R&D Center (SURC) under a contract between
 * \par LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine) and
 * \par "Samsung Elecrtronics Co", Ltd (Seoul, Republic of Korea)
 * \par Copyright: (c) Samsung Electronics Co, Ltd 2014. All rights reserved.
 **/

#include "blowfish_utils.h"
#include "CommLayerData.h"
#include "log.h"
#include <tee_internal_api.h>

int32_t unwrap(uint8_t* inData, uint32_t inDataLen, uint8_t* outData, uint32_t* outDataLen)
{
	int ret = NO_ERROR;

	LOGD("Unwrapping %d bytes 0x%x 0x%x ... 0x%x 0x%x\n", inDataLen, inData[0], inData[1], inData[inDataLen-2], inData[inDataLen-1]);
	ret = TEES_UnwrapSecureObject(inData, inDataLen, outData, outDataLen);
	if (ret != TEE_SUCCESS) {
		LOGE("Unwrapping failed, error %x\n", ret);
		ret = PLATFORM_INTERNAL_ERROR;
	} else {
		LOGD("Unwrapped %d bytes\n", *outDataLen);
	}

	return ret;
}

int32_t wrap(uint8_t* inData, uint32_t inDataLen, uint8_t* outData, uint32_t* outDataLen, uint8_t* TID, uint32_t TIDLen)
{
	int ret = NO_ERROR;
	uint32_t len;

	SO_AccessControlInfoType ac;
	memset(&ac, 0, sizeof(ac));
	if (TIDLen>sizeof(ac.ta_id)) {
		LOGE("TIDLen out of size ta_id , error %x\n", TIDLen);
		return WRONG_DATA;
	}
	memcpy(&ac.ta_id, TID, TIDLen);
	ac.access_flags |= TA_ID_AC;

	LOGD("Wrapping %d bytes\n", inDataLen);
	len = SO_OUT_BUF_SIZE(inDataLen, &ac.ta_id);

	if (*outDataLen<len) {
		*outDataLen=len;
		LOGE("outDataLen wrong data , size %x\n", *outDataLen);
		return WRONG_DATA;
	 }
	ret = TEES_WrapSecureObject(inData, inDataLen, outData, outDataLen, &ac);
	if (ret != TEE_SUCCESS) {
		LOGE("Wrapping failed, error %x\n", ret);
		ret = PLATFORM_INTERNAL_ERROR;
	} else {
		LOGD("Wrapped %d bytes 0x%x 0x%x ... 0x%x 0x%x\n", *outDataLen, outData[0], outData[1], outData[*outDataLen-2], outData[*outDataLen-1]);
	}

	return ret;
}
