/*
 * @file bksecapp_kdf.c
 * @brief API implementation to get kdf values
 * Copyright (c) 2021, Samsung Electronics Corporation. All rights reserved.
 */

#include <stdbool.h>
#include <qsee_log.h>
#include <qsee_heap.h>
#include <qsee_kdf.h>
#include <bksecapp_common.h>

int32_t bksecapp_kdf(bksecapp_kdf_req_t *kdf_in_data, bksecapp_kdf_rsp_t *kdf_out_data)
{
	int32_t ret = 0;
	int32_t conalloc = 0;
	void *key_context = NULL;
	uint32_t key_context_len = 0;

	char base_key_label[] = {"Bksecapp Key Label."};
	char base_key_context[] = {"Bksecapp Key Context."};

	kdf_out_data->Rspkeylen = kdf_in_data->Reqkeylen;
	key_context_len = kdf_in_data->ReqkeyContextLen;

	if (key_context_len) {
		if (key_context_len < sizeof(kdf_in_data->ReqkeyContext))
		{
			key_context = (void *)qsee_malloc(key_context_len);
			if (key_context != NULL) {
				memcpy((void *)key_context, kdf_in_data->ReqkeyContext,key_context_len);
				conalloc = 1;
			}
		} else {
			ret = BKERR_KDF_CONTEXTLEN_SIZEOVER;
			qsee_log(QSEE_LOG_MSG_ERROR,"%s: ReqkeyContextLen is over than ReqkeyContext buffer",__FUNCTION__);
			return BKERR_KDF_CONTEXTLEN_SIZEOVER;
		}
	} else {
		key_context_len = sizeof(base_key_context);
		key_context = base_key_context;
	}

	ret = qsee_kdf(NULL, 0, (const void *)base_key_label, sizeof(base_key_label), (const void *)key_context, key_context_len,
			kdf_out_data->Rspkeydata, kdf_out_data->Rspkeylen);
			
	if (ret) {
		qsee_log(QSEE_LOG_MSG_ERROR,"%s: qsee_kdf() null pointers present where not allowed (%d)",__FUNCTION__,ret);
		ret = BKERR_KDF_API_FAIL;
	}

	if (conalloc)
		qsee_free(key_context);

	return ret;
}
