From 1fabd6f02a5a8717d75fed1ee11e4fe60073b39a Mon Sep 17 00:00:00 2001 From: Hladu357 Date: Wed, 20 Nov 2024 21:39:28 +0100 Subject: [PATCH] asm --- lab04-06_AES_PC/aes_6.cpp | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 lab04-06_AES_PC/aes_6.cpp diff --git a/lab04-06_AES_PC/aes_6.cpp b/lab04-06_AES_PC/aes_6.cpp new file mode 100644 index 0000000..e3a4f52 --- /dev/null +++ b/lab04-06_AES_PC/aes_6.cpp @@ -0,0 +1,54 @@ +#include +#include +#include + +/* +Author: Ondrej Hladuvka, hladuond@fit.cvut.cz +Template: Jiri Bucek 2017 +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); +} + +} \ No newline at end of file