#ifndef ATCA_BASIC_AES_GCM_H_
#define ATCA_BASIC_AES_GCM_H_
#include "cryptoauthlib.h"
extern const char* atca_basic_aes_gcm_version;
typedef struct atca_aes_gcm_ctx
{
uint16_t key_id; uint8_t key_block; uint8_t cb[AES_DATA_SIZE]; uint32_t data_size; uint32_t aad_size; uint8_t h[AES_DATA_SIZE]; uint8_t j0[AES_DATA_SIZE]; uint8_t y[AES_DATA_SIZE]; uint8_t partial_aad[AES_DATA_SIZE]; uint32_t partial_aad_size; uint8_t enc_cb[AES_DATA_SIZE]; uint8_t ciphertext_block[AES_DATA_SIZE]; } atca_aes_gcm_ctx_t;
ATCA_STATUS atcab_aes_gcm_init(atca_aes_gcm_ctx_t* ctx, uint16_t key_id, uint8_t key_block, const uint8_t* iv, size_t iv_size);
ATCA_STATUS atcab_aes_gcm_init_rand(atca_aes_gcm_ctx_t* ctx, uint16_t key_id, uint8_t key_block, size_t rand_size,
const uint8_t* free_field, size_t free_field_size, uint8_t* iv);
ATCA_STATUS atcab_aes_gcm_aad_update(atca_aes_gcm_ctx_t* ctx, const uint8_t* aad, uint32_t aad_size);
ATCA_STATUS atcab_aes_gcm_encrypt_update(atca_aes_gcm_ctx_t* ctx, const uint8_t* plaintext, uint32_t plaintext_size, uint8_t* ciphertext);
ATCA_STATUS atcab_aes_gcm_encrypt_finish(atca_aes_gcm_ctx_t* ctx, uint8_t* tag, size_t tag_size);
ATCA_STATUS atcab_aes_gcm_decrypt_update(atca_aes_gcm_ctx_t* ctx, const uint8_t* ciphertext, uint32_t ciphertext_size, uint8_t* plaintext);
ATCA_STATUS atcab_aes_gcm_decrypt_finish(atca_aes_gcm_ctx_t* ctx, const uint8_t* tag, size_t tag_size, bool* is_verified);
#endif