aboutsummaryrefslogtreecommitdiffstats
path: root/libavutil/aes.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-07-04 00:34:44 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-07-04 00:45:21 +0200
commit976a8b217986fecdbe1fdcaa3e14ce9c3c92eb25 (patch)
treed31a42173318b29419733ec4634c1f6f07cdce6c /libavutil/aes.c
parent2a375bb400febf8c1a2dfa87c29fd4185663454c (diff)
parent556f8a066cb33241bf29e85d7e24c9acf7ea9043 (diff)
downloadffmpeg-976a8b217986fecdbe1fdcaa3e14ce9c3c92eb25.tar.gz
Merge remote-tracking branch 'qatar/master'
* qatar/master: (40 commits) H.264: template left MB handling H.264: faster fill_decode_caches H.264: faster write_back_* H.264: faster fill_filter_caches H.264: make filter_mb_fast support the case of unavailable top mb Do not include log.h in avutil.h Do not include pixfmt.h in avutil.h Do not include rational.h in avutil.h Do not include mathematics.h in avutil.h Do not include intfloat_readwrite.h in avutil.h Remove return statements following infinite loops without break RTSP: Doxygen comment cleanup doxygen: Escape '\' in Doxygen documentation. md5: cosmetics md5: use AV_WL32 to write result md5: add fate test md5: include correct headers md5: fix test program doxygen: Drop array size declarations from Doxygen parameter names. doxygen: Fix parameter names to match the function prototypes. ... Conflicts: libavcodec/x86/dsputil_mmx.c libavformat/flvenc.c libavformat/oggenc.c libavformat/wtv.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil/aes.c')
-rw-r--r--libavutil/aes.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/libavutil/aes.c b/libavutil/aes.c
index 83c07696fd..7c92a2757f 100644
--- a/libavutil/aes.c
+++ b/libavutil/aes.c
@@ -54,6 +54,12 @@ static uint32_t enc_multbl[4][256];
static uint32_t dec_multbl[4][256];
#endif
+#if HAVE_BIGENDIAN
+# define ROT(x, s) ((x >> s) | (x << (32-s)))
+#else
+# define ROT(x, s) ((x << s) | (x >> (32-s)))
+#endif
+
static inline void addkey(av_aes_block *dst, const av_aes_block *src,
const av_aes_block *round_key)
{
@@ -86,7 +92,6 @@ static void subshift(av_aes_block s0[2], int s, const uint8_t *box)
static inline int mix_core(uint32_t multbl[][256], int a, int b, int c, int d){
#if CONFIG_SMALL
-#define ROT(x,s) ((x<<s)|(x>>(32-s)))
return multbl[0][a] ^ ROT(multbl[0][b], 8) ^ ROT(multbl[0][c], 16) ^ ROT(multbl[0][d], 24);
#else
return multbl[0][a] ^ multbl[1][b] ^ multbl[2][c] ^ multbl[3][d];
@@ -127,7 +132,7 @@ void av_aes_crypt(AVAES *a, uint8_t *dst_, const uint8_t *src_,
crypt(a, 0, inv_sbox, dec_multbl);
if (iv) {
addkey(&a->state[0], &a->state[0], iv);
- memcpy(iv, src, 16);
+ *iv = *src;
}
addkey(dst, &a->state[0], &a->round_key[0]);
} else {
@@ -136,29 +141,36 @@ void av_aes_crypt(AVAES *a, uint8_t *dst_, const uint8_t *src_,
crypt(a, 2, sbox, enc_multbl);
addkey(dst, &a->state[0], &a->round_key[0]);
if (iv)
- memcpy(iv, dst, 16);
+ *iv = *dst;
}
src++;
dst++;
}
}
-static void init_multbl2(uint8_t tbl[1024], const int c[4],
+static void init_multbl2(uint32_t tbl[][256], const int c[4],
const uint8_t *log8, const uint8_t *alog8,
const uint8_t *sbox)
{
- int i, j;
-
- for (i = 0; i < 1024; i++) {
- int x = sbox[i >> 2];
- if (x)
- tbl[i] = alog8[log8[x] + log8[c[i & 3]]];
- }
+ int i;
+
+ for (i = 0; i < 256; i++) {
+ int x = sbox[i];
+ if (x) {
+ int k, l, m, n;
+ x = log8[x];
+ k = alog8[x + log8[c[0]]];
+ l = alog8[x + log8[c[1]]];
+ m = alog8[x + log8[c[2]]];
+ n = alog8[x + log8[c[3]]];
+ tbl[0][i] = AV_NE(MKBETAG(k,l,m,n), MKTAG(k,l,m,n));
#if !CONFIG_SMALL
- for (j = 256; j < 1024; j++)
- for (i = 0; i < 4; i++)
- tbl[4*j + i] = tbl[4*j + ((i - 1) & 3) - 1024];
+ tbl[1][i] = ROT(tbl[0][i], 8);
+ tbl[2][i] = ROT(tbl[0][i], 16);
+ tbl[3][i] = ROT(tbl[0][i], 24);
#endif
+ }
+ }
}
// this is based on the reference AES code by Paulo Barreto and Vincent Rijmen
@@ -187,9 +199,9 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt)
inv_sbox[j] = i;
sbox[i] = j;
}
- init_multbl2(dec_multbl[0], (const int[4]) { 0xe, 0x9, 0xd, 0xb },
+ init_multbl2(dec_multbl, (const int[4]) { 0xe, 0x9, 0xd, 0xb },
log8, alog8, inv_sbox);
- init_multbl2(enc_multbl[0], (const int[4]) { 0x2, 0x1, 0x1, 0x3 },
+ init_multbl2(enc_multbl, (const int[4]) { 0x2, 0x1, 0x1, 0x3 },
log8, alog8, sbox);
}
@@ -221,15 +233,14 @@ int av_aes_init(AVAES *a, const uint8_t *key, int key_bits, int decrypt)
if (decrypt) {
for (i = 1; i < rounds; i++) {
av_aes_block tmp[3];
- memcpy(&tmp[2], &a->round_key[i], 16);
+ tmp[2] = a->round_key[i];
subshift(&tmp[1], 0, sbox);
mix(tmp, dec_multbl, 1, 3);
- memcpy(&a->round_key[i], &tmp[0], 16);
+ a->round_key[i] = tmp[0];
}
} else {
for (i = 0; i < (rounds + 1) >> 1; i++) {
- for (j = 0; j < 16; j++)
- FFSWAP(int, a->round_key[i].u8[j], a->round_key[rounds-i].u8[j]);
+ FFSWAP(av_aes_block, a->round_key[i], a->round_key[rounds-i]);
}
}