#pragma once

#include <stdbool.h>
#include <cn-cbor/cn-cbor.h>
#include "cose/cose_configure.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef unsigned char byte;

typedef struct _cose* HCOSE;
typedef struct _cose_sign* HCOSE_SIGN;
typedef struct _cose_signer* HCOSE_SIGNER;
typedef struct _cose_sign1* HCOSE_SIGN1;
typedef struct _cose_encrypt* HCOSE_ENCRYPT;
typedef struct _cose_enveloped* HCOSE_ENVELOPED;
typedef struct _cose_recipient* HCOSE_RECIPIENT;
typedef struct _cose_mac* HCOSE_MAC;
typedef struct _cose_mac0* HCOSE_MAC0;
typedef struct _cose_counterSignature* HCOSE_COUNTERSIGN;
typedef struct _cose_counterSignature1* HCOSE_COUNTERSIGN1;

/**
 * All of the different kinds of errors
 */
typedef enum cose_error {
	/** No error has occurred */
	COSE_ERR_NONE,
	/** An invalid parameter was passed to a function */
	COSE_ERR_INVALID_PARAMETER,
	COSE_ERR_INVALID_HANDLE,
	/** Allocation failed */
	COSE_ERR_OUT_OF_MEMORY,
	/** Error in processing CBOR */
	COSE_ERR_CBOR,
	/** Unknown algorithm found */
	COSE_ERR_UNKNOWN_ALGORITHM,
	/** No usable recipient found */
	COSE_ERR_NO_RECIPIENT_FOUND,
	/** Decryption operation failed */
	COSE_ERR_DECRYPT_FAILED,
	/** Cryptographic failure */
	COSE_ERR_CRYPTO_FAIL,
	/** Internal Error */
	COSE_ERR_INTERNAL,
	/** Type is not supported */
	COSE_ERR_UNSUPPORTED_COSE_TYPE
} cose_error;

typedef enum cose_init_flags {
	COSE_INIT_FLAGS_NONE = 0,
	COSE_INIT_FLAGS_DETACHED_CONTENT = 1,
	COSE_INIT_FLAGS_NO_CBOR_TAG = 2,
	COSE_INIT_FLAGS_ZERO_FORM = 4
} COSE_INIT_FLAGS;
/**
 * Errors
 */
typedef struct _cose_errback {
	/** The error, or CN_CBOR_NO_ERROR if none */
	cose_error err;
} cose_errback;

typedef enum {
	COSE_unknown_object = 0,
	COSE_sign_object = 98,
	COSE_sign1_object = 18,
	COSE_enveloped_object = 96,
	COSE_encrypt_object = 16,
	COSE_mac_object = 97,
	COSE_mac0_object = 17,
	COSE_recipient_object = -1,
	COSE_countersign_object = -2,
} COSE_object_type;

//  Generic functions for the COSE library

HCOSE COSE_Decode(const byte* rgbData,
	size_t cbData,
	int* ptype,
	COSE_object_type struct_type,
	CBOR_CONTEXT_COMMA cose_errback* perr);	 //  Decode the object
size_t COSE_Encode(HCOSE msg, byte* rgb, size_t ib, size_t cb);

cn_cbor* COSE_get_cbor(HCOSE h);

//  Functions for the signing object

typedef enum {
	COSE_PROTECT_ONLY = 1,
	COSE_UNPROTECT_ONLY = 2,
	COSE_DONT_SEND = 4,
	COSE_BOTH = 7
} cose_protect_state;

typedef enum {
	COSE_Algorithm_AES_GCM_128 = 1,
	COSE_Algorithm_AES_GCM_192 = 2,
	COSE_Algorithm_AES_GCM_256 = 3,

	COSE_Algorithm_HMAC_256_64 = 4,
	COSE_Algorithm_HMAC_256_256 = 5,
	COSE_Algorithm_HMAC_384_384 = 6,
	COSE_Algorithm_HMAC_512_512 = 7,

	COSE_Algorithm_CBC_MAC_128_64 = 14,
	COSE_Algorithm_CBC_MAC_256_64 = 15,
	COSE_Algorithm_CBC_MAC_128_128 = 25,
	COSE_Algorithm_CBC_MAC_256_128 = 26,

	COSE_Algorithm_AES_CCM_16_64_128 = 10,
	COSE_Algorithm_AES_CCM_16_64_256 = 11,
	COSE_Algorithm_AES_CCM_64_64_128 = 12,
	COSE_Algorithm_AES_CCM_64_64_256 = 13,
	COSE_Algorithm_AES_CCM_16_128_128 = 30,
	COSE_Algorithm_AES_CCM_16_128_256 = 31,
	COSE_Algorithm_AES_CCM_64_128_128 = 32,
	COSE_Algorithm_AES_CCM_64_128_256 = 33,

	COSE_Algorithm_ECDH_ES_HKDF_256 = -25,
	COSE_Algorithm_ECDH_ES_HKDF_512 = -26,
	COSE_Algorithm_ECDH_SS_HKDF_256 = -27,
	COSE_Algorithm_ECDH_SS_HKDF_512 = -28,

	COSE_Algorithm_ECDH_ES_A128KW = -29,
	COSE_Algorithm_ECDH_ES_A192KW = -30,
	COSE_Algorithm_ECDH_ES_A256KW = -31,
	COSE_Algorithm_ECDH_SS_A128KW = -32,
	COSE_Algorithm_ECDH_SS_A192KW = -33,
	COSE_Algorithm_ECDH_SS_A256KW = -34,

	COSE_Algorithm_AES_KW_128 = -3,
	COSE_Algorithm_AES_KW_192 = -4,
	COSE_Algorithm_AES_KW_256 = -5,

	COSE_Algorithm_Direct = -6,

	COSE_Algorithm_EdDSA = -8,

	COSE_Algorithm_Direct_HKDF_HMAC_SHA_256 = -10,
	COSE_Algorithm_Direct_HKDF_HMAC_SHA_512 = -11,
	COSE_Algorithm_Direct_HKDF_AES_128 = -12,
	COSE_Algorithm_Direct_HKDF_AES_256 = -13,

	//	COSE_Algorithm_PS256 = -8,
	//	COSE_Algorithm_PS384 = -37,
	//	COSE_Algorithm_PS512 = -38,

	COSE_Algorithm_ECDSA_SHA_256 = -7,
	COSE_Algorithm_ECDSA_SHA_384 = -35,
	COSE_Algorithm_ECDSA_SHA_512 = -36,
} COSE_Algorithms;

typedef enum {
	COSE_Header_Algorithm = 1,
	COSE_Header_Critical = 2,
	COSE_Header_Content_Type = 3,
	COSE_Header_KID = 4,
	COSE_Header_IV = 5,
	COSE_Header_Partial_IV = 6,
	COSE_Header_CounterSign = 7,
	COSE_Header_Operation_Time = 8,

	COSE_Header_HKDF_salt = -20,
	COSE_Header_KDF_U_name = -21,
	COSE_Header_KDF_U_nonce = -22,
	COSE_Header_KDF_U_other = -23,
	COSE_Header_KDF_V_name = -24,
	COSE_Header_KDF_V_nonce = -25,
	COSE_Header_KDF_V_other = -26,

	COSE_Header_KDF_PUB_other = -999,
	COSE_Header_KDF_PRIV = -998,
	COSE_Header_UseCompressedECDH = -997,

	COSE_Header_ECDH_EPHEMERAL = -1,
	COSE_Header_ECDH_STATIC = -2,
	COSE_Header_ECDH_EPK = -1,
	COSE_Header_ECDH_SPK = -2,
	COSE_Header_ECDH_SPK_KID = -3,

} COSE_Header;

typedef enum {
	COSE_Key_Type_OKP = 1,
	COSE_Key_Type_EC2 = 2,
	COSE_Key_Type_OCTET = 4,
	COSE_Key_Type = 1,
	COSE_Key_ID = 2,
	COSE_Parameter_KID = 4,
	COSE_Key_EC2_Curve = -1,
	COSE_Key_EC2_X = -2,
	COSE_Key_EC2_Y = -3,
	COSE_Key_OPK_Curve = -1,
	COSE_Key_OPK_X = -2,
} COSE_Constants;

typedef enum {
	COSE_Curve_P256 = 1,
	COSE_Curve_P384 = 2,
	COSE_Curve_P521 = 3,
	COSE_Curve_X25519 = 4,
	COSE_Curve_X448 = 5,
	COSE_Curve_Ed25519 = 6,
	COSE_Curve_Ed448 = 7,
} COSE_Curves;

/*
 *  messages dealing with the Enveloped message type
 */

HCOSE_ENVELOPED COSE_Enveloped_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Enveloped_Free(HCOSE_ENVELOPED cose);

cn_cbor* COSE_Enveloped_map_get_int(HCOSE_ENVELOPED cose,
	int key,
	int flags,
	cose_errback* errp);
cn_cbor* COSE_Enveloped_map_get_string(HCOSE_ENVELOPED cose,
	const char* key,
	int flags,
	cose_errback* errp);
bool COSE_Enveloped_map_put_int(HCOSE_ENVELOPED cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);
bool COSE_Enveloped_map_put_string(HCOSE_ENVELOPED cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_Enveloped_SetContent(HCOSE_ENVELOPED cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);
byte* COSE_Enveloped_GetContent(HCOSE_ENVELOPED cose,
	size_t* pcbContent,
	cose_errback* errp);
bool COSE_Enveloped_SetExternal(HCOSE_ENVELOPED hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

bool COSE_Enveloped_encrypt(HCOSE_ENVELOPED cose, cose_errback* perror);
bool COSE_Enveloped_decrypt(HCOSE_ENVELOPED,
	HCOSE_RECIPIENT,
	cose_errback* perr);

bool COSE_Enveloped_AddRecipient(HCOSE_ENVELOPED hMac,
	HCOSE_RECIPIENT hRecip,
	cose_errback* perr);
HCOSE_RECIPIENT COSE_Enveloped_GetRecipient(HCOSE_ENVELOPED cose,
	int iRecipient,
	cose_errback* perr);

bool COSE_Enveloped_AddCounterSigner(HCOSE_ENCRYPT hEnv,
	HCOSE_COUNTERSIGN hSign,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Enveloped_GetCounterSigner(HCOSE_ENCRYPT,
	int iSigner,
	cose_errback* perr);

/*
 */

HCOSE_RECIPIENT COSE_Recipient_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perror);
bool COSE_Recipient_Free(HCOSE_RECIPIENT cose);
HCOSE_RECIPIENT COSE_Recipient_from_shared_secret(byte* rgbKey,
	int cbKey,
	byte* rgbKid,
	int cbKid,
	CBOR_CONTEXT_COMMA cose_errback* perr);

bool COSE_Recipient_SetKey_secret(HCOSE_RECIPIENT h,
	const byte* rgb,
	int cb,
	const byte* rgbKid,
	int cbKid,
	cose_errback* perr);
bool COSE_Recipient_SetKey(HCOSE_RECIPIENT h,
	const cn_cbor* pKey,
	cose_errback* perror);
bool COSE_Recipient_SetSenderKey(HCOSE_RECIPIENT h,
	const cn_cbor* pKey,
	int destination,
	cose_errback* perror);
bool COSE_Recipient_SetExternal(HCOSE_RECIPIENT hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

bool COSE_Recipient_map_put_int(HCOSE_RECIPIENT h,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* perror);
cn_cbor* COSE_Recipient_map_get_string(HCOSE_RECIPIENT cose,
	const char* key,
	int flags,
	cose_errback* errp);
cn_cbor* COSE_Recipient_map_get_int(HCOSE_RECIPIENT cose,
	int key,
	int flags,
	cose_errback* errp);

bool COSE_Recipient_AddRecipient(HCOSE_RECIPIENT hMac,
	HCOSE_RECIPIENT hRecip,
	cose_errback* perr);
HCOSE_RECIPIENT COSE_Recipient_GetRecipient(HCOSE_RECIPIENT cose,
	int iRecipient,
	cose_errback* perr);

/*
 *  Encrypt message API
 */

HCOSE_ENCRYPT COSE_Encrypt_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Encrypt_Free(HCOSE_ENCRYPT cose);

cn_cbor* COSE_Encrypt_map_get_int(HCOSE_ENCRYPT cose,
	int key,
	int flags,
	cose_errback* errp);
cn_cbor* COSE_Encrypt_map_get_string(HCOSE_ENCRYPT cose,
	const char* key,
	int flags,
	cose_errback* errp);
bool COSE_Encrypt_map_put_int(HCOSE_ENCRYPT cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);
bool COSE_Encrypt_map_put_string(HCOSE_ENCRYPT cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_Encrypt_SetContent(HCOSE_ENCRYPT cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);
const byte* COSE_Encrypt_GetContent(HCOSE_ENCRYPT cose,
	size_t* pcbContent,
	cose_errback* errp);
bool COSE_Encrypt_SetExternal(HCOSE_ENCRYPT hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

bool COSE_Encrypt_encrypt(HCOSE_ENCRYPT cose,
	const byte* pbKey,
	size_t cbKey,
	cose_errback* perror);
bool COSE_Encrypt_decrypt(HCOSE_ENCRYPT,
	const byte* pbKey,
	size_t cbKey,
	cose_errback* perr);

HCOSE_ENCRYPT COSE_Encrypt_Init_From_Object(cn_cbor* cbor,
	CBOR_CONTEXT_COMMA cose_errback* perr);

//
//

HCOSE_MAC COSE_Mac_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Mac_Free(HCOSE_MAC cose);

bool COSE_Mac_SetContent(HCOSE_MAC cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);
bool COSE_Mac_SetExternal(HCOSE_MAC hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

cn_cbor* COSE_Mac_map_get_int(HCOSE_MAC h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_Mac_map_put_int(HCOSE_MAC cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_Mac_encrypt(HCOSE_MAC cose, cose_errback* perror);
bool COSE_Mac_validate(HCOSE_MAC, HCOSE_RECIPIENT, cose_errback* perr);

bool COSE_Mac_AddRecipient(HCOSE_MAC hMac,
	HCOSE_RECIPIENT hRecip,
	cose_errback* perr);
HCOSE_RECIPIENT COSE_Mac_GetRecipient(HCOSE_MAC cose,
	int iRecipient,
	cose_errback* perr);

//  MAC0 calls

HCOSE_MAC0 COSE_Mac0_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Mac0_Free(HCOSE_MAC0 cose);

bool COSE_Mac0_SetContent(HCOSE_MAC0 cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);
bool COSE_Mac0_SetExternal(HCOSE_MAC0 hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

cn_cbor* COSE_Mac0_map_get_int(HCOSE_MAC0 h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_Mac0_map_put_int(HCOSE_MAC0 cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_Mac0_encrypt(HCOSE_MAC0 cose,
	const byte* pbKey,
	size_t cbKey,
	cose_errback* perror);
bool COSE_Mac0_validate(HCOSE_MAC0,
	const byte* pbKey,
	size_t cbKey,
	cose_errback* perr);

//
//

HCOSE_SIGN COSE_Sign_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Sign_Free(HCOSE_SIGN cose);

bool COSE_Sign_SetContent(HCOSE_SIGN cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);

HCOSE_SIGNER COSE_Sign_add_signer(HCOSE_SIGN cose,
	const cn_cbor* pkey,
	int algId,
	cose_errback* perr);
bool COSE_Sign_AddSigner(HCOSE_SIGN hSign,
	HCOSE_SIGNER hSigner,
	cose_errback* perr);
bool COSE_Sign_Sign(HCOSE_SIGN h, cose_errback* perr);
HCOSE_SIGNER COSE_Sign_GetSigner(HCOSE_SIGN cose,
	int iSigner,
	cose_errback* perr);
bool COSE_Sign_validate(HCOSE_SIGN hSign,
	HCOSE_SIGNER hSigner,
	cose_errback* perr);
cn_cbor* COSE_Sign_map_get_int(HCOSE_SIGN h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_Sign_map_put_int(HCOSE_SIGN cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

HCOSE_SIGNER COSE_Signer_Init(CBOR_CONTEXT_COMMA cose_errback* perror);
bool COSE_Signer_Free(HCOSE_SIGNER cose);
bool COSE_Signer_SetKey(HCOSE_SIGNER hSigner,
	const cn_cbor* pkey,
	cose_errback* perr);
cn_cbor* COSE_Signer_map_get_int(HCOSE_SIGNER h,
	int key,
	int flags,
	cose_errback* perr);
bool COSE_Signer_map_put_int(HCOSE_SIGNER cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_Signer_SetExternal(HCOSE_SIGNER hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

/*
 *  Sign routines
 */

/*  allow use of the old names */
#define COSE_Sign0_Init COSE_Sign1_Init
#define COSE_Sign0_Free COSE_Sign1_Free

#define COSE_Sign0_SetContent COSE_Sign1_SetContent
#define COSE_Sign0_SetExternal COSE_Sign1_SetExternal

#define COSE_Sign0_Sign COSE_Sign1_Sign
#define COSE_Sign0_validate COSE_Sign1_validate
#define COSE_Sign0_map_get_int COSE_Sign1_map_get_int
#define COSE_Sign0_map_put_int COSE_Sign1_map_put_int

HCOSE_SIGN1 COSE_Sign1_Init(COSE_INIT_FLAGS flags,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_Sign1_Free(HCOSE_SIGN1 cose);

bool COSE_Sign1_SetContent(HCOSE_SIGN1 cose,
	const byte* rgbContent,
	size_t cbContent,
	cose_errback* errp);
bool COSE_Sign1_SetExternal(HCOSE_SIGN1 hcose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);

bool COSE_Sign1_Sign(HCOSE_SIGN1 h, const cn_cbor* pkey, cose_errback* perr);
bool COSE_Sign1_validate(HCOSE_SIGN1 hSign,
	const cn_cbor* pkey,
	cose_errback* perr);
cn_cbor* COSE_Sign1_map_get_int(HCOSE_SIGN1 h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_Sign1_map_put_int(HCOSE_SIGN1 cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

/*
 * Counter Signature Routines
 */

HCOSE_COUNTERSIGN COSE_CounterSign_Init(
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_CounterSign_Free(HCOSE_COUNTERSIGN cose);

cn_cbor* COSE_CounterSign_map_get_int(HCOSE_COUNTERSIGN h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_CounterSign_map_put_int(HCOSE_COUNTERSIGN cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_CounterSign_SetExternal(HCOSE_COUNTERSIGN cose, const byte* pbExternalData, size_t cbExternalData, cose_errback* perr);
bool COSE_CounterSign_SetKey(HCOSE_COUNTERSIGN,
	const cn_cbor* pkey,
	cose_errback* perr);

	
HCOSE_COUNTERSIGN COSE_Signer_add_countersignature(HCOSE_SIGNER hSigner, HCOSE_COUNTERSIGN hCountersignature, cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Signer_get_countersignature(HCOSE_SIGNER hSigner,
	int index,
	cose_errback* perr);
bool COSE_Signer_CounterSign_validate(HCOSE_SIGNER hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Sign_add_countersignature(HCOSE_SIGN hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Sign_get_countersignature(HCOSE_SIGN hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Sign_CounterSign_validate(HCOSE_SIGN hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Sign1_add_countersignature(HCOSE_SIGN1 hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Sign1_get_countersignature(HCOSE_SIGN1 hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Sign1_CounterSign_validate(HCOSE_SIGN1 hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Encrypt0_add_countersignature(HCOSE_ENCRYPT hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Encrypt0_get_countersignature(HCOSE_ENCRYPT hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Encrypt0_CounterSign_validate(HCOSE_ENCRYPT hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Enveloped_add_countersignature(HCOSE_ENVELOPED hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Enveloped_get_countersignature(HCOSE_ENVELOPED hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Enveloped_CounterSign_validate(HCOSE_ENVELOPED hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Recipient_add_countersignature(HCOSE_RECIPIENT hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Recipient_get_countersignature(HCOSE_RECIPIENT hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Recipient_CounterSign_validate(HCOSE_RECIPIENT hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Mac0_add_countersignature(HCOSE_MAC0 hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Mac0_get_countersignature(HCOSE_MAC0 hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Mac0_CounterSign_validate(HCOSE_MAC0 hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);

HCOSE_COUNTERSIGN COSE_Mac_add_countersignature(HCOSE_MAC hSignMsg,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Mac_get_countersignature(HCOSE_MAC hSignMsg,
	int index,
	cose_errback* perr);
bool COSE_Mac_CounterSign_validate(HCOSE_MAC hSigner,
	HCOSE_COUNTERSIGN hCountersignature,
	cose_errback* perr);
	
	/*
 */

cn_cbor* cn_cbor_clone(const cn_cbor* pIn,
	CBOR_CONTEXT_COMMA cn_cbor_errback* perr);
cn_cbor* cn_cbor_tag_create(int tag,
	cn_cbor* child,
	CBOR_CONTEXT_COMMA cn_cbor_errback* perr);
cn_cbor* cn_cbor_bool_create(int boolValue,
	CBOR_CONTEXT_COMMA cn_cbor_errback* errp);
cn_cbor* cn_cbor_null_create(CBOR_CONTEXT_COMMA cn_cbor_errback* errp);

#ifdef __cplusplus
}
#endif
