#pragma once

#include <stdbool.h>
#include <cn-cbor/cn-cbor.h>
#include "cose/cose_configure.h"
#ifdef COSE_C_USE_OPENSSL
#include <openssl/evp.h>
#endif

#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;
typedef struct _cose_key* HCOSE_KEY;

/**
 * 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,
	/** Compressed points are not supported */
	COSE_ERR_NO_COMPRESSED_POINTS
} 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_CounterSign1 = 9,

	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;

/*
 * Functions dealing with keys
 */

HCOSE_KEY COSE_KEY_FromCbor(cn_cbor* pcborKey,
	CBOR_CONTEXT_COMMA cose_errback* perror);
bool COSE_KEY_Free(HCOSE_KEY h);
#ifdef COSE_C_USE_OPENSSL
HCOSE_KEY COSE_KEY_FromEVP(EVP_PKEY* opensslKey,
	cn_cbor* pcborKey,
	CBOR_CONTEXT_COMMA cose_errback* perror);
#endif

/*
 *  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);

bool COSE_Enveloped_AddCounterSigner1(HCOSE_ENCRYPT hEnv,
	HCOSE_COUNTERSIGN1 hSign,
	cose_errback* perr);
HCOSE_COUNTERSIGN COSE_Enveloped_GetCounterSigner1(HCOSE_ENCRYPT,
	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_SetKey2(HCOSE_RECIPIENT h,
	HCOSE_KEY hKey,
	cose_errback* perror);

bool COSE_Recipient_SetSenderKey(HCOSE_RECIPIENT h,
	const cn_cbor* pKey,
	int destination,
	cose_errback* perror);
bool COSE_Recipient_SetSenderKey2(HCOSE_RECIPIENT h,
	HCOSE_KEY hKey,
	int destintion,
	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);
bool COSE_Signer_SetKey2(HCOSE_SIGNER hSigner,
	HCOSE_KEY 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_Sign2(HCOSE_SIGN1 h, HCOSE_KEY pkey, cose_errback* perr);
bool COSE_Sign1_validate(HCOSE_SIGN1 hSign,
	const cn_cbor* pkey,
	cose_errback* perr);
bool COSE_Sign1_validate2(HCOSE_SIGN1 hSign,
	HCOSE_KEY 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);
bool COSE_CounterSign_SetKey2(HCOSE_COUNTERSIGN,
	HCOSE_KEY pkey,
	cose_errback* perr);

/*
 * CounterSignature1 Routines
 */

HCOSE_COUNTERSIGN1 COSE_CounterSign1_Init(
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool COSE_CounterSign1_Free(HCOSE_COUNTERSIGN1 cose);

cn_cbor* COSE_CounterSign1_map_get_int(HCOSE_COUNTERSIGN1 h,
	int key,
	int flags,
	cose_errback* perror);
bool COSE_CounterSign1_map_put_int(HCOSE_COUNTERSIGN1 cose,
	int key,
	cn_cbor* value,
	int flags,
	cose_errback* errp);

bool COSE_CounterSign1_SetExternal(HCOSE_COUNTERSIGN1 cose,
	const byte* pbExternalData,
	size_t cbExternalData,
	cose_errback* perr);
bool COSE_CounterSign1_SetKey(HCOSE_COUNTERSIGN1,
	HCOSE_KEY 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_COUNTERSIGN1 COSE_Signer_add_countersignature1(HCOSE_SIGNER hSigner,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Signer_get_countersignature1(HCOSE_SIGNER hSigner,
	cose_errback* perr);
bool COSE_Signer_CounterSign1_validate(HCOSE_SIGNER hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Sign_add_countersignature1(HCOSE_SIGN hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Sign_get_countersignature1(HCOSE_SIGN hSignMsg,
	cose_errback* perr);
bool COSE_Sign_CounterSign1_validate(HCOSE_SIGN hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Sign1_add_countersignature1(HCOSE_SIGN1 hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Sign1_get_countersignature1(HCOSE_SIGN1 hSignMsg,
	cose_errback* perr);
bool COSE_Sign1_CounterSign1_validate(HCOSE_SIGN1 hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Encrypt0_add_countersignature1(HCOSE_ENCRYPT hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Encrypt0_get_countersignature1(HCOSE_ENCRYPT hSignMsg,
	cose_errback* perr);
bool COSE_Encrypt0_CounterSign1_validate(HCOSE_ENCRYPT hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Enveloped_add_countersignature1(
	HCOSE_ENVELOPED hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Enveloped_get_countersignature1(
	HCOSE_ENVELOPED hSignMsg,
	cose_errback* perr);
bool COSE_Enveloped_CounterSign1_validate(HCOSE_ENVELOPED hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Recipient_add_countersignature1(
	HCOSE_RECIPIENT hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Recipient_get_countersignature1(
	HCOSE_RECIPIENT hSignMsg,
	cose_errback* perr);
bool COSE_Recipient_CounterSign1_validate(HCOSE_RECIPIENT hSigner,
	HCOSE_COUNTERSIGN1 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_COUNTERSIGN1 COSE_Mac0_add_countersignature1(HCOSE_MAC0 hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Mac0_get_countersignature1(HCOSE_MAC0 hSignMsg,
	cose_errback* perr);
bool COSE_Mac0_CounterSign1_validate(HCOSE_MAC0 hSigner,
	HCOSE_COUNTERSIGN1 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);

HCOSE_COUNTERSIGN1 COSE_Mac_add_countersignature1(HCOSE_MAC hSignMsg,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);
HCOSE_COUNTERSIGN1 COSE_Mac_get_countersignature1(HCOSE_MAC hSignMsg,
	cose_errback* perr);
bool COSE_Mac_CounterSign1_validate(HCOSE_MAC hSigner,
	HCOSE_COUNTERSIGN1 hCountersignature,
	cose_errback* perr);

/*
 */

cn_cbor* cn_cbor_clone(const cn_cbor* pIn,
	CBOR_CONTEXT_COMMA cn_cbor_errback* perr);
#ifndef CN_CBOR_VERSION
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);
#endif

#ifdef __cplusplus
}
#endif
