#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <inttypes.h>

char *m = "This is the message";
uint8_t key[32] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                   0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
                   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
                   0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};

uint8_t nonce[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

int main(int argc, char **argv)
{
  int mlen =strlen(m)+1; /* NULL byte termination */
  EVP_CIPHER_CTX e_ctx;
  //HMAC_CTX h_ctx;
  int clen;
  int flen;
  unsigned int mdlen;

  uint8_t c[mlen+EVP_MAX_BLOCK_LENGTH];
  uint8_t md[EVP_MAX_MD_SIZE];

  EVP_CIPHER_CTX_init(&e_ctx);
  EVP_EncryptInit_ex(&e_ctx, EVP_aes_256_cbc(), NULL, key, nonce);
  EVP_EncryptUpdate(&e_ctx, c, &clen, (uint8_t *)m, mlen);
  EVP_EncryptFinal_ex(&e_ctx, c+clen, &flen);
  EVP_CIPHER_CTX_cleanup(&e_ctx);
  clen += flen;

  HMAC(EVP_sha256(), key, 32, c, clen, md, &mdlen);

  /* Do something with the ciphertext and the auth tag */

  return 0;
}
  

