From 23adcd28ffe1743792c067ade228cb3f6a4e531b Mon Sep 17 00:00:00 2001 From: yyctw Date: Mon, 30 Oct 2023 14:34:23 +0800 Subject: [PATCH] [NEON] Add AES instructions. --- meson.build | 2 + simde/arm/neon.h | 1 + simde/arm/neon/aes.h | 215 ++++++++++++++++++++++ simde/simde-aes.h | 91 ++++++++++ simde/x86/aes.h | 61 +------ test/arm/neon/aes.c | 412 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 727 insertions(+), 55 deletions(-) create mode 100644 simde/arm/neon/aes.h create mode 100644 simde/simde-aes.h create mode 100644 test/arm/neon/aes.c diff --git a/meson.build b/meson.build index 4aa8f07dc..30a6f82c6 100644 --- a/meson.build +++ b/meson.build @@ -25,6 +25,7 @@ simde_neon_families = [ 'addv', 'addw', 'addw_high', + 'aes', 'and', 'bcax', 'bic', @@ -440,6 +441,7 @@ if not meson.is_subproject() 'simde/check.h', 'simde/debug-trap.h', 'simde/hedley.h', + 'simde/simde-aes.h', 'simde/simde-align.h', 'simde/simde-arch.h', 'simde/simde-common.h', diff --git a/simde/arm/neon.h b/simde/arm/neon.h index 880cfb4bc..7c1533d43 100644 --- a/simde/arm/neon.h +++ b/simde/arm/neon.h @@ -46,6 +46,7 @@ #include "neon/addv.h" #include "neon/addw.h" #include "neon/addw_high.h" +#include "neon/aes.h" #include "neon/and.h" #include "neon/bcax.h" #include "neon/bic.h" diff --git a/simde/arm/neon/aes.h b/simde/arm/neon/aes.h new file mode 100644 index 000000000..b90685280 --- /dev/null +++ b/simde/arm/neon/aes.h @@ -0,0 +1,215 @@ +/* SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright: + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) + */ + +#if !defined(SIMDE_ARM_NEON_AES_H) +#define SIMDE_ARM_NEON_AES_H + +#include "types.h" +#include "../../simde-aes.h" + +HEDLEY_DIAGNOSTIC_PUSH +SIMDE_DISABLE_UNWANTED_DIAGNOSTICS +SIMDE_BEGIN_DECLS_ + +static uint8_t xtime(uint8_t x) +{ + return HEDLEY_STATIC_CAST(uint8_t, (x<<1) ^ (((x>>7) & 1) * 0x1b)); +} + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x16_t +simde_vaeseq_u8(simde_uint8x16_t data, simde_uint8x16_t key) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_AES) + return vaeseq_u8(data, key); + #else + /* ref: https://github.com/kokke/tiny-AES-c/blob/master/aes.c */ + simde_uint8x16_private + r_, + a_ = simde_uint8x16_to_private(data), + b_ = simde_uint8x16_to_private(key); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i] ^ b_.values[i]; + } + // AESShiftRows + uint8_t tmp; + tmp = r_.values[1]; + r_.values[1] = r_.values[5]; + r_.values[5] = r_.values[9]; + r_.values[9] = r_.values[13]; + r_.values[13] = tmp; + + tmp = r_.values[2]; + r_.values[2] = r_.values[10]; + r_.values[10] = tmp; + + tmp = r_.values[6]; + r_.values[6] = r_.values[14]; + r_.values[14] = tmp; + + tmp = r_.values[3]; + r_.values[3] = r_.values[15]; + r_.values[15] = r_.values[11]; + r_.values[11] = r_.values[7]; + r_.values[7] = tmp; + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = simde_x_aes_s_box[r_.values[i]]; + } + return simde_uint8x16_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vaeseq_u8 + #define vaeseq_u8(data, key) simde_vaeseq_u8((data), (key)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x16_t +simde_vaesdq_u8(simde_uint8x16_t data, simde_uint8x16_t key) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_AES) + return vaesdq_u8(data, key); + #else + /* ref: https://github.com/kokke/tiny-AES-c/blob/master/aes.c */ + simde_uint8x16_private + r_, + a_ = simde_uint8x16_to_private(data), + b_ = simde_uint8x16_to_private(key); + + SIMDE_VECTORIZE + for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { + r_.values[i] = a_.values[i] ^ b_.values[i]; + } + // AESInvShiftRows + uint8_t tmp; + tmp = r_.values[13]; + r_.values[13] = r_.values[9]; + r_.values[9] = r_.values[5]; + r_.values[5] = r_.values[1]; + r_.values[1] = tmp; + + tmp = r_.values[2]; + r_.values[2] = r_.values[10]; + r_.values[10] = tmp; + + tmp = r_.values[6]; + r_.values[6] = r_.values[14]; + r_.values[14] = tmp; + + tmp = r_.values[3]; + r_.values[3] = r_.values[7]; + r_.values[7] = r_.values[11]; + r_.values[11] = r_.values[15]; + r_.values[15] = tmp; + for(int i = 0; i < 16; ++i) { + r_.values[i] = simde_x_aes_inv_s_box[r_.values[i]]; + } + return simde_uint8x16_from_private(r_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vaesdq_u8 + #define vaesdq_u8(data, key) simde_vaesdq_u8((data), (key)) +#endif + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x16_t +simde_vaesmcq_u8(simde_uint8x16_t data) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_AES) + return vaesmcq_u8(data); + #else + /* ref: https://github.com/kokke/tiny-AES-c/blob/master/aes.c */ + simde_uint8x16_private + a_ = simde_uint8x16_to_private(data); + uint8_t i; + uint8_t Tmp, Tm, t; + for (i = 0; i < 4; ++i) + { + t = a_.values[i*4+0]; + Tmp = a_.values[i*4+0] ^ a_.values[i*4+1] ^ a_.values[i*4+2] ^ a_.values[i*4+3] ; + Tm = a_.values[i*4+0] ^ a_.values[i*4+1] ; Tm = xtime(Tm); a_.values[i*4+0] ^= Tm ^ Tmp ; + Tm = a_.values[i*4+1] ^ a_.values[i*4+2] ; Tm = xtime(Tm); a_.values[i*4+1] ^= Tm ^ Tmp ; + Tm = a_.values[i*4+2] ^ a_.values[i*4+3] ; Tm = xtime(Tm); a_.values[i*4+2] ^= Tm ^ Tmp ; + Tm = a_.values[i*4+3] ^ t ; Tm = xtime(Tm); a_.values[i*4+3] ^= Tm ^ Tmp ; + } + return simde_uint8x16_from_private(a_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vaesmcq_u8 + #define vaesmcq_u8(data) simde_vaesmcq_u8((data)) +#endif + +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1) * x) ^ + ((y>>1 & 1) * xtime(x)) ^ + ((y>>2 & 1) * xtime(xtime(x))) ^ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */ +} + +SIMDE_FUNCTION_ATTRIBUTES +simde_uint8x16_t +simde_vaesimcq_u8(simde_uint8x16_t data) { + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(__ARM_FEATURE_AES) + return vaesimcq_u8(data); + #else + /* ref: https://github.com/kokke/tiny-AES-c/blob/master/aes.c */ + simde_uint8x16_private + a_ = simde_uint8x16_to_private(data); + #if defined(SIMDE_X86_AES_NATIVE) + a_.m128i = _mm_aesimc_si128(a_.m128i); + #else + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) + { + a = a_.values[i*4+0]; + b = a_.values[i*4+1]; + c = a_.values[i*4+2]; + d = a_.values[i*4+3]; + + a_.values[i*4+0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09); + a_.values[i*4+1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d); + a_.values[i*4+2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b); + a_.values[i*4+3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e); + } + #endif + return simde_uint8x16_from_private(a_); + #endif +} +#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) + #undef vaesimcq_u8 + #define vaesimcq_u8(data) simde_vaesimcq_u8((data)) +#endif + +SIMDE_END_DECLS_ +HEDLEY_DIAGNOSTIC_POP + +#endif /* !defined(SIMDE_ARM_NEON_AES_H) */ diff --git a/simde/simde-aes.h b/simde/simde-aes.h new file mode 100644 index 000000000..dbc6ba113 --- /dev/null +++ b/simde/simde-aes.h @@ -0,0 +1,91 @@ +/* SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Copyright: + * 2023 Yi-Yen Chung (Copyright owned by Andes Technology) + */ + +#if !defined(SIMDE_AES_H) +#define SIMDE_AES_H + +#include "simde-features.h" + +HEDLEY_DIAGNOSTIC_PUSH +SIMDE_DISABLE_UNWANTED_DIAGNOSTICS + +#if !(defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO)) + +/* + * Number of columns (32-bit words) comprising the State. For this + * standard, Nb = 4. + */ +#define simde_x_aes_Nb 4 + +/* + * S-box transformation table + */ +static uint8_t simde_x_aes_s_box[256] = { + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, // 0 + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, // 1 + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, // 2 + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, // 3 + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, // 4 + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, // 5 + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, // 6 + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, // 7 + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, // 8 + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, // 9 + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, // a + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, // b + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, // c + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, // d + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, // e + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};// f + +/* + * Inverse S-box transformation table + */ +static uint8_t simde_x_aes_inv_s_box[256] = { + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, // 0 + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, // 1 + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, // 2 + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, // 3 + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, // 4 + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, // 5 + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, // 6 + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, // 7 + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, // 8 + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, // 9 + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, // a + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, // b + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, // c + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, // d + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, // e + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};// f + +#endif + +HEDLEY_DIAGNOSTIC_POP + +#endif /* !defined(SIMDE_AES_H) */ diff --git a/simde/x86/aes.h b/simde/x86/aes.h index 448be044e..a29a985ba 100644 --- a/simde/x86/aes.h +++ b/simde/x86/aes.h @@ -237,56 +237,7 @@ void simde_x_aes_coef_mult_lookup(int lookup_table_offset, uint8_t *b, uint8_t * #undef gmultl } -/* - * Number of columns (32-bit words) comprising the State. For this - * standard, Nb = 4. - */ -#define simde_x_aes_Nb 4 - -/* - * S-box transformation table - */ -static uint8_t simde_x_aes_s_box[256] = { - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, // 0 - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, // 1 - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, // 2 - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, // 3 - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, // 4 - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, // 5 - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, // 6 - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, // 7 - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, // 8 - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, // 9 - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, // a - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, // b - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, // c - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, // d - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, // e - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};// f - -/* - * Inverse S-box transformation table - */ -static uint8_t simde_x_aes_inv_s_box[256] = { - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, // 0 - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, // 1 - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, // 2 - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, // 3 - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, // 4 - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, // 5 - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, // 6 - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, // 7 - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, // 8 - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, // 9 - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, // a - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, // b - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, // c - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, // d - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, // e - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};// f - +#include "../simde-aes.h" /* * Transformation in the Cipher and Inverse Cipher in which a Round @@ -520,7 +471,7 @@ simde__m128i simde_mm_aesenc_si128(simde__m128i a, simde__m128i round_key) { simde__m128i_private result_; simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private round_key_ = simde__m128i_to_private(round_key); - #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) result_.neon_u8 = veorq_u8( vaesmcq_u8(vaeseq_u8(a_.neon_u8, vdupq_n_u8(0))), round_key_.neon_u8); @@ -542,7 +493,7 @@ simde__m128i simde_mm_aesdec_si128(simde__m128i a, simde__m128i round_key) { simde__m128i_private result_; simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private round_key_ = simde__m128i_to_private(round_key); - #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) result_.neon_u8 = veorq_u8( vaesimcq_u8(vaesdq_u8(a_.neon_u8, vdupq_n_u8(0))), round_key_.neon_u8); @@ -564,7 +515,7 @@ simde__m128i simde_mm_aesenclast_si128(simde__m128i a, simde__m128i round_key) { simde__m128i_private result_; simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private round_key_ = simde__m128i_to_private(round_key); - #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) result_.neon_u8 = vaeseq_u8(a_.neon_u8, vdupq_n_u8(0)); result_.neon_i32 = veorq_s32(result_.neon_i32, round_key_.neon_i32); // _mm_xor_si128 #else @@ -585,7 +536,7 @@ simde__m128i simde_mm_aesdeclast_si128(simde__m128i a, simde__m128i round_key) { simde__m128i_private result_; simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private round_key_ = simde__m128i_to_private(round_key); - #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) result_.neon_u8 = veorq_u8( vaesdq_u8(a_.neon_u8, vdupq_n_u8(0)), round_key_.neon_u8); @@ -607,7 +558,7 @@ simde__m128i simde_mm_aesimc_si128(simde__m128i a) { simde__m128i_private result_ = simde__m128i_to_private(simde_mm_setzero_si128()); simde__m128i_private a_ = simde__m128i_to_private(a); - #if defined(SIMDE_ARM_NEON_A32V7_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) + #if defined(SIMDE_ARM_NEON_A32V8_NATIVE) && defined(SIMDE_ARCH_ARM_CRYPTO) result_.neon_u8 = vaesimcq_u8(a_.neon_u8); #else int Nb = simde_x_aes_Nb; diff --git a/test/arm/neon/aes.c b/test/arm/neon/aes.c new file mode 100644 index 000000000..cfe95b6ae --- /dev/null +++ b/test/arm/neon/aes.c @@ -0,0 +1,412 @@ +#define SIMDE_TEST_ARM_NEON_INSN aes + +#include "test-neon.h" +#include "../../../simde/arm/neon/aes.h" +#include "../../../simde/x86/aes.h" + +static int +test_simde_vaeseq_u8(SIMDE_MUNIT_TEST_ARGS) { +#if 1 + static const struct { + uint8_t a[16]; + uint8_t b[16]; + uint8_t r[16]; + } test_vec[] = { + { { UINT8_C( 228), UINT8_C( 235), UINT8_C( 67), UINT8_C( 2), + UINT8_C( 239), UINT8_C( 201), UINT8_C( 2), UINT8_C( 195), + UINT8_C( 232), UINT8_C( 176), UINT8_C( 20), UINT8_C( 82), + UINT8_C( 112), UINT8_C( 125), UINT8_C( 96), UINT8_C( 207) }, + { UINT8_C( 233), UINT8_C( 33), UINT8_C( 239), UINT8_C( 60), + UINT8_C( 182), UINT8_C( 228), UINT8_C( 187), UINT8_C( 221), + UINT8_C( 214), UINT8_C( 33), UINT8_C( 91), UINT8_C( 20), + UINT8_C( 33), UINT8_C( 71), UINT8_C( 101), UINT8_C( 46) }, + { UINT8_C( 215), UINT8_C( 216), UINT8_C( 132), UINT8_C( 248), + UINT8_C( 203), UINT8_C( 129), UINT8_C( 107), UINT8_C( 178), + UINT8_C( 178), UINT8_C( 128), UINT8_C( 145), UINT8_C( 114), + UINT8_C( 209), UINT8_C( 116), UINT8_C( 86), UINT8_C( 90) } }, + { { UINT8_C( 196), UINT8_C( 16), UINT8_C( 128), UINT8_C( 152), + UINT8_C( 149), UINT8_C( 124), UINT8_C( 204), UINT8_C( 130), + UINT8_C( 182), UINT8_C( 183), UINT8_C( 44), UINT8_C( 186), + UINT8_C( 125), UINT8_C( 158), UINT8_C( 120), UINT8_C( 228) }, + { UINT8_C( 162), UINT8_C( 129), UINT8_C( 63), UINT8_C( 24), + UINT8_C( 22), UINT8_C( 182), UINT8_C( 52), UINT8_C( 25), + UINT8_C( 229), UINT8_C( 125), UINT8_C( 248), UINT8_C( 223), + UINT8_C( 223), UINT8_C( 207), UINT8_C( 82), UINT8_C( 161) }, + { UINT8_C( 51), UINT8_C( 116), UINT8_C( 72), UINT8_C( 110), + UINT8_C( 236), UINT8_C( 116), UINT8_C( 229), UINT8_C( 205), + UINT8_C( 237), UINT8_C( 209), UINT8_C( 8), UINT8_C( 20), + UINT8_C( 58), UINT8_C( 129), UINT8_C( 65), UINT8_C( 77) } }, + { { UINT8_C( 55), UINT8_C( 61), UINT8_C( 117), UINT8_C( 94), + UINT8_C( 247), UINT8_C( 145), UINT8_C( 197), UINT8_C( 40), + UINT8_C( 180), UINT8_C( 219), UINT8_C( 223), UINT8_C( 201), + UINT8_C( 205), UINT8_C( 179), UINT8_C( 246), UINT8_C( 88) }, + { UINT8_C( 22), UINT8_C( 105), UINT8_C( 37), UINT8_C( 64), + UINT8_C( 18), UINT8_C( 227), UINT8_C( 155), UINT8_C( 129), + UINT8_C( 161), UINT8_C( 152), UINT8_C( 153), UINT8_C( 158), + UINT8_C( 232), UINT8_C( 74), UINT8_C( 244), UINT8_C( 121) }, + { UINT8_C( 253), UINT8_C( 64), UINT8_C( 90), UINT8_C( 253), + UINT8_C( 217), UINT8_C( 26), UINT8_C( 119), UINT8_C( 114), + UINT8_C( 89), UINT8_C( 153), UINT8_C( 83), UINT8_C( 211), + UINT8_C( 63), UINT8_C( 32), UINT8_C( 88), UINT8_C( 91) } }, + { { UINT8_C( 62), UINT8_C( 242), UINT8_C( 86), UINT8_C( 182), + UINT8_C( 36), UINT8_C( 28), UINT8_C( 202), UINT8_C( 115), + UINT8_C( 38), UINT8_C( 148), UINT8_C( 177), UINT8_C( 175), + UINT8_C( 242), UINT8_C( 118), UINT8_C( 101), UINT8_C( 30) }, + { UINT8_C( 154), UINT8_C( 42), UINT8_C( 168), UINT8_C( 157), + UINT8_C( 227), UINT8_C( 126), UINT8_C( 34), UINT8_C( 143), + UINT8_C( 58), UINT8_C( 197), UINT8_C( 111), UINT8_C( 12), + UINT8_C( 115), UINT8_C( 209), UINT8_C( 37), UINT8_C( 114) }, + { UINT8_C( 73), UINT8_C( 170), UINT8_C( 29), UINT8_C( 80), + UINT8_C( 198), UINT8_C( 209), UINT8_C( 9), UINT8_C( 241), + UINT8_C( 156), UINT8_C( 92), UINT8_C( 187), UINT8_C( 176), + UINT8_C( 12), UINT8_C( 97), UINT8_C( 155), UINT8_C( 10) } }, + { { UINT8_C( 56), UINT8_C( 238), UINT8_C( 40), UINT8_C( 72), + UINT8_C( 233), UINT8_C( 20), UINT8_C( 6), UINT8_C( 166), + UINT8_C( 135), UINT8_C( 122), UINT8_C( 55), UINT8_C( 225), + UINT8_C( 232), UINT8_C( 204), UINT8_C( 98), UINT8_C( 50) }, + { UINT8_C( 90), UINT8_C( 240), UINT8_C( 67), UINT8_C( 224), + UINT8_C( 212), UINT8_C( 251), UINT8_C( 63), UINT8_C( 183), + UINT8_C( 82), UINT8_C( 207), UINT8_C( 64), UINT8_C( 217), + UINT8_C( 40), UINT8_C( 23), UINT8_C( 154), UINT8_C( 140) }, + { UINT8_C( 170), UINT8_C( 223), UINT8_C( 245), UINT8_C( 174), + UINT8_C( 39), UINT8_C( 213), UINT8_C( 65), UINT8_C( 194), + UINT8_C( 3), UINT8_C( 185), UINT8_C( 127), UINT8_C( 130), + UINT8_C( 186), UINT8_C( 114), UINT8_C( 18), UINT8_C( 7) } }, + { { UINT8_C( 164), UINT8_C( 21), UINT8_C( 25), UINT8_C( 129), + UINT8_C( 133), UINT8_C( 195), UINT8_C( 137), UINT8_C( 171), + UINT8_C( 117), UINT8_C( 131), UINT8_C( 31), UINT8_C( 133), + UINT8_C( 35), UINT8_C( 103), UINT8_C( 248), UINT8_C( 169) }, + { UINT8_C( 217), UINT8_C( 29), UINT8_C( 230), UINT8_C( 58), + UINT8_C( 231), UINT8_C( 150), UINT8_C( 173), UINT8_C( 122), + UINT8_C( 114), UINT8_C( 250), UINT8_C( 147), UINT8_C( 121), + UINT8_C( 102), UINT8_C( 120), UINT8_C( 123), UINT8_C( 158) }, + { UINT8_MAX, UINT8_C( 252), UINT8_C( 100), UINT8_C( 154), + UINT8_C( 170), UINT8_C( 182), UINT8_C( 236), UINT8_C( 234), + UINT8_C( 197), UINT8_C( 192), UINT8_C( 22), UINT8_C( 62), + UINT8_C( 110), UINT8_C( 48), UINT8_C( 54), UINT8_C( 176) } }, + { { UINT8_C( 249), UINT8_C( 88), UINT8_C( 174), UINT8_C( 65), + UINT8_C( 39), UINT8_C( 74), UINT8_C( 213), UINT8_C( 149), + UINT8_C( 48), UINT8_C( 11), UINT8_C( 126), UINT8_C( 154), + UINT8_C( 147), UINT8_C( 223), UINT8_C( 126), UINT8_C( 197) }, + { UINT8_C( 210), UINT8_C( 51), UINT8_C( 12), UINT8_C( 32), + UINT8_C( 228), UINT8_C( 18), UINT8_C( 117), UINT8_C( 217), + UINT8_C( 25), UINT8_C( 147), UINT8_C( 90), UINT8_C( 131), + UINT8_C( 117), UINT8_C( 84), UINT8_C( 187), UINT8_C( 6) }, + { UINT8_C( 241), UINT8_C( 106), UINT8_C( 54), UINT8_C( 46), + UINT8_C( 46), UINT8_C( 70), UINT8_C( 166), UINT8_C( 239), + UINT8_C( 165), UINT8_C( 61), UINT8_C( 58), UINT8_C( 41), + UINT8_C( 142), UINT8_C( 127), UINT8_C( 224), UINT8_C( 212) } }, + { { UINT8_C( 98), UINT8_C( 127), UINT8_C( 249), UINT8_C( 204), + UINT8_C( 102), UINT8_C( 50), UINT8_C( 9), UINT8_C( 203), + UINT8_C( 5), UINT8_C( 225), UINT8_C( 177), UINT8_C( 107), + UINT8_C( 124), UINT8_C( 106), UINT8_C( 198), UINT8_C( 107) }, + { UINT8_C( 149), UINT8_C( 216), UINT8_C( 141), UINT8_C( 195), + UINT8_C( 185), UINT8_C( 47), UINT8_C( 38), UINT8_C( 84), + UINT8_C( 34), UINT8_C( 97), UINT8_C( 229), UINT8_C( 64), + UINT8_C( 208), UINT8_C( 221), UINT8_C( 143), UINT8_C( 52) }, + { UINT8_C( 104), UINT8_C( 164), UINT8_C( 32), UINT8_C( 207), + UINT8_C( 158), UINT8_C( 205), UINT8_C( 59), UINT8_C( 118), + UINT8_C( 204), UINT8_C( 169), UINT8_C( 146), UINT8_C( 219), + UINT8_C( 145), UINT8_C( 92), UINT8_C( 21), UINT8_C( 241) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t data = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_t key = simde_vld1q_u8(test_vec[i].b); + simde_uint8x16_t r = simde_vaeseq_u8(data, key); + + simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r)); + } + + return 0; +#endif +} + +static int +test_simde_vaesdq_u8(SIMDE_MUNIT_TEST_ARGS) { + static const struct { + uint8_t a[16]; + uint8_t b[16]; + uint8_t r[16]; + } test_vec[] = { + { { UINT8_C( 18), UINT8_C( 82), UINT8_C( 154), UINT8_C( 206), + UINT8_C( 19), UINT8_C( 252), UINT8_C( 123), UINT8_MAX, + UINT8_C( 247), UINT8_C( 81), UINT8_C( 190), UINT8_C( 179), + UINT8_C( 64), UINT8_C( 54), UINT8_C( 72), UINT8_C( 150) }, + { UINT8_C( 84), UINT8_C( 5), UINT8_C( 165), UINT8_C( 29), + UINT8_C( 75), UINT8_C( 115), UINT8_C( 98), UINT8_C( 117), + UINT8_C( 86), UINT8_C( 239), UINT8_C( 88), UINT8_C( 52), + UINT8_C( 240), UINT8_C( 71), UINT8_C( 7), UINT8_C( 184) }, + { UINT8_C( 152), UINT8_C( 44), UINT8_C( 245), UINT8_C( 207), + UINT8_C( 94), UINT8_C( 218), UINT8_C( 146), UINT8_C( 234), + UINT8_C( 241), UINT8_C( 115), UINT8_C( 37), UINT8_C( 195), + UINT8_C( 252), UINT8_C( 90), UINT8_C( 142), UINT8_C( 169) } }, + { { UINT8_C( 209), UINT8_C( 236), UINT8_C( 98), UINT8_C( 59), + UINT8_C( 134), UINT8_C( 8), UINT8_C( 145), UINT8_C( 214), + UINT8_C( 214), UINT8_C( 69), UINT8_C( 8), UINT8_C( 190), + UINT8_C( 163), UINT8_C( 182), UINT8_C( 253), UINT8_C( 236) }, + { UINT8_C( 0), UINT8_C( 133), UINT8_C( 159), UINT8_C( 50), + UINT8_C( 134), UINT8_C( 134), UINT8_C( 116), UINT8_C( 64), + UINT8_C( 199), UINT8_C( 66), UINT8_C( 174), UINT8_C( 216), + UINT8_C( 52), UINT8_C( 202), UINT8_C( 135), UINT8_C( 214) }, + { UINT8_C( 81), UINT8_C( 1), UINT8_C( 197), UINT8_C( 53), + UINT8_C( 82), UINT8_C( 228), UINT8_C( 189), UINT8_C( 211), + UINT8_C( 227), UINT8_C( 230), UINT8_C( 33), UINT8_C( 162), + UINT8_C( 133), UINT8_C( 56), UINT8_C( 42), UINT8_C( 64) } }, + { { UINT8_C( 172), UINT8_C( 43), UINT8_C( 105), UINT8_C( 103), + UINT8_C( 99), UINT8_C( 95), UINT8_C( 22), UINT8_C( 69), + UINT8_C( 104), UINT8_C( 236), UINT8_C( 73), UINT8_C( 34), + UINT8_C( 14), UINT8_C( 240), UINT8_C( 112), UINT8_C( 46) }, + { UINT8_C( 174), UINT8_C( 13), UINT8_C( 0), UINT8_C( 129), + UINT8_C( 185), UINT8_C( 218), UINT8_C( 45), UINT8_C( 27), + UINT8_C( 7), UINT8_C( 141), UINT8_C( 39), UINT8_C( 137), + UINT8_C( 124), UINT8_C( 75), UINT8_C( 245), UINT8_C( 98) }, + { UINT8_C( 106), UINT8_C( 254), UINT8_C( 69), UINT8_C( 157), + UINT8_C( 122), UINT8_C( 35), UINT8_C( 103), UINT8_C( 14), + UINT8_C( 6), UINT8_C( 103), UINT8_C( 228), UINT8_C( 93), + UINT8_C( 30), UINT8_C( 216), UINT8_C( 73), UINT8_C( 245) } }, + { { UINT8_C( 127), UINT8_C( 185), UINT8_C( 90), UINT8_C( 29), + UINT8_C( 217), UINT8_C( 229), UINT8_C( 48), UINT8_C( 234), + UINT8_C( 89), UINT8_C( 81), UINT8_C( 58), UINT8_C( 2), + UINT8_C( 190), UINT8_C( 249), UINT8_C( 3), UINT8_C( 140) }, + { UINT8_C( 237), UINT8_C( 204), UINT8_C( 143), UINT8_C( 176), + UINT8_C( 193), UINT8_C( 128), UINT8_C( 65), UINT8_C( 72), + UINT8_C( 212), UINT8_C( 75), UINT8_C( 208), UINT8_C( 108), + UINT8_C( 100), UINT8_C( 86), UINT8_C( 140), UINT8_C( 30) }, + { UINT8_C( 116), UINT8_C( 27), UINT8_C( 187), UINT8_C( 26), + UINT8_C( 52), UINT8_C( 63), UINT8_C( 115), UINT8_C( 69), + UINT8_C( 180), UINT8_C( 188), UINT8_C( 181), UINT8_C( 116), + UINT8_C( 122), UINT8_C( 67), UINT8_C( 44), UINT8_C( 24) } }, + { { UINT8_C( 62), UINT8_C( 246), UINT8_C( 47), UINT8_C( 103), + UINT8_C( 31), UINT8_C( 37), UINT8_C( 118), UINT8_C( 229), + UINT8_C( 49), UINT8_C( 144), UINT8_C( 22), UINT8_C( 27), + UINT8_C( 160), UINT8_C( 17), UINT8_C( 50), UINT8_C( 216) }, + { UINT8_C( 82), UINT8_C( 218), UINT8_C( 88), UINT8_C( 170), + UINT8_C( 244), UINT8_C( 175), UINT8_C( 79), UINT8_C( 146), + UINT8_C( 100), UINT8_C( 145), UINT8_C( 76), UINT8_C( 242), + UINT8_C( 15), UINT8_C( 176), UINT8_C( 75), UINT8_C( 71) }, + { UINT8_C( 184), UINT8_C( 241), UINT8_C( 70), UINT8_C( 2), + UINT8_C( 60), UINT8_C( 66), UINT8_C( 175), UINT8_C( 235), + UINT8_C( 237), UINT8_C( 207), UINT8_C( 2), UINT8_C( 110), + UINT8_C( 27), UINT8_C( 9), UINT8_C( 91), UINT8_C( 128) } }, + { { UINT8_C( 179), UINT8_C( 236), UINT8_C( 189), UINT8_C( 236), + UINT8_C( 249), UINT8_C( 62), UINT8_C( 54), UINT8_C( 183), + UINT8_C( 215), UINT8_C( 179), UINT8_C( 69), UINT8_C( 23), + UINT8_C( 55), UINT8_C( 102), UINT8_C( 26), UINT8_C( 74) }, + { UINT8_C( 217), UINT8_C( 250), UINT8_C( 86), UINT8_C( 91), + UINT8_C( 52), UINT8_C( 155), UINT8_C( 112), UINT8_C( 99), + UINT8_MAX, UINT8_C( 235), UINT8_C( 37), UINT8_C( 60), + UINT8_C( 19), UINT8_C( 106), UINT8_C( 41), UINT8_C( 66) }, + { UINT8_C( 88), UINT8_C( 129), UINT8_C( 144), UINT8_C( 25), + UINT8_C( 128), UINT8_MAX, UINT8_C( 102), UINT8_C( 11), + UINT8_C( 238), UINT8_C( 41), UINT8_C( 60), UINT8_C( 191), + UINT8_C( 166), UINT8_C( 94), UINT8_C( 152), UINT8_C( 32) } }, + { { UINT8_C( 90), UINT8_C( 211), UINT8_C( 163), UINT8_C( 131), + UINT8_C( 37), UINT8_C( 166), UINT8_C( 252), UINT8_C( 144), + UINT8_C( 100), UINT8_C( 1), UINT8_C( 41), UINT8_C( 97), + UINT8_C( 203), UINT8_C( 42), UINT8_C( 79), UINT8_C( 251) }, + { UINT8_C( 208), UINT8_C( 177), UINT8_C( 38), UINT8_C( 227), + UINT8_C( 162), UINT8_C( 145), UINT8_C( 148), UINT8_C( 57), + UINT8_C( 65), UINT8_C( 192), UINT8_C( 12), UINT8_C( 145), + UINT8_C( 79), UINT8_C( 198), UINT8_C( 39), UINT8_C( 170) }, + { UINT8_C( 207), UINT8_C( 131), UINT8_C( 194), UINT8_C( 183), + UINT8_C( 234), UINT8_C( 171), UINT8_C( 247), UINT8_C( 23), + UINT8_C( 194), UINT8_C( 178), UINT8_C( 103), UINT8_C( 112), + UINT8_C( 79), UINT8_C( 221), UINT8_C( 247), UINT8_C( 144) } }, + { { UINT8_C( 22), UINT8_C( 205), UINT8_C( 192), UINT8_C( 161), + UINT8_C( 87), UINT8_C( 197), UINT8_C( 133), UINT8_C( 239), + UINT8_C( 99), UINT8_C( 208), UINT8_C( 110), UINT8_C( 79), + UINT8_C( 74), UINT8_C( 76), UINT8_C( 253), UINT8_C( 131) }, + { UINT8_C( 230), UINT8_C( 20), UINT8_C( 68), UINT8_C( 49), + UINT8_C( 118), UINT8_C( 241), UINT8_C( 145), UINT8_C( 31), + UINT8_C( 159), UINT8_C( 14), UINT8_C( 89), UINT8_C( 224), + UINT8_C( 38), UINT8_C( 163), UINT8_C( 78), UINT8_C( 137) }, + { UINT8_C( 23), UINT8_C( 97), UINT8_C( 178), UINT8_C( 23), + UINT8_C( 123), UINT8_C( 229), UINT8_C( 75), UINT8_C( 27), + UINT8_C( 85), UINT8_C( 40), UINT8_C( 79), UINT8_C( 163), + UINT8_C( 184), UINT8_C( 156), UINT8_C( 155), UINT8_C( 150) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t data = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_t key = simde_vld1q_u8(test_vec[i].b); + simde_uint8x16_t r = simde_vaesdq_u8(data, key); + + simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r)); + } + + return 0; +} + +static int +test_simde_vaesmcq_u8(SIMDE_MUNIT_TEST_ARGS) { + static const struct { + uint8_t a[16]; + uint8_t r[16]; + } test_vec[] = { + { { UINT8_C( 144), UINT8_C( 220), UINT8_C( 183), UINT8_C( 13), + UINT8_C( 111), UINT8_C( 166), UINT8_C( 6), UINT8_C( 31), + UINT8_C( 83), UINT8_C( 129), UINT8_C( 127), UINT8_C( 45), + UINT8_C( 37), UINT8_C( 181), UINT8_C( 157), UINT8_C( 194) }, + { UINT8_C( 254), UINT8_C( 252), UINT8_C( 46), UINT8_C( 218), + UINT8_C( 54), UINT8_C( 45), UINT8_C( 228), UINT8_C( 47), + UINT8_C( 108), UINT8_C( 230), UINT8_C( 91), UINT8_C( 81), + UINT8_C( 209), UINT8_C( 42), UINT8_C( 236), UINT8_C( 216) } }, + { { UINT8_C( 212), UINT8_C( 163), UINT8_C( 154), UINT8_C( 148), + UINT8_C( 152), UINT8_C( 108), UINT8_C( 149), UINT8_C( 210), + UINT8_C( 33), UINT8_C( 13), UINT8_C( 99), UINT8_C( 122), + UINT8_C( 212), UINT8_C( 112), UINT8_C( 62), UINT8_C( 176) }, + { UINT8_C( 67), UINT8_C( 168), UINT8_MAX, UINT8_C( 109), + UINT8_C( 216), UINT8_C( 54), UINT8_C( 168), UINT8_C( 245), + UINT8_C( 76), UINT8_C( 228), UINT8_C( 100), UINT8_C( 249), + UINT8_C( 173), UINT8_C( 198), UINT8_C( 19), UINT8_C( 82) } }, + { { UINT8_C( 30), UINT8_C( 31), UINT8_C( 73), UINT8_C( 58), + UINT8_C( 184), UINT8_C( 173), UINT8_C( 215), UINT8_C( 33), + UINT8_C( 231), UINT8_C( 227), UINT8_C( 70), UINT8_C( 95), + UINT8_C( 62), UINT8_C( 104), UINT8_C( 155), UINT8_C( 244) }, + { UINT8_C( 110), UINT8_C( 193), UINT8_C( 221), UINT8_C( 0), + UINT8_C( 113), UINT8_C( 186), UINT8_C( 195), UINT8_C( 235), + UINT8_C( 242), UINT8_C( 175), UINT8_C( 105), UINT8_C( 41), + UINT8_C( 171), UINT8_C( 172), UINT8_C( 124), UINT8_C( 66) } }, + { { UINT8_C( 143), UINT8_C( 26), UINT8_C( 2), UINT8_C( 195), + UINT8_C( 219), UINT8_C( 68), UINT8_C( 166), UINT8_C( 169), + UINT8_C( 137), UINT8_C( 144), UINT8_C( 156), UINT8_C( 12), + UINT8_C( 90), UINT8_C( 45), UINT8_C( 86), UINT8_C( 55) }, + { UINT8_C( 234), UINT8_C( 126), UINT8_C( 207), UINT8_C( 15), + UINT8_C( 110), UINT8_C( 11), UINT8_C( 40), UINT8_C( 221), + UINT8_C( 50), UINT8_C( 1), UINT8_C( 46), UINT8_C( 148), + UINT8_C( 162), UINT8_C( 205), UINT8_C( 130), UINT8_C( 251) } }, + { { UINT8_C( 222), UINT8_C( 13), UINT8_C( 56), UINT8_C( 173), + UINT8_C( 70), UINT8_C( 231), UINT8_C( 130), UINT8_C( 134), + UINT8_C( 41), UINT8_C( 58), UINT8_C( 40), UINT8_C( 124), + UINT8_C( 89), UINT8_C( 154), UINT8_C( 16), UINT8_C( 22) }, + { UINT8_C( 37), UINT8_C( 33), UINT8_C( 79), UINT8_C( 13), + UINT8_C( 186), UINT8_C( 136), UINT8_C( 47), UINT8_C( 184), + UINT8_C( 72), UINT8_C( 89), UINT8_C( 199), UINT8_C( 145), + UINT8_C( 1), UINT8_C( 80), UINT8_C( 217), UINT8_C( 77) } }, + { { UINT8_C( 82), UINT8_C( 2), UINT8_C( 129), UINT8_C( 40), + UINT8_C( 41), UINT8_C( 52), UINT8_C( 88), UINT8_C( 53), + UINT8_C( 223), UINT8_C( 3), UINT8_C( 138), UINT8_C( 239), + UINT8_MAX, UINT8_C( 155), UINT8_C( 170), UINT8_C( 14) }, + { UINT8_C( 11), UINT8_C( 230), UINT8_C( 49), UINT8_C( 37), + UINT8_C( 99), UINT8_C( 156), UINT8_C( 242), UINT8_C( 125), + UINT8_C( 197), UINT8_C( 179), UINT8_C( 249), UINT8_C( 54), + UINT8_C( 247), UINT8_C( 57), UINT8_C( 57), UINT8_C( 55) } }, + { { UINT8_C( 205), UINT8_C( 230), UINT8_C( 76), UINT8_C( 92), + UINT8_C( 123), UINT8_C( 122), UINT8_C( 60), UINT8_C( 249), + UINT8_C( 61), UINT8_C( 231), UINT8_C( 203), UINT8_C( 96), + UINT8_C( 55), UINT8_C( 29), UINT8_C( 202), UINT8_C( 184) }, + { UINT8_C( 160), UINT8_C( 146), UINT8_C( 87), UINT8_C( 94), + UINT8_C( 189), UINT8_C( 50), UINT8_C( 105), UINT8_C( 34), + UINT8_C( 227), UINT8_C( 206), UINT8_C( 247), UINT8_C( 171), + UINT8_C( 59), UINT8_C( 240), UINT8_C( 118), UINT8_C( 229) } }, + { { UINT8_C( 177), UINT8_C( 126), UINT8_C( 128), UINT8_C( 19), + UINT8_C( 154), UINT8_C( 185), UINT8_C( 105), UINT8_C( 101), + UINT8_C( 198), UINT8_C( 122), UINT8_C( 193), UINT8_C( 86), + UINT8_C( 21), UINT8_C( 144), UINT8_C( 56), UINT8_C( 123) }, + { UINT8_C( 104), UINT8_C( 197), UINT8_C( 225), UINT8_C( 16), + UINT8_C( 243), UINT8_C( 45), UINT8_C( 94), UINT8_C( 175), + UINT8_C( 142), UINT8_C( 60), UINT8_C( 223), UINT8_C( 70), + UINT8_C( 194), UINT8_C( 29), UINT8_C( 120), UINT8_C( 97) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t data = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_t r = simde_vaesmcq_u8(data); + + simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r)); + } + + return 0; +} + +static int +test_simde_vaesimcq_u8(SIMDE_MUNIT_TEST_ARGS) { + static const struct { + uint8_t a[16]; + uint8_t r[16]; + } test_vec[] = { + { { UINT8_C( 213), UINT8_C( 183), UINT8_C( 50), UINT8_C( 161), + UINT8_C( 43), UINT8_C( 173), UINT8_C( 12), UINT8_C( 199), + UINT8_C( 26), UINT8_C( 200), UINT8_C( 174), UINT8_C( 41), + UINT8_C( 50), UINT8_C( 241), UINT8_C( 42), UINT8_C( 229) }, + { UINT8_C( 152), UINT8_C( 198), UINT8_C( 134), UINT8_C( 41), + UINT8_C( 179), UINT8_C( 84), UINT8_C( 14), UINT8_C( 164), + UINT8_C( 136), UINT8_C( 102), UINT8_C( 150), UINT8_C( 45), + UINT8_C( 163), UINT8_C( 96), UINT8_C( 163), UINT8_C( 108) } }, + { { UINT8_C( 32), UINT8_C( 161), UINT8_C( 40), UINT8_C( 112), + UINT8_C( 19), UINT8_C( 187), UINT8_C( 36), UINT8_C( 40), + UINT8_C( 53), UINT8_C( 122), UINT8_C( 205), UINT8_C( 157), + UINT8_C( 47), UINT8_C( 200), UINT8_MAX, UINT8_C( 248) }, + { UINT8_C( 82), UINT8_C( 138), UINT8_C( 243), UINT8_C( 242), + UINT8_C( 119), UINT8_C( 23), UINT8_C( 19), UINT8_C( 215), + UINT8_C( 129), UINT8_C( 89), UINT8_C( 71), UINT8_C( 128), + UINT8_C( 54), UINT8_C( 199), UINT8_C( 61), UINT8_C( 44) } }, + { { UINT8_C( 109), UINT8_C( 198), UINT8_C( 184), UINT8_C( 122), + UINT8_C( 150), UINT8_C( 224), UINT8_C( 220), UINT8_C( 49), + UINT8_C( 71), UINT8_C( 224), UINT8_C( 253), UINT8_C( 174), + UINT8_C( 69), UINT8_C( 101), UINT8_C( 36), UINT8_C( 135) }, + { UINT8_C( 85), UINT8_C( 240), UINT8_C( 82), UINT8_C( 158), + UINT8_C( 102), UINT8_C( 222), UINT8_C( 1), UINT8_C( 34), + UINT8_C( 217), UINT8_C( 236), UINT8_C( 144), UINT8_C( 81), + UINT8_C( 109), UINT8_C( 181), UINT8_C( 17), UINT8_C( 74) } }, + { { UINT8_C( 145), UINT8_C( 75), UINT8_C( 110), UINT8_C( 67), + UINT8_C( 165), UINT8_C( 87), UINT8_C( 81), UINT8_C( 152), + UINT8_C( 0), UINT8_C( 254), UINT8_C( 48), UINT8_C( 174), + UINT8_C( 234), UINT8_C( 15), UINT8_C( 165), UINT8_C( 251) }, + { UINT8_C( 225), UINT8_C( 47), UINT8_C( 235), UINT8_C( 210), + UINT8_C( 95), UINT8_C( 178), UINT8_C( 221), UINT8_C( 11), + UINT8_C( 106), UINT8_C( 111), UINT8_C( 154), UINT8_MAX, + UINT8_C( 8), UINT8_C( 169), UINT8_C( 42), UINT8_C( 48) } }, + { { UINT8_C( 158), UINT8_C( 119), UINT8_C( 245), UINT8_C( 179), + UINT8_C( 148), UINT8_C( 35), UINT8_C( 225), UINT8_C( 89), + UINT8_C( 14), UINT8_C( 161), UINT8_C( 246), UINT8_C( 72), + UINT8_C( 99), UINT8_C( 225), UINT8_C( 157), UINT8_C( 206) }, + { UINT8_C( 64), UINT8_C( 245), UINT8_C( 110), UINT8_C( 116), + UINT8_C( 89), UINT8_C( 56), UINT8_C( 50), UINT8_C( 92), + UINT8_C( 31), UINT8_C( 31), UINT8_C( 197), UINT8_C( 212), + UINT8_C( 170), UINT8_C( 166), UINT8_C( 237), UINT8_C( 48) } }, + { { UINT8_C( 147), UINT8_C( 77), UINT8_C( 101), UINT8_C( 177), + UINT8_C( 198), UINT8_C( 19), UINT8_C( 3), UINT8_C( 149), + UINT8_C( 29), UINT8_C( 113), UINT8_C( 167), UINT8_C( 123), + UINT8_C( 42), UINT8_C( 201), UINT8_C( 67), UINT8_C( 19) }, + { UINT8_C( 155), UINT8_C( 154), UINT8_C( 121), UINT8_C( 114), + UINT8_C( 35), UINT8_C( 112), UINT8_C( 96), UINT8_C( 112), + UINT8_C( 92), UINT8_C( 169), UINT8_C( 157), UINT8_C( 216), + UINT8_C( 20), UINT8_C( 223), UINT8_C( 0), UINT8_C( 120) } }, + { { UINT8_C( 54), UINT8_C( 171), UINT8_C( 172), UINT8_C( 8), + UINT8_C( 22), UINT8_C( 12), UINT8_C( 118), UINT8_C( 168), + UINT8_C( 114), UINT8_C( 115), UINT8_C( 65), UINT8_C( 30), + UINT8_C( 73), UINT8_C( 16), UINT8_C( 0), UINT8_C( 26) }, + { UINT8_C( 163), UINT8_C( 245), UINT8_C( 75), UINT8_C( 36), + UINT8_C( 7), UINT8_C( 224), UINT8_C( 244), UINT8_C( 215), + UINT8_C( 36), UINT8_C( 32), UINT8_C( 171), UINT8_C( 241), + UINT8_C( 169), UINT8_C( 117), UINT8_C( 102), UINT8_C( 249) } }, + { { UINT8_C( 253), UINT8_C( 110), UINT8_C( 224), UINT8_C( 90), + UINT8_C( 146), UINT8_C( 251), UINT8_C( 154), UINT8_C( 59), + UINT8_C( 192), UINT8_C( 129), UINT8_C( 81), UINT8_C( 35), + UINT8_C( 244), UINT8_C( 148), UINT8_C( 96), UINT8_C( 180) }, + { UINT8_C( 206), UINT8_C( 195), UINT8_C( 129), UINT8_C( 165), + UINT8_C( 178), UINT8_C( 198), UINT8_C( 49), UINT8_C( 141), + UINT8_C( 128), UINT8_C( 52), UINT8_C( 119), UINT8_C( 240), + UINT8_C( 49), UINT8_C( 132), UINT8_C( 214), UINT8_C( 215) } }, + }; + + for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) { + simde_uint8x16_t data = simde_vld1q_u8(test_vec[i].a); + simde_uint8x16_t r = simde_vaesimcq_u8(data); + + simde_test_arm_neon_assert_equal_u8x16(r, simde_vld1q_u8(test_vec[i].r)); + } + + return 0; +} + +SIMDE_TEST_FUNC_LIST_BEGIN +SIMDE_TEST_FUNC_LIST_ENTRY(vaeseq_u8) +SIMDE_TEST_FUNC_LIST_ENTRY(vaesdq_u8) +SIMDE_TEST_FUNC_LIST_ENTRY(vaesmcq_u8) +SIMDE_TEST_FUNC_LIST_ENTRY(vaesimcq_u8) +SIMDE_TEST_FUNC_LIST_END + +#include "test-neon-footer.h"