#pragma once

#include <cose/cose.h>
#include <stdbool.h>
#include "cose_int.h"

/**
 * Perform an AES-CCM Decryption operation
 *
 * @param[in]   COSE_Enveloped Pointer to COSE Encryption context object
 * @param[in]   int          Size of the Tag value to be create
 * @param[in]   int          Size of the Message Length field
 * @param[in]   byte *       Pointer to authenticated data structure
 * @param[in]   int          Size of authenticated data structure
 * @return                   Did the function succeed?
 */
bool AES_CCM_Decrypt(COSE_Enveloped* pcose,
	int TSize,
	int LSize,
	const byte* pbKey,
	size_t cbitKey,
	const byte* pbCrypto,
	size_t cbCrypto,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_GCM_Decrypt(COSE_Enveloped* pcose,
	const byte* pbKey,
	size_t cbKey,
	const byte* pbCrypto,
	size_t cbCrypto,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_KW_Decrypt(COSE_Enveloped* pcose,
	const byte* pbKeyIn,
	size_t cbitKey,
	const byte* pbCipherText,
	size_t cbCipherText,
	byte* pbKeyOut,
	int* pcbKeyOut,
	cose_errback* perr);

/**
 * Perform an AES-CCM Encryption operation
 *
 * @param[in]   COSE_Enveloped Pointer to COSE Encryption context object
 * @param[in]   int          Size of the Tag value to be create
 * @param[in]   int          Size of the Message Length field
 * @param[in]   byte *       Pointer to authenticated data structure
 * @param[in]   int          Size of authenticated data structure
 * @return                   Did the function succeed?
 */
bool AES_CCM_Encrypt(COSE_Enveloped* pcose,
	int TSize,
	int LSize,
	const byte* pbKey,
	size_t cbKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_GCM_Encrypt(COSE_Enveloped* pcose,
	const byte* pbKey,
	size_t cbKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_KW_Encrypt(COSE_RecipientInfo* pcose,
	const byte* pbKeyIn,
	int cbitKey,
	const byte* pbContent,
	int cbContent,
	cose_errback* perr);

bool AES_CMAC_Validate(COSE_MacMessage* pcose,
	int KeySize,
	int TagSize,
	const byte* pbKey,
	int cbitKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_CBC_MAC_Create(COSE_MacMessage* pcose,
	int TagSize,
	const byte* pbKey,
	size_t cbKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool AES_CBC_MAC_Validate(COSE_MacMessage* pcose,
	int TagSize,
	const byte* pbKey,
	size_t cbitKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);

/**
 * Perform an HMAC Creation operation
 *
 * @param[in]	COSE_Enveloped	Pointer to COSE Encryption context object
 * @param[in]	int				Hash function to be used
 * @param[in]	int				Size of Tag value to be created
 * @param[in]	byte *			Pointer to authenticated data structure
 * @param[in]	int				Size of authenticated data structure
 * @param[in]	cose_errback *	Error return location
 * @return						Did the function succeed?
 */
bool HMAC_Create(COSE_MacMessage* pcose,
	int HSize,
	int TSize,
	const byte* pbKey,
	size_t cbKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);
bool HMAC_Validate(COSE_MacMessage* pcose,
	int HSize,
	int TSize,
	const byte* pbKey,
	size_t cbitKey,
	const byte* pbAuthData,
	size_t cbAuthData,
	cose_errback* perr);

bool HKDF_Extract(COSE* pcose,
	const byte* pbKey,
	size_t cbKey,
	size_t cbitDigest,
	byte* rgbDigest,
	size_t* pcbDigest,
	CBOR_CONTEXT_COMMA cose_errback* perr);
bool HKDF_Expand(COSE* pcose,
	size_t cbitDigest,
	const byte* pbPRK,
	size_t cbPRK,
	const byte* pbInfo,
	size_t cbInfo,
	byte* pbOutput,
	size_t cbOutput,
	cose_errback* perr);

bool HKDF_AES_Expand(COSE* pcose,
	size_t cbitKey,
	const byte* pbPRK,
	size_t cbPRK,
	const byte* pbInfo,
	size_t cbInfo,
	byte* pbOutput,
	size_t cbOutput,
	cose_errback* perr);

/**
 * Perform a signature operation
 *
 * @param[in]	COSE_SignerInfo Pointer to COSE SignerInfo context object
 * @param[in]	byte *			Pointer to text to be signed
 * @param[in]	size_t			size of text to be signed
 * @param[in]	cose_errback *	Error return location
 * @return						Did the function succeed?
 */
bool ECDSA_Sign(COSE* pSigner,
	int index,
	const cn_cbor* pKey,
	int cbitsDigest,
	const byte* rgbToSign,
	size_t cbToSign,
	cose_errback* perr);
bool ECDSA_Verify(COSE* pSigner,
	int index,
	const cn_cbor* pKey,
	int cbitsDigest,
	const byte* rgbToSign,
	size_t cbToSign,
	cose_errback* perr);

bool ECDH_ComputeSecret(COSE* pReciient,
	cn_cbor** ppKeyMe,
	const cn_cbor* pKeyYou,
	byte** ppbSecret,
	size_t* pcbSecret,
	CBOR_CONTEXT_COMMA cose_errback* perr);

bool EdDSA_Sign(COSE* pSigner,
	int index,
	const cn_cbor* pKey,
	const byte* rgbToSign,
	size_t cbToSign,
	cose_errback* perr);
bool EdDSA_Verify(COSE* pSigner,
	int index,
	const cn_cbor* pKey,
	const byte* rgbToSign,
	size_t cbToSign,
	cose_errback* perr);

/**
 *  Generate random bytes in a buffer
 *
 * @param[in]   byte *      Pointer to buffer to be filled
 * @param[in]   size_t      Size of buffer to be filled
 * @return                  none
 */
void rand_bytes(byte* pb, size_t cb);
