52 lines
2.1 KiB
C++
52 lines
2.1 KiB
C++
#include <stdint.h>
|
|
#include <immintrin.h>
|
|
|
|
/*
|
|
Author: Ondrej Hladuvka, hladuond@fit.cvut.cz
|
|
AES specification:
|
|
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
|
|
*/
|
|
|
|
namespace aes128_6 {
|
|
static inline __m128i expandRoundKey(__m128i key, __m128i keygened){
|
|
keygened = _mm_shuffle_epi32(keygened, _MM_SHUFFLE(3,3,3,3));
|
|
key = _mm_xor_si128(key, _mm_slli_si128(key, 4));
|
|
key = _mm_xor_si128(key, _mm_slli_si128(key, 4));
|
|
key = _mm_xor_si128(key, _mm_slli_si128(key, 4));
|
|
return _mm_xor_si128(key, keygened);
|
|
}
|
|
|
|
void expandKey(uint8_t *key, __m128i *ex){
|
|
ex[0] = _mm_loadu_si128((const __m128i*) key);
|
|
ex[1] = expandRoundKey(ex[0], _mm_aeskeygenassist_si128(ex[0], 0x01));
|
|
ex[2] = expandRoundKey(ex[1], _mm_aeskeygenassist_si128(ex[1], 0x02));
|
|
ex[3] = expandRoundKey(ex[2], _mm_aeskeygenassist_si128(ex[2], 0x04));
|
|
ex[4] = expandRoundKey(ex[3], _mm_aeskeygenassist_si128(ex[3], 0x08));
|
|
ex[5] = expandRoundKey(ex[4], _mm_aeskeygenassist_si128(ex[4], 0x10));
|
|
ex[6] = expandRoundKey(ex[5], _mm_aeskeygenassist_si128(ex[5], 0x20));
|
|
ex[7] = expandRoundKey(ex[6], _mm_aeskeygenassist_si128(ex[6], 0x40));
|
|
ex[8] = expandRoundKey(ex[7], _mm_aeskeygenassist_si128(ex[7], 0x80));
|
|
ex[9] = expandRoundKey(ex[8], _mm_aeskeygenassist_si128(ex[8], 0x1B));
|
|
ex[10] = expandRoundKey(ex[9], _mm_aeskeygenassist_si128(ex[9], 0x36));
|
|
}
|
|
|
|
void aes128_6(uint8_t *in, uint8_t *out, uint32_t* key) {
|
|
__m128i *k = (__m128i *)key;
|
|
__m128i state = _mm_loadu_si128((__m128i *) in);
|
|
|
|
state = _mm_xor_si128 (state, k[ 0]);
|
|
state = _mm_aesenc_si128 (state, k[ 1]);
|
|
state = _mm_aesenc_si128 (state, k[ 2]);
|
|
state = _mm_aesenc_si128 (state, k[ 3]);
|
|
state = _mm_aesenc_si128 (state, k[ 4]);
|
|
state = _mm_aesenc_si128 (state, k[ 5]);
|
|
state = _mm_aesenc_si128 (state, k[ 6]);
|
|
state = _mm_aesenc_si128 (state, k[ 7]);
|
|
state = _mm_aesenc_si128 (state, k[ 8]);
|
|
state = _mm_aesenc_si128 (state, k[ 9]);
|
|
state = _mm_aesenclast_si128(state, k[10]);
|
|
|
|
_mm_storeu_si128((__m128i *) out, state);
|
|
}
|
|
|
|
} |