/*
 ---------------------------------------------------------------------------
 Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.

 LICENSE TERMS

 The redistribution and use of this software (with or without changes)
 is allowed without the payment of fees or royalties provided that:

  1. source code distributions include the above copyright notice, this
     list of conditions and the following disclaimer;

  2. binary distributions include the above copyright notice, this list
     of conditions and the following disclaimer in their documentation;

  3. the name of the copyright holder is not used to endorse products
     built using this software without specific written permission.

 DISCLAIMER

 This software is provided 'as is' with no explicit or implied warranties
 in respect of its properties, including, but not limited to, correctness
 and/or fitness for purpose.
 ---------------------------------------------------------------------------
 Issue 09/09/2006

 This is an AES implementation that uses only 8-bit byte operations on the
 cipher state (there are options to use 32-bit types if available).

 The combination of mix columns and byte substitution used here is based on
 that developed by Karl Malbrain. His contribution is acknowledged.
 */

/* define if you have a fast memcpy function on your system */
#if 1
#define HAVE_MEMCPY
#include <string.h>
#if 0
#if defined(_MSC_VER)
#include <intrin.h>
#pragma intrinsic(memcpy)
#endif
#endif
#endif

#include <stdlib.h>

/* add the target configuration to allow using internal data types and
 * compilation options */
#include "bt_target.h"

/* define if you have fast 32-bit types on your system */
#if 1
#define HAVE_UINT_32T
#endif

/* define if you don't want any tables */
#if 1
#define USE_TABLES
#endif

/*  On Intel Core 2 duo VERSION_1 is faster */

/* alternative versions (test for performance on your system) */
#if 1
#define VERSION_1
#endif

#include "aes.h"

#if defined(HAVE_UINT_32T)
typedef uint32_t uint_32t;
#endif

/* functions for finite field multiplication in the AES Galois field    */

#define WPOLY 0x011b
#define BPOLY 0x1b
#define DPOLY 0x008d

#define f1(x) (x)
#define f2(x) (((x) << 1) ^ ((((x) >> 7) & 1) * WPOLY))
#define f4(x) \
  (((x) << 2) ^ ((((x) >> 6) & 1) * WPOLY) ^ ((((x) >> 6) & 2) * WPOLY))
#define f8(x)                                                             \
  (((x) << 3) ^ ((((x) >> 5) & 1) * WPOLY) ^ ((((x) >> 5) & 2) * WPOLY) ^ \
   ((((x) >> 5) & 4) * WPOLY))
#define d2(x) (((x) >> 1) ^ ((x)&1 ? DPOLY : 0))

#define f3(x) (f2(x) ^ (x))
#define f9(x) (f8(x) ^ (x))
#define fb(x) (f8(x) ^ f2(x) ^ (x))
#define fd(x) (f8(x) ^ f4(x) ^ (x))
#define fe(x) (f8(x) ^ f4(x) ^ f2(x))

#if defined(USE_TABLES)

#define sb_data(w)                                                          \
  { /* S Box data values */                                                 \
    w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5), \
        w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab),      \
        w(0x76), w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59),      \
        w(0x47), w(0xf0), w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c),      \
        w(0xa4), w(0x72), w(0xc0), w(0xb7), w(0xfd), w(0x93), w(0x26),      \
        w(0x36), w(0x3f), w(0xf7), w(0xcc), w(0x34), w(0xa5), w(0xe5),      \
        w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), w(0x04), w(0xc7),      \
        w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), w(0x07),      \
        w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),      \
        w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a),      \
        w(0xa0), w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3),      \
        w(0x2f), w(0x84), w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20),      \
        w(0xfc), w(0xb1), w(0x5b), w(0x6a), w(0xcb), w(0xbe), w(0x39),      \
        w(0x4a), w(0x4c), w(0x58), w(0xcf), w(0xd0), w(0xef), w(0xaa),      \
        w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), w(0x45), w(0xf9),      \
        w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), w(0x51),      \
        w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),      \
        w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3),      \
        w(0xd2), w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97),      \
        w(0x44), w(0x17), w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64),      \
        w(0x5d), w(0x19), w(0x73), w(0x60), w(0x81), w(0x4f), w(0xdc),      \
        w(0x22), w(0x2a), w(0x90), w(0x88), w(0x46), w(0xee), w(0xb8),      \
        w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), w(0xe0), w(0x32),      \
        w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), w(0xc2),      \
        w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),      \
        w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e),      \
        w(0xa9), w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a),      \
        w(0xae), w(0x08), w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c),      \
        w(0xa6), w(0xb4), w(0xc6), w(0xe8), w(0xdd), w(0x74), w(0x1f),      \
        w(0x4b), w(0xbd), w(0x8b), w(0x8a), w(0x70), w(0x3e), w(0xb5),      \
        w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), w(0x61), w(0x35),      \
        w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), w(0xe1),      \
        w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),      \
        w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28),      \
        w(0xdf), w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6),      \
        w(0x42), w(0x68), w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0),      \
        w(0x54), w(0xbb), w(0x16)                                           \
  }

#define isb_data(w)                                                         \
  { /* inverse S Box data values */                                         \
    w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38), \
        w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7),      \
        w(0xfb), w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f),      \
        w(0xff), w(0x87), w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4),      \
        w(0xde), w(0xe9), w(0xcb), w(0x54), w(0x7b), w(0x94), w(0x32),      \
        w(0xa6), w(0xc2), w(0x23), w(0x3d), w(0xee), w(0x4c), w(0x95),      \
        w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), w(0x08), w(0x2e),      \
        w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), w(0x76),      \
        w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),      \
        w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98),      \
        w(0x16), w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65),      \
        w(0xb6), w(0x92), w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd),      \
        w(0xed), w(0xb9), w(0xda), w(0x5e), w(0x15), w(0x46), w(0x57),      \
        w(0xa7), w(0x8d), w(0x9d), w(0x84), w(0x90), w(0xd8), w(0xab),      \
        w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), w(0xf7), w(0xe4),      \
        w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), w(0xd0),      \
        w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),      \
        w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a),      \
        w(0x6b), w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67),      \
        w(0xdc), w(0xea), w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0),      \
        w(0xb4), w(0xe6), w(0x73), w(0x96), w(0xac), w(0x74), w(0x22),      \
        w(0xe7), w(0xad), w(0x35), w(0x85), w(0xe2), w(0xf9), w(0x37),      \
        w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), w(0x47), w(0xf1),      \
        w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), w(0x6f),      \
        w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),      \
        w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79),      \
        w(0x20), w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd),      \
        w(0x5a), w(0xf4), w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88),      \
        w(0x07), w(0xc7), w(0x31), w(0xb1), w(0x12), w(0x10), w(0x59),      \
        w(0x27), w(0x80), w(0xec), w(0x5f), w(0x60), w(0x51), w(0x7f),      \
        w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), w(0x2d), w(0xe5),      \
        w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), w(0xa0),      \
        w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),      \
        w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99),      \
        w(0x61), w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77),      \
        w(0xd6), w(0x26), w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55),      \
        w(0x21), w(0x0c), w(0x7d)                                           \
  }

#define mm_data(w)                                                          \
  { /* basic data for forming finite field tables */                        \
    w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07), \
        w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e),      \
        w(0x0f), w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15),      \
        w(0x16), w(0x17), w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c),      \
        w(0x1d), w(0x1e), w(0x1f), w(0x20), w(0x21), w(0x22), w(0x23),      \
        w(0x24), w(0x25), w(0x26), w(0x27), w(0x28), w(0x29), w(0x2a),      \
        w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f), w(0x30), w(0x31),      \
        w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37), w(0x38),      \
        w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),      \
        w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46),      \
        w(0x47), w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d),      \
        w(0x4e), w(0x4f), w(0x50), w(0x51), w(0x52), w(0x53), w(0x54),      \
        w(0x55), w(0x56), w(0x57), w(0x58), w(0x59), w(0x5a), w(0x5b),      \
        w(0x5c), w(0x5d), w(0x5e), w(0x5f), w(0x60), w(0x61), w(0x62),      \
        w(0x63), w(0x64), w(0x65), w(0x66), w(0x67), w(0x68), w(0x69),      \
        w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f), w(0x70),      \
        w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),      \
        w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e),      \
        w(0x7f), w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85),      \
        w(0x86), w(0x87), w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c),      \
        w(0x8d), w(0x8e), w(0x8f), w(0x90), w(0x91), w(0x92), w(0x93),      \
        w(0x94), w(0x95), w(0x96), w(0x97), w(0x98), w(0x99), w(0x9a),      \
        w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f), w(0xa0), w(0xa1),      \
        w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7), w(0xa8),      \
        w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),      \
        w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6),      \
        w(0xb7), w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd),      \
        w(0xbe), w(0xbf), w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4),      \
        w(0xc5), w(0xc6), w(0xc7), w(0xc8), w(0xc9), w(0xca), w(0xcb),      \
        w(0xcc), w(0xcd), w(0xce), w(0xcf), w(0xd0), w(0xd1), w(0xd2),      \
        w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7), w(0xd8), w(0xd9),      \
        w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf), w(0xe0),      \
        w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),      \
        w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee),      \
        w(0xef), w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5),      \
        w(0xf6), w(0xf7), w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc),      \
        w(0xfd), w(0xfe), w(0xff)                                           \
  }

static const uint_8t sbox[256] = sb_data(f1);
static const uint_8t isbox[256] = isb_data(f1);

static const uint_8t gfm2_sbox[256] = sb_data(f2);
static const uint_8t gfm3_sbox[256] = sb_data(f3);

static const uint_8t gfmul_9[256] = mm_data(f9);
static const uint_8t gfmul_b[256] = mm_data(fb);
static const uint_8t gfmul_d[256] = mm_data(fd);
static const uint_8t gfmul_e[256] = mm_data(fe);

#define s_box(x) sbox[(x)]
#define is_box(x) isbox[(x)]
#define gfm2_sb(x) gfm2_sbox[(x)]
#define gfm3_sb(x) gfm3_sbox[(x)]
#define gfm_9(x) gfmul_9[(x)]
#define gfm_b(x) gfmul_b[(x)]
#define gfm_d(x) gfmul_d[(x)]
#define gfm_e(x) gfmul_e[(x)]

#else

/* this is the high bit of x right shifted by 1 */
/* position. Since the starting polynomial has  */
/* 9 bits (0x11b), this right shift keeps the   */
/* values of all top bits within a byte         */

static uint_8t hibit(const uint_8t x) {
  uint_8t r = (uint_8t)((x >> 1) | (x >> 2));

  r |= (r >> 2);
  r |= (r >> 4);
  return (r + 1) >> 1;
}

/* return the inverse of the finite field element x */

static uint_8t gf_inv(const uint_8t x) {
  uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;

  if (x < 2) return x;

  for (;;) {
    if (n1)
      while (n2 >= n1) /* divide polynomial p2 by p1    */
      {
        n2 /= n1;               /* shift smaller polynomial left */
        p2 ^= (p1 * n2) & 0xff; /* and remove from larger one    */
        v2 ^= (v1 * n2);        /* shift accumulated value and   */
        n2 = hibit(p2);         /* add into result               */
      }
    else
      return v1;

    if (n2) /* repeat with values swapped    */
      while (n1 >= n2) {
        n1 /= n2;
        p1 ^= p2 * n1;
        v1 ^= v2 * n1;
        n1 = hibit(p1);
      }
    else
      return v2;
  }
}

/* The forward and inverse affine transformations used in the S-box */
uint_8t fwd_affine(const uint_8t x) {
#if defined(HAVE_UINT_32T)
  uint_32t w = x;
  w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);
  return 0x63 ^ ((w ^ (w >> 8)) & 0xff);
#else
  return 0x63 ^ x ^ (x << 1) ^ (x << 2) ^ (x << 3) ^ (x << 4) ^ (x >> 7) ^
         (x >> 6) ^ (x >> 5) ^ (x >> 4);
#endif
}

uint_8t inv_affine(const uint_8t x) {
#if defined(HAVE_UINT_32T)
  uint_32t w = x;
  w = (w << 1) ^ (w << 3) ^ (w << 6);
  return 0x05 ^ ((w ^ (w >> 8)) & 0xff);
#else
  return 0x05 ^ (x << 1) ^ (x << 3) ^ (x << 6) ^ (x >> 7) ^ (x >> 5) ^ (x >> 2);
#endif
}

#define s_box(x) fwd_affine(gf_inv(x))
#define is_box(x) gf_inv(inv_affine(x))
#define gfm2_sb(x) f2(s_box(x))
#define gfm3_sb(x) f3(s_box(x))
#define gfm_9(x) f9(x)
#define gfm_b(x) fb(x)
#define gfm_d(x) fd(x)
#define gfm_e(x) fe(x)

#endif

#if defined(HAVE_MEMCPY)
#define block_copy_nn(d, s, l) memcpy(d, s, l)
#define block_copy(d, s) memcpy(d, s, N_BLOCK)
#else
#define block_copy_nn(d, s, l) copy_block_nn(d, s, l)
#define block_copy(d, s) copy_block(d, s)
#endif

#if !defined(HAVE_MEMCPY)
static void copy_block(void* d, const void* s) {
#if defined(HAVE_UINT_32T)
  ((uint_32t*)d)[0] = ((uint_32t*)s)[0];
  ((uint_32t*)d)[1] = ((uint_32t*)s)[1];
  ((uint_32t*)d)[2] = ((uint_32t*)s)[2];
  ((uint_32t*)d)[3] = ((uint_32t*)s)[3];
#else
  ((uint_8t*)d)[0] = ((uint_8t*)s)[0];
  ((uint_8t*)d)[1] = ((uint_8t*)s)[1];
  ((uint_8t*)d)[2] = ((uint_8t*)s)[2];
  ((uint_8t*)d)[3] = ((uint_8t*)s)[3];
  ((uint_8t*)d)[4] = ((uint_8t*)s)[4];
  ((uint_8t*)d)[5] = ((uint_8t*)s)[5];
  ((uint_8t*)d)[6] = ((uint_8t*)s)[6];
  ((uint_8t*)d)[7] = ((uint_8t*)s)[7];
  ((uint_8t*)d)[8] = ((uint_8t*)s)[8];
  ((uint_8t*)d)[9] = ((uint_8t*)s)[9];
  ((uint_8t*)d)[10] = ((uint_8t*)s)[10];
  ((uint_8t*)d)[11] = ((uint_8t*)s)[11];
  ((uint_8t*)d)[12] = ((uint_8t*)s)[12];
  ((uint_8t*)d)[13] = ((uint_8t*)s)[13];
  ((uint_8t*)d)[14] = ((uint_8t*)s)[14];
  ((uint_8t*)d)[15] = ((uint_8t*)s)[15];
#endif
}

static void copy_block_nn(void* d, const void* s, uint_8t nn) {
  while (nn--) *((uint_8t*)d)++ = *((uint_8t*)s)++;
}
#endif

static void xor_block(void* d, const void* s) {
#if defined(HAVE_UINT_32T)
  ((uint_32t*)d)[0] ^= ((uint_32t*)s)[0];
  ((uint_32t*)d)[1] ^= ((uint_32t*)s)[1];
  ((uint_32t*)d)[2] ^= ((uint_32t*)s)[2];
  ((uint_32t*)d)[3] ^= ((uint_32t*)s)[3];
#else
  ((uint_8t*)d)[0] ^= ((uint_8t*)s)[0];
  ((uint_8t*)d)[1] ^= ((uint_8t*)s)[1];
  ((uint_8t*)d)[2] ^= ((uint_8t*)s)[2];
  ((uint_8t*)d)[3] ^= ((uint_8t*)s)[3];
  ((uint_8t*)d)[4] ^= ((uint_8t*)s)[4];
  ((uint_8t*)d)[5] ^= ((uint_8t*)s)[5];
  ((uint_8t*)d)[6] ^= ((uint_8t*)s)[6];
  ((uint_8t*)d)[7] ^= ((uint_8t*)s)[7];
  ((uint_8t*)d)[8] ^= ((uint_8t*)s)[8];
  ((uint_8t*)d)[9] ^= ((uint_8t*)s)[9];
  ((uint_8t*)d)[10] ^= ((uint_8t*)s)[10];
  ((uint_8t*)d)[11] ^= ((uint_8t*)s)[11];
  ((uint_8t*)d)[12] ^= ((uint_8t*)s)[12];
  ((uint_8t*)d)[13] ^= ((uint_8t*)s)[13];
  ((uint_8t*)d)[14] ^= ((uint_8t*)s)[14];
  ((uint_8t*)d)[15] ^= ((uint_8t*)s)[15];
#endif
}

static void copy_and_key(void* d, const void* s, const void* k) {
#if defined(HAVE_UINT_32T)
  ((uint_32t*)d)[0] = ((uint_32t*)s)[0] ^ ((uint_32t*)k)[0];
  ((uint_32t*)d)[1] = ((uint_32t*)s)[1] ^ ((uint_32t*)k)[1];
  ((uint_32t*)d)[2] = ((uint_32t*)s)[2] ^ ((uint_32t*)k)[2];
  ((uint_32t*)d)[3] = ((uint_32t*)s)[3] ^ ((uint_32t*)k)[3];
#elif 1
  ((uint_8t*)d)[0] = ((uint_8t*)s)[0] ^ ((uint_8t*)k)[0];
  ((uint_8t*)d)[1] = ((uint_8t*)s)[1] ^ ((uint_8t*)k)[1];
  ((uint_8t*)d)[2] = ((uint_8t*)s)[2] ^ ((uint_8t*)k)[2];
  ((uint_8t*)d)[3] = ((uint_8t*)s)[3] ^ ((uint_8t*)k)[3];
  ((uint_8t*)d)[4] = ((uint_8t*)s)[4] ^ ((uint_8t*)k)[4];
  ((uint_8t*)d)[5] = ((uint_8t*)s)[5] ^ ((uint_8t*)k)[5];
  ((uint_8t*)d)[6] = ((uint_8t*)s)[6] ^ ((uint_8t*)k)[6];
  ((uint_8t*)d)[7] = ((uint_8t*)s)[7] ^ ((uint_8t*)k)[7];
  ((uint_8t*)d)[8] = ((uint_8t*)s)[8] ^ ((uint_8t*)k)[8];
  ((uint_8t*)d)[9] = ((uint_8t*)s)[9] ^ ((uint_8t*)k)[9];
  ((uint_8t*)d)[10] = ((uint_8t*)s)[10] ^ ((uint_8t*)k)[10];
  ((uint_8t*)d)[11] = ((uint_8t*)s)[11] ^ ((uint_8t*)k)[11];
  ((uint_8t*)d)[12] = ((uint_8t*)s)[12] ^ ((uint_8t*)k)[12];
  ((uint_8t*)d)[13] = ((uint_8t*)s)[13] ^ ((uint_8t*)k)[13];
  ((uint_8t*)d)[14] = ((uint_8t*)s)[14] ^ ((uint_8t*)k)[14];
  ((uint_8t*)d)[15] = ((uint_8t*)s)[15] ^ ((uint_8t*)k)[15];
#else
  block_copy(d, s);
  xor_block(d, k);
#endif
}

static void add_round_key(uint_8t d[N_BLOCK], const uint_8t k[N_BLOCK]) {
  xor_block(d, k);
}

static void shift_sub_rows(uint_8t st[N_BLOCK]) {
  uint_8t tt;

  st[0] = s_box(st[0]);
  st[4] = s_box(st[4]);
  st[8] = s_box(st[8]);
  st[12] = s_box(st[12]);

  tt = st[1];
  st[1] = s_box(st[5]);
  st[5] = s_box(st[9]);
  st[9] = s_box(st[13]);
  st[13] = s_box(tt);

  tt = st[2];
  st[2] = s_box(st[10]);
  st[10] = s_box(tt);
  tt = st[6];
  st[6] = s_box(st[14]);
  st[14] = s_box(tt);

  tt = st[15];
  st[15] = s_box(st[11]);
  st[11] = s_box(st[7]);
  st[7] = s_box(st[3]);
  st[3] = s_box(tt);
}

static void inv_shift_sub_rows(uint_8t st[N_BLOCK]) {
  uint_8t tt;

  st[0] = is_box(st[0]);
  st[4] = is_box(st[4]);
  st[8] = is_box(st[8]);
  st[12] = is_box(st[12]);

  tt = st[13];
  st[13] = is_box(st[9]);
  st[9] = is_box(st[5]);
  st[5] = is_box(st[1]);
  st[1] = is_box(tt);

  tt = st[2];
  st[2] = is_box(st[10]);
  st[10] = is_box(tt);
  tt = st[6];
  st[6] = is_box(st[14]);
  st[14] = is_box(tt);

  tt = st[3];
  st[3] = is_box(st[7]);
  st[7] = is_box(st[11]);
  st[11] = is_box(st[15]);
  st[15] = is_box(tt);
}

#if defined(VERSION_1)
static void mix_sub_columns(uint_8t dt[N_BLOCK]) {
  uint_8t st[N_BLOCK];
  block_copy(st, dt);
#else
static void mix_sub_columns(uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK]) {
#endif
  dt[0] = gfm2_sb(st[0]) ^ gfm3_sb(st[5]) ^ s_box(st[10]) ^ s_box(st[15]);
  dt[1] = s_box(st[0]) ^ gfm2_sb(st[5]) ^ gfm3_sb(st[10]) ^ s_box(st[15]);
  dt[2] = s_box(st[0]) ^ s_box(st[5]) ^ gfm2_sb(st[10]) ^ gfm3_sb(st[15]);
  dt[3] = gfm3_sb(st[0]) ^ s_box(st[5]) ^ s_box(st[10]) ^ gfm2_sb(st[15]);

  dt[4] = gfm2_sb(st[4]) ^ gfm3_sb(st[9]) ^ s_box(st[14]) ^ s_box(st[3]);
  dt[5] = s_box(st[4]) ^ gfm2_sb(st[9]) ^ gfm3_sb(st[14]) ^ s_box(st[3]);
  dt[6] = s_box(st[4]) ^ s_box(st[9]) ^ gfm2_sb(st[14]) ^ gfm3_sb(st[3]);
  dt[7] = gfm3_sb(st[4]) ^ s_box(st[9]) ^ s_box(st[14]) ^ gfm2_sb(st[3]);

  dt[8] = gfm2_sb(st[8]) ^ gfm3_sb(st[13]) ^ s_box(st[2]) ^ s_box(st[7]);
  dt[9] = s_box(st[8]) ^ gfm2_sb(st[13]) ^ gfm3_sb(st[2]) ^ s_box(st[7]);
  dt[10] = s_box(st[8]) ^ s_box(st[13]) ^ gfm2_sb(st[2]) ^ gfm3_sb(st[7]);
  dt[11] = gfm3_sb(st[8]) ^ s_box(st[13]) ^ s_box(st[2]) ^ gfm2_sb(st[7]);

  dt[12] = gfm2_sb(st[12]) ^ gfm3_sb(st[1]) ^ s_box(st[6]) ^ s_box(st[11]);
  dt[13] = s_box(st[12]) ^ gfm2_sb(st[1]) ^ gfm3_sb(st[6]) ^ s_box(st[11]);
  dt[14] = s_box(st[12]) ^ s_box(st[1]) ^ gfm2_sb(st[6]) ^ gfm3_sb(st[11]);
  dt[15] = gfm3_sb(st[12]) ^ s_box(st[1]) ^ s_box(st[6]) ^ gfm2_sb(st[11]);
}

#if defined(VERSION_1)
static void inv_mix_sub_columns(uint_8t dt[N_BLOCK]) {
  uint_8t st[N_BLOCK];
  block_copy(st, dt);
#else
static void inv_mix_sub_columns(uint_8t dt[N_BLOCK], uint_8t st[N_BLOCK]) {
#endif
  dt[0] = is_box(gfm_e(st[0]) ^ gfm_b(st[1]) ^ gfm_d(st[2]) ^ gfm_9(st[3]));
  dt[5] = is_box(gfm_9(st[0]) ^ gfm_e(st[1]) ^ gfm_b(st[2]) ^ gfm_d(st[3]));
  dt[10] = is_box(gfm_d(st[0]) ^ gfm_9(st[1]) ^ gfm_e(st[2]) ^ gfm_b(st[3]));
  dt[15] = is_box(gfm_b(st[0]) ^ gfm_d(st[1]) ^ gfm_9(st[2]) ^ gfm_e(st[3]));

  dt[4] = is_box(gfm_e(st[4]) ^ gfm_b(st[5]) ^ gfm_d(st[6]) ^ gfm_9(st[7]));
  dt[9] = is_box(gfm_9(st[4]) ^ gfm_e(st[5]) ^ gfm_b(st[6]) ^ gfm_d(st[7]));
  dt[14] = is_box(gfm_d(st[4]) ^ gfm_9(st[5]) ^ gfm_e(st[6]) ^ gfm_b(st[7]));
  dt[3] = is_box(gfm_b(st[4]) ^ gfm_d(st[5]) ^ gfm_9(st[6]) ^ gfm_e(st[7]));

  dt[8] = is_box(gfm_e(st[8]) ^ gfm_b(st[9]) ^ gfm_d(st[10]) ^ gfm_9(st[11]));
  dt[13] = is_box(gfm_9(st[8]) ^ gfm_e(st[9]) ^ gfm_b(st[10]) ^ gfm_d(st[11]));
  dt[2] = is_box(gfm_d(st[8]) ^ gfm_9(st[9]) ^ gfm_e(st[10]) ^ gfm_b(st[11]));
  dt[7] = is_box(gfm_b(st[8]) ^ gfm_d(st[9]) ^ gfm_9(st[10]) ^ gfm_e(st[11]));

  dt[12] =
      is_box(gfm_e(st[12]) ^ gfm_b(st[13]) ^ gfm_d(st[14]) ^ gfm_9(st[15]));
  dt[1] = is_box(gfm_9(st[12]) ^ gfm_e(st[13]) ^ gfm_b(st[14]) ^ gfm_d(st[15]));
  dt[6] = is_box(gfm_d(st[12]) ^ gfm_9(st[13]) ^ gfm_e(st[14]) ^ gfm_b(st[15]));
  dt[11] =
      is_box(gfm_b(st[12]) ^ gfm_d(st[13]) ^ gfm_9(st[14]) ^ gfm_e(st[15]));
}

#if defined(AES_ENC_PREKEYED) || defined(AES_DEC_PREKEYED)

/*  Set the cipher key for the pre-keyed version */
/*  NOTE: If the length_type used for the key length is an
    unsigned 8-bit character, a key length of 256 bits must
    be entered as a length in bytes (valid inputs are hence
    128, 192, 16, 24 and 32).
*/

return_type aes_set_key(const unsigned char key[], length_type keylen,
                        aes_context ctx[1]) {
  uint_8t cc, rc, hi;

  switch (keylen) {
    case 16:
    case 128: /* length in bits (128 = 8*16) */
      keylen = 16;
      break;
    case 24:
    case 192: /* length in bits (192 = 8*24) */
      keylen = 24;
      break;
    case 32:
      /*    case 256:           length in bits (256 = 8*32) */
      keylen = 32;
      break;
    default:
      ctx->rnd = 0;
      return (return_type)-1;
  }
  block_copy_nn(ctx->ksch, key, keylen);
  hi = (keylen + 28) << 2;
  ctx->rnd = (hi >> 4) - 1;
  for (cc = keylen, rc = 1; cc < hi; cc += 4) {
    uint_8t tt, t0, t1, t2, t3;

    t0 = ctx->ksch[cc - 4];
    t1 = ctx->ksch[cc - 3];
    t2 = ctx->ksch[cc - 2];
    t3 = ctx->ksch[cc - 1];
    if (cc % keylen == 0) {
      tt = t0;
      t0 = s_box(t1) ^ rc;
      t1 = s_box(t2);
      t2 = s_box(t3);
      t3 = s_box(tt);
      rc = f2(rc);
    } else if (keylen > 24 && cc % keylen == 16) {
      t0 = s_box(t0);
      t1 = s_box(t1);
      t2 = s_box(t2);
      t3 = s_box(t3);
    }
    tt = cc - keylen;
    ctx->ksch[cc + 0] = ctx->ksch[tt + 0] ^ t0;
    ctx->ksch[cc + 1] = ctx->ksch[tt + 1] ^ t1;
    ctx->ksch[cc + 2] = ctx->ksch[tt + 2] ^ t2;
    ctx->ksch[cc + 3] = ctx->ksch[tt + 3] ^ t3;
  }
  return 0;
}

#endif

#if defined(AES_ENC_PREKEYED)

/*  Encrypt a single block of 16 bytes */

return_type aes_encrypt(const unsigned char in[N_BLOCK],
                        unsigned char out[N_BLOCK], const aes_context ctx[1]) {
  if (ctx->rnd) {
    uint_8t s1[N_BLOCK], r;
    copy_and_key(s1, in, ctx->ksch);

    for (r = 1; r < ctx->rnd; ++r)
#if defined(VERSION_1)
    {
      mix_sub_columns(s1);
      add_round_key(s1, ctx->ksch + r * N_BLOCK);
    }
#else
    {
      uint_8t s2[N_BLOCK];
      mix_sub_columns(s2, s1);
      copy_and_key(s1, s2, ctx->ksch + r * N_BLOCK);
    }
#endif
    shift_sub_rows(s1);
    copy_and_key(out, s1, ctx->ksch + r * N_BLOCK);
  } else
    return (return_type)-1;
  return 0;
}

/* CBC encrypt a number of blocks (input and return an IV) */

return_type aes_cbc_encrypt(const unsigned char* in, unsigned char* out,
                            int n_block, unsigned char iv[N_BLOCK],
                            const aes_context ctx[1]) {
  while (n_block--) {
    xor_block(iv, in);
    if (aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) return EXIT_FAILURE;
    memcpy(out, iv, N_BLOCK);
    in += N_BLOCK;
    out += N_BLOCK;
  }
  return EXIT_SUCCESS;
}

#endif

#if defined(AES_DEC_PREKEYED)

/*  Decrypt a single block of 16 bytes */

return_type aes_decrypt(const unsigned char in[N_BLOCK],
                        unsigned char out[N_BLOCK], const aes_context ctx[1]) {
  if (ctx->rnd) {
    uint_8t s1[N_BLOCK], r;
    copy_and_key(s1, in, ctx->ksch + ctx->rnd * N_BLOCK);
    inv_shift_sub_rows(s1);

    for (r = ctx->rnd; --r;)
#if defined(VERSION_1)
    {
      add_round_key(s1, ctx->ksch + r * N_BLOCK);
      inv_mix_sub_columns(s1);
    }
#else
    {
      uint_8t s2[N_BLOCK];
      copy_and_key(s2, s1, ctx->ksch + r * N_BLOCK);
      inv_mix_sub_columns(s1, s2);
    }
#endif
    copy_and_key(out, s1, ctx->ksch);
  } else
    return (return_type)-1;
  return 0;
}

/* CBC decrypt a number of blocks (input and return an IV) */

return_type aes_cbc_decrypt(const unsigned char* in, unsigned char* out,
                            int n_block, unsigned char iv[N_BLOCK],
                            const aes_context ctx[1]) {
  while (n_block--) {
    uint_8t tmp[N_BLOCK];

    memcpy(tmp, in, N_BLOCK);
    if (aes_decrypt(in, out, ctx) != EXIT_SUCCESS) return EXIT_FAILURE;
    xor_block(out, iv);
    memcpy(iv, tmp, N_BLOCK);
    in += N_BLOCK;
    out += N_BLOCK;
  }
  return EXIT_SUCCESS;
}

#endif

#if defined(AES_ENC_128_OTFK)

/*  The 'on the fly' encryption key update for for 128 bit keys */

static void update_encrypt_key_128(uint_8t k[N_BLOCK], uint_8t* rc) {
  uint_8t cc;

  k[0] ^= s_box(k[13]) ^ *rc;
  k[1] ^= s_box(k[14]);
  k[2] ^= s_box(k[15]);
  k[3] ^= s_box(k[12]);
  *rc = f2(*rc);

  for (cc = 4; cc < 16; cc += 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }
}

/*  Encrypt a single block of 16 bytes with 'on the fly' 128 bit keying */

void aes_encrypt_128(const unsigned char in[N_BLOCK],
                     unsigned char out[N_BLOCK],
                     const unsigned char key[N_BLOCK],
                     unsigned char o_key[N_BLOCK]) {
  uint_8t s1[N_BLOCK], r, rc = 1;

  if (o_key != key) block_copy(o_key, key);
  copy_and_key(s1, in, o_key);

  for (r = 1; r < 10; ++r)
#if defined(VERSION_1)
  {
    mix_sub_columns(s1);
    update_encrypt_key_128(o_key, &rc);
    add_round_key(s1, o_key);
  }
#else
  {
    uint_8t s2[N_BLOCK];
    mix_sub_columns(s2, s1);
    update_encrypt_key_128(o_key, &rc);
    copy_and_key(s1, s2, o_key);
  }
#endif

  shift_sub_rows(s1);
  update_encrypt_key_128(o_key, &rc);
  copy_and_key(out, s1, o_key);
}

#endif

#if defined(AES_DEC_128_OTFK)

/*  The 'on the fly' decryption key update for for 128 bit keys */

static void update_decrypt_key_128(uint_8t k[N_BLOCK], uint_8t* rc) {
  uint_8t cc;

  for (cc = 12; cc > 0; cc -= 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }
  *rc = d2(*rc);
  k[0] ^= s_box(k[13]) ^ *rc;
  k[1] ^= s_box(k[14]);
  k[2] ^= s_box(k[15]);
  k[3] ^= s_box(k[12]);
}

/*  Decrypt a single block of 16 bytes with 'on the fly' 128 bit keying */

void aes_decrypt_128(const unsigned char in[N_BLOCK],
                     unsigned char out[N_BLOCK],
                     const unsigned char key[N_BLOCK],
                     unsigned char o_key[N_BLOCK]) {
  uint_8t s1[N_BLOCK], r, rc = 0x6c;
  if (o_key != key) block_copy(o_key, key);

  copy_and_key(s1, in, o_key);
  inv_shift_sub_rows(s1);

  for (r = 10; --r;)
#if defined(VERSION_1)
  {
    update_decrypt_key_128(o_key, &rc);
    add_round_key(s1, o_key);
    inv_mix_sub_columns(s1);
  }
#else
  {
    uint_8t s2[N_BLOCK];
    update_decrypt_key_128(o_key, &rc);
    copy_and_key(s2, s1, o_key);
    inv_mix_sub_columns(s1, s2);
  }
#endif
  update_decrypt_key_128(o_key, &rc);
  copy_and_key(out, s1, o_key);
}

#endif

#if defined(AES_ENC_256_OTFK)

/*  The 'on the fly' encryption key update for for 256 bit keys */

static void update_encrypt_key_256(uint_8t k[2 * N_BLOCK], uint_8t* rc) {
  uint_8t cc;

  k[0] ^= s_box(k[29]) ^ *rc;
  k[1] ^= s_box(k[30]);
  k[2] ^= s_box(k[31]);
  k[3] ^= s_box(k[28]);
  *rc = f2(*rc);

  for (cc = 4; cc < 16; cc += 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }

  k[16] ^= s_box(k[12]);
  k[17] ^= s_box(k[13]);
  k[18] ^= s_box(k[14]);
  k[19] ^= s_box(k[15]);

  for (cc = 20; cc < 32; cc += 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }
}

/*  Encrypt a single block of 16 bytes with 'on the fly' 256 bit keying */

void aes_encrypt_256(const unsigned char in[N_BLOCK],
                     unsigned char out[N_BLOCK],
                     const unsigned char key[2 * N_BLOCK],
                     unsigned char o_key[2 * N_BLOCK]) {
  uint_8t s1[N_BLOCK], r, rc = 1;
  if (o_key != key) {
    block_copy(o_key, key);
    block_copy(o_key + 16, key + 16);
  }
  copy_and_key(s1, in, o_key);

  for (r = 1; r < 14; ++r)
#if defined(VERSION_1)
  {
    mix_sub_columns(s1);
    if (r & 1)
      add_round_key(s1, o_key + 16);
    else {
      update_encrypt_key_256(o_key, &rc);
      add_round_key(s1, o_key);
    }
  }
#else
  {
    uint_8t s2[N_BLOCK];
    mix_sub_columns(s2, s1);
    if (r & 1)
      copy_and_key(s1, s2, o_key + 16);
    else {
      update_encrypt_key_256(o_key, &rc);
      copy_and_key(s1, s2, o_key);
    }
  }
#endif

  shift_sub_rows(s1);
  update_encrypt_key_256(o_key, &rc);
  copy_and_key(out, s1, o_key);
}

#endif

#if defined(AES_DEC_256_OTFK)

/*  The 'on the fly' encryption key update for for 256 bit keys */

static void update_decrypt_key_256(uint_8t k[2 * N_BLOCK], uint_8t* rc) {
  uint_8t cc;

  for (cc = 28; cc > 16; cc -= 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }

  k[16] ^= s_box(k[12]);
  k[17] ^= s_box(k[13]);
  k[18] ^= s_box(k[14]);
  k[19] ^= s_box(k[15]);

  for (cc = 12; cc > 0; cc -= 4) {
    k[cc + 0] ^= k[cc - 4];
    k[cc + 1] ^= k[cc - 3];
    k[cc + 2] ^= k[cc - 2];
    k[cc + 3] ^= k[cc - 1];
  }

  *rc = d2(*rc);
  k[0] ^= s_box(k[29]) ^ *rc;
  k[1] ^= s_box(k[30]);
  k[2] ^= s_box(k[31]);
  k[3] ^= s_box(k[28]);
}

/*  Decrypt a single block of 16 bytes with 'on the fly'
    256 bit keying
*/
void aes_decrypt_256(const unsigned char in[N_BLOCK],
                     unsigned char out[N_BLOCK],
                     const unsigned char key[2 * N_BLOCK],
                     unsigned char o_key[2 * N_BLOCK]) {
  uint_8t s1[N_BLOCK], r, rc = 0x80;

  if (o_key != key) {
    block_copy(o_key, key);
    block_copy(o_key + 16, key + 16);
  }

  copy_and_key(s1, in, o_key);
  inv_shift_sub_rows(s1);

  for (r = 14; --r;)
#if defined(VERSION_1)
  {
    if ((r & 1)) {
      update_decrypt_key_256(o_key, &rc);
      add_round_key(s1, o_key + 16);
    } else
      add_round_key(s1, o_key);
    inv_mix_sub_columns(s1);
  }
#else
  {
    uint_8t s2[N_BLOCK];
    if ((r & 1)) {
      update_decrypt_key_256(o_key, &rc);
      copy_and_key(s2, s1, o_key + 16);
    } else
      copy_and_key(s2, s1, o_key);
    inv_mix_sub_columns(s1, s2);
  }
#endif
  copy_and_key(out, s1, o_key);
}

#endif
