#include <openssl/evp.h>
#include <openssl/engine.h>
ENGINE *e = ENGINE_by_id("qatengine");
ENGINE_init(e);
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
const EVP_CIPHER *cipher = EVP_aes_256_ccm();
unsigned char key[32]; // 256-bit key
unsigned char iv[12]; // IV length (7-13 bytes)
unsigned char tag[16]; // Authentication tag
// Initialize cipher
EVP_EncryptInit_ex(ctx, cipher, e, NULL, NULL);
// Set IV length
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, sizeof(iv), NULL);
// Set tag length
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, sizeof(tag), NULL);
// Set key and IV
EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv);
// Set plaintext length (required for CCM)
unsigned char plaintext[1024];
int plaintext_len = sizeof(plaintext);
EVP_EncryptUpdate(ctx, NULL, &outlen, NULL, plaintext_len);
// Optional: Add AAD
unsigned char aad[32];
EVP_EncryptUpdate(ctx, NULL, &outlen, aad, sizeof(aad));
// Encrypt
unsigned char ciphertext[1024];
EVP_EncryptUpdate(ctx, ciphertext, &outlen, plaintext, plaintext_len);
// Finalize
int tmplen;
EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen);
outlen += tmplen;
// Get tag
EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, sizeof(tag), tag);
EVP_CIPHER_CTX_free(ctx);