//  encrypt.c

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cose/cose.h>
#include <cose/cose_configure.h>
#include <cn-cbor/cn-cbor.h>

#if INCLUDE_COUNTERSIGNATURE

#include "test.h"
#include "cose_int.h"

void CounterSign_Corners()
{
	HCOSE_COUNTERSIGN hCounterSign = NULL;
	HCOSE_COUNTERSIGN hBadHandle = NULL;
	HCOSE_COUNTERSIGN hNULL = NULL;
	cose_errback cose_error;
	byte rgb[10];

	cn_cbor *cn = cn_cbor_int_create(5, CBOR_CONTEXT_PARAM_COMMA NULL);

	hCounterSign = COSE_CounterSign_Init(CBOR_CONTEXT_PARAM_COMMA NULL);
	hBadHandle = (HCOSE_COUNTERSIGN)COSE_CALLOC(1, sizeof(COSE), context);
#if INCLUDE_SIGN1
	HCOSE_SIGN1 hSign1 =
		COSE_Sign1_Init(0, CBOR_CONTEXT_PARAM_COMMA & cose_error);
#endif
	//  Look for invalid parameter
	//		Null handle checks
	//		bad handle checks
	//		null pointers

	CHECK_FAILURE(
		COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(
		COSE_CounterSign_map_get_int(hNULL, 1, COSE_BOTH, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(
		COSE_CounterSign_map_get_int(hCounterSign, 1, COSE_BOTH, &cose_error),
		COSE_ERR_INVALID_PARAMETER, CFails++);

	CHECK_FAILURE(COSE_CounterSign_map_put_int(
					  hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(COSE_CounterSign_map_put_int(
					  hNULL, 1, cn, COSE_PROTECT_ONLY, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(COSE_CounterSign_map_put_int(
					  hNULL, 1, NULL, COSE_PROTECT_ONLY, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(COSE_CounterSign_map_put_int(hCounterSign, 1, cn,
					  COSE_PROTECT_ONLY | COSE_UNPROTECT_ONLY, &cose_error),
		COSE_ERR_INVALID_PARAMETER, CFails++);

#if INCLUDE_SIGN1
	CHECK_FAILURE(
		COSE_Sign1_add_countersignature(hSign1, hBadHandle, &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	((COSE_CounterSign *)hCounterSign)->m_next = (COSE_CounterSign *)hBadHandle;
	CHECK_FAILURE(
		COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error),
		COSE_ERR_INVALID_PARAMETER, CFails++);
	CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
		COSE_ERR_INVALID_PARAMETER, CFails++);
	((COSE_CounterSign *)hCounterSign)->m_next = NULL;
	COSE_Sign1_add_countersignature(hSign1, hCounterSign, &cose_error);
	CHECK_FAILURE(COSE_Sign1_get_countersignature(hSign1, 3, &cose_error),
		COSE_ERR_INVALID_PARAMETER, CFails++);
#endif

	CHECK_FAILURE(
		COSE_CounterSign_SetExternal(hNULL, rgb, sizeof(rgb), &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	CHECK_FAILURE(
		COSE_CounterSign_SetExternal(hBadHandle, rgb, sizeof(rgb), &cose_error),
		COSE_ERR_INVALID_HANDLE, CFails++);
	COSE_CounterSign_SetExternal(hCounterSign, rgb, sizeof(rgb), &cose_error);

	CHECK_RETURN(!COSE_CounterSign_Free(hBadHandle), false, CFails++);

	COSE_CounterSign_Free(hCounterSign);
#if INCLUDE_SIGN1
	COSE_Sign1_Free(hSign1);
#endif
}
#endif
