#include <stdlib.h>
#ifndef __MBED__
#include <memory.h>
#endif

#include "cose/cose.h"
#include "cose_int.h"
#include "cose/cose_configure.h"
#include "cose_crypto.h"

#if USE_COUNTER_SIGNATURE1

extern bool IsValidCounterSign1Handle(HCOSE_COUNTERSIGN1 h);

bool _COSE_CounterSign1_add(COSE* pMessage,
	HCOSE_COUNTERSIGN1 hSigner,
	cose_errback* perr)
{
	COSE_CounterSign1* pSigner = (COSE_CounterSign1*)hSigner;

	CHECK_CONDITION(
		IsValidCounterSign1Handle(hSigner), COSE_ERR_INVALID_HANDLE);

	pMessage->m_counterSign1 = pSigner;
	return true;

errorReturn:
	return false;
}

HCOSE_COUNTERSIGN _COSE_CounterSign1_get(COSE* pMessage, cose_errback* perr)
{
	UNUSED(perr);

	COSE_CounterSign1* pSigner = pMessage->m_counterSign1;

	return (HCOSE_COUNTERSIGN)pSigner;
}

bool _COSE_CountSign_create(COSE* pMessage,
	cn_cbor* pcnBody,
	CBOR_CONTEXT_COMMA cose_errback* perr)
{
	cn_cbor* pArray = nullptr;
	cn_cbor_errback cbor_err;
	COSE_CounterSign1* pSigner = nullptr;
	cn_cbor* pcnProtected = nullptr;
	cn_cbor* pcn = nullptr;
	cn_cbor* pcn2 = nullptr;

	if (pMessage->m_counterSigners == nullptr)
		return true;

	//  One or more than one?
	if (pMessage->m_counterSigners->m_signer.m_signerNext != nullptr) {
		pArray = cn_cbor_array_create(CBOR_CONTEXT_PARAM_COMMA & cbor_err);
		CHECK_CONDITION_CBOR(pArray != nullptr, cbor_err);
	}

	pcnProtected = _COSE_arrayget_int(pMessage, INDEX_PROTECTED);
	CHECK_CONDITION(pcnProtected != nullptr, COSE_ERR_INTERNAL);

	for (pSigner = pMessage->m_counterSigners; pSigner != nullptr;
		 pSigner = pSigner->m_next) {
		CHECK_CONDITION(
			pSigner->m_signer.m_signerNext == nullptr, COSE_ERR_INTERNAL);

		pcn = cn_cbor_data_create(pcnProtected->v.bytes, pcnProtected->v.count,
			CBOR_CONTEXT_PARAM_COMMA & cbor_err);
		CHECK_CONDITION_CBOR(pcnProtected != nullptr, cbor_err);

		pcn2 = cn_cbor_clone(pcnBody, CBOR_CONTEXT_PARAM_COMMA & cbor_err);
		CHECK_CONDITION_CBOR(pcnBody != nullptr, cbor_err);

		if (!_COSE_Signer_sign(&pSigner->m_signer, pcnBody, pcn2, perr))
			goto errorReturn;
		pcn = nullptr;
		pcn2 = nullptr;

		if (pArray != nullptr) {
			bool f = cn_cbor_array_append(
				pArray, pSigner->m_signer.m_message.m_cborRoot, &cbor_err);
			CHECK_CONDITION_CBOR(f, cbor_err);
		}
		else {
			pArray = pSigner->m_signer.m_message.m_cborRoot;
		}
	}

	if (!_COSE_map_put(pMessage, COSE_Header_CounterSign, pArray,
			COSE_UNPROTECT_ONLY, perr))
		goto errorReturn;

	return true;

errorReturn:
	if (pArray != nullptr)
		CN_CBOR_FREE(pArray, context);
	if ((pcn != nullptr) && (pcn->parent != nullptr))
		CN_CBOR_FREE(pcn, context);
	if ((pcn2 != nullptr) && (pcn2->parent != nullptr))
		CN_CBOR_FREE(pcn2, context);
	return false;
}

#endif
