diff options
author | Mans Rullgard <mans@mansr.com> | 2011-07-03 19:13:20 +0100 |
---|---|---|
committer | Mans Rullgard <mans@mansr.com> | 2011-07-04 11:07:15 +0100 |
commit | d04d9f24a0f1ff5d903a8222f6933a7482ddde19 (patch) | |
tree | bb4b0f00b1d096513721ffd6a2009d4c1507db0f /libavutil/aes.c | |
parent | 6c374bc0b40306c84e35a4002ab7fa96ace11c6c (diff) | |
download | ffmpeg-d04d9f24a0f1ff5d903a8222f6933a7482ddde19.tar.gz |
aes: allow unaligned input and output buffers
Signed-off-by: Mans Rullgard <mans@mansr.com>
Diffstat (limited to 'libavutil/aes.c')
-rw-r--r-- | libavutil/aes.c | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/libavutil/aes.c b/libavutil/aes.c index d1fe857914..ace317f38a 100644 --- a/libavutil/aes.c +++ b/libavutil/aes.c @@ -22,6 +22,7 @@ #include "common.h" #include "aes.h" +#include "intreadwrite.h" typedef union { uint64_t u64[2]; @@ -67,6 +68,20 @@ static inline void addkey(av_aes_block *dst, const av_aes_block *src, dst->u64[1] = src->u64[1] ^ round_key->u64[1]; } +static inline void addkey_s(av_aes_block *dst, const uint8_t *src, + const av_aes_block *round_key) +{ + dst->u64[0] = AV_RN64(src) ^ round_key->u64[0]; + dst->u64[1] = AV_RN64(src + 8) ^ round_key->u64[1]; +} + +static inline void addkey_d(uint8_t *dst, const av_aes_block *src, + const av_aes_block *round_key) +{ + AV_WN64(dst, src->u64[0] ^ round_key->u64[0]); + AV_WN64(dst + 8, src->u64[1] ^ round_key->u64[1]); +} + static void subshift(av_aes_block s0[2], int s, const uint8_t *box) { av_aes_block *s1 = (av_aes_block *) (s0[0].u8 - s); @@ -119,32 +134,28 @@ static inline void crypt(AVAES *a, int s, const uint8_t *sbox, subshift(&a->state[0], s, sbox); } -void av_aes_crypt(AVAES *a, uint8_t *dst_, const uint8_t *src_, - int count, uint8_t *iv_, int decrypt) +void av_aes_crypt(AVAES *a, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt) { - av_aes_block *dst = (av_aes_block *) dst_; - const av_aes_block *src = (const av_aes_block *) src_; - av_aes_block *iv = (av_aes_block *) iv_; - while (count--) { - addkey(&a->state[1], src, &a->round_key[a->rounds]); + addkey_s(&a->state[1], src, &a->round_key[a->rounds]); if (decrypt) { crypt(a, 0, inv_sbox, dec_multbl); if (iv) { - addkey(&a->state[0], &a->state[0], iv); - *iv = *src; + addkey_s(&a->state[0], iv, &a->state[0]); + memcpy(iv, src, 16); } - addkey(dst, &a->state[0], &a->round_key[0]); + addkey_d(dst, &a->state[0], &a->round_key[0]); } else { if (iv) - addkey(&a->state[1], &a->state[1], iv); + addkey_s(&a->state[1], iv, &a->state[1]); crypt(a, 2, sbox, enc_multbl); - addkey(dst, &a->state[0], &a->round_key[0]); + addkey_d(dst, &a->state[0], &a->round_key[0]); if (iv) - *iv = *dst; + memcpy(iv, dst, 16); } - src++; - dst++; + src += 16; + dst += 16; } } |