42static const uint8_t
rcon[10] = {
43 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
57# define ROT(x, s) (((x) >> (s)) | ((x) << (32-(s))))
59# define ROT(x, s) (((x) << (s)) | ((x) >> (32-(s))))
85 unsigned char *s1_dst = (
unsigned char*)s0[0].u8 + 3 -
s;
86 const unsigned char *s1_src = s1_dst +
sizeof(*s0);
87 unsigned char *s3_dst = (
unsigned char*)s0[0].u8 +
s + 1;
88 const unsigned char *s3_src = s3_dst +
sizeof(*s0);
90 s0[0].
u8[ 0] =
box[s0[1].
u8[ 0]];
91 s0[0].
u8[ 4] =
box[s0[1].
u8[ 4]];
92 s0[0].
u8[ 8] =
box[s0[1].
u8[ 8]];
93 s0[0].
u8[12] =
box[s0[1].
u8[12]];
94 s1_dst[ 0] =
box[s1_src[ 4]];
95 s1_dst[ 4] =
box[s1_src[ 8]];
96 s1_dst[ 8] =
box[s1_src[12]];
97 s1_dst[12] =
box[s1_src[ 0]];
98 s0[0].
u8[ 2] =
box[s0[1].
u8[10]];
99 s0[0].
u8[10] =
box[s0[1].
u8[ 2]];
100 s0[0].
u8[ 6] =
box[s0[1].
u8[14]];
101 s0[0].
u8[14] =
box[s0[1].
u8[ 6]];
102 s3_dst[ 0] =
box[s3_src[12]];
103 s3_dst[12] =
box[s3_src[ 8]];
104 s3_dst[ 8] =
box[s3_src[ 4]];
105 s3_dst[ 4] =
box[s3_src[ 0]];
108static inline int mix_core(uint32_t multbl[][256],
int a,
int b,
int c,
int d)
111 return multbl[0][
a] ^
ROT(multbl[0][
b], 8) ^
ROT(multbl[0][
c], 16) ^
ROT(multbl[0][d], 24);
113 return multbl[0][
a] ^ multbl[1][
b] ^ multbl[2][
c] ^ multbl[3][d];
127 uint32_t multbl[][256])
131 for (
r =
a->rounds - 1;
r > 0;
r--) {
132 mix(
a->state, multbl, 3 -
s, 1 +
s);
133 addkey(&
a->state[1], &
a->state[0], &
a->round_key[
r]);
140 int count, uint8_t *iv,
int rounds)
156 int count, uint8_t *iv,
int rounds)
172 int count, uint8_t *iv,
int decrypt)
174 a->crypt(
a,
dst,
src, count, iv,
a->rounds);
178 const uint8_t *log8,
const uint8_t *alog8,
179 const uint8_t *sbox_arg)
183 for (
i = 0;
i < 256;
i++) {
188 k = alog8[x + log8[
c[0]]];
189 l = alog8[x + log8[
c[1]]];
190 m = alog8[x + log8[
c[2]]];
191 n = alog8[x + log8[
c[3]]];
194 tbl[1][
i] =
ROT(tbl[0][
i], 8);
195 tbl[2][
i] =
ROT(tbl[0][
i], 16);
196 tbl[3][
i] =
ROT(tbl[0][
i], 24);
210 for (
i = 0;
i < 255;
i++) {
211 alog8[
i] = alog8[
i + 255] = j;
217 for (
i = 0;
i < 256;
i++) {
218 j =
i ? alog8[255 - log8[
i]] : 0;
219 j ^= (j << 1) ^ (j << 2) ^ (j << 3) ^ (j << 4);
220 j = (j ^ (j >> 8) ^ 99) & 255;
233 int i, j, t, rconpointer = 0;
240#if ARCH_X86 && HAVE_X86ASM && HAVE_AESNI_EXTERNAL
249 memcpy(tk,
key, KC * 4);
250 memcpy(
a->round_key[0].u8,
key, KC * 4);
252 for (t = KC * 4; t < (
rounds + 1) * 16; t += KC * 4) {
253 for (
i = 0;
i < 4;
i++)
254 tk[0][
i] ^=
sbox[tk[KC - 1][(
i + 1) & 3]];
255 tk[0][0] ^=
rcon[rconpointer++];
257 for (j = 1; j < KC; j++) {
258 if (KC != 8 || j != KC >> 1)
259 for (
i = 0;
i < 4;
i++)
260 tk[j][
i] ^= tk[j - 1][
i];
262 for (
i = 0;
i < 4;
i++)
263 tk[j][
i] ^=
sbox[tk[j - 1][
i]];
266 memcpy((
unsigned char*)
a->round_key + t, tk, KC * 4);
272 tmp[2] =
a->round_key[
i];
275 a->round_key[
i] =
tmp[0];
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
void ff_init_aes_x86(AVAES *a, int decrypt)
#define i(width, name, range_min, range_max)
static struct @346255127015250356166251341105367306144006377143 state
static av_unused double box(double x, const double *params)
struct AVAES * av_aes_alloc(void)
Allocate an AVAES context.
int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt)
Initialize an AVAES context.
void av_aes_crypt(AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt)
Encrypt or decrypt a buffer using a previously initialized context.
static const uint8_t rcon[10]
static void aes_decrypt(AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int rounds)
static void aes_encrypt(AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int rounds)
static uint32_t dec_multbl[4][256]
static AVOnce aes_static_init
static void aes_crypt(AVAES *a, int s, const uint8_t *sbox_arg, uint32_t multbl[][256])
static uint8_t inv_sbox[256]
static void subshift(av_aes_block s0[2], int s, const uint8_t *box)
static int mix_core(uint32_t multbl[][256], int a, int b, int c, int d)
static void addkey_s(av_aes_block *dst, const uint8_t *src, const av_aes_block *round_key)
static void addkey(av_aes_block *dst, const av_aes_block *src, const av_aes_block *round_key)
static void addkey_d(uint8_t *dst, const av_aes_block *src, const av_aes_block *round_key)
static uint32_t enc_multbl[4][256]
static av_cold void aes_init_static(void)
static void mix(av_aes_block state[2], uint32_t multbl[][256], int s1, int s3)
static void init_multbl2(uint32_t tbl[][256], const int c[4], const uint8_t *log8, const uint8_t *alog8, const uint8_t *sbox_arg)
Macro definitions for various function/variable attributes.
static int ff_thread_once(char *control, void(*routine)(void))
Utility Preprocessor macros.
#define FFSWAP(type, a, b)
#define MKTAG(a, b, c, d)
#define MKBETAG(a, b, c, d)
Memory handling functions.
av_aes_block round_key[15]