3#include "native/isa_import.h"
4#include "native/arm/detail/crypto_constant.h"
5#include "native/arm/aes.h"
9#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
23 template<isa<arm> Arch>
requires(Arch.has(arm_feature::aes))
26 if consteval {
return detail::arm_constant::aes_round<false>(state, round_key); }
28 auto result = detail::arm_aes::aese<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()), __builtin_bit_cast(uint8x16_t, round_key.to_native()));
34 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::aes) &&
requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
36 return detail::arm_constant::aes_round<false>(state, round_key);
40 template<isa<arm> Arch>
requires(Arch.has(arm_feature::aes))
43 if consteval {
return detail::arm_constant::aes_round<true>(state, round_key); }
45 auto result = detail::arm_aes::aesd<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()), __builtin_bit_cast(uint8x16_t, round_key.to_native()));
51 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::aes) &&
requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
53 return detail::arm_constant::aes_round<true>(state, round_key);
57 template<isa<arm> Arch>
requires(Arch.has(arm_feature::aes))
60 if consteval {
return detail::arm_constant::aes_mix<false>(state); }
62 auto result = detail::arm_aes::aesmc<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()));
68 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::aes) &&
requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
70 return detail::arm_constant::aes_mix<false>(state);
74 template<isa<arm> Arch>
requires(Arch.has(arm_feature::aes))
77 if consteval {
return detail::arm_constant::aes_mix<true>(state); }
79 auto result = detail::arm_aes::aesimc<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()));
85 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::aes) &&
requires {
sizeof(simd<std::uint8_t, 16, Arch>); })
87 return detail::arm_constant::aes_mix<true>(state);
92 template<isa<arm> Arch,
class... T>
void aese(T...) =
delete;
95 template<isa<arm> Arch,
class... T>
void aesd(T...) =
delete;
98 template<isa<arm> Arch,
class... T>
void aesmc(T...) =
delete;
101 template<isa<arm> Arch,
class... T>
void aesimc(T...) =
delete;
constexpr simd< std::uint8_t, 16, Arch > aesimc(simd< std::uint8_t, 16, Arch > state) noexcept
Apply inverse AES MixColumns independently to the four state columns.
constexpr simd< std::uint8_t, 16, Arch > aesmc(simd< std::uint8_t, 16, Arch > state) noexcept
Apply AES MixColumns independently to the four state columns.
constexpr simd< std::uint8_t, 16, Arch > aesd(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply AddRoundKey, inverse ShiftRows and inverse SubBytes to one AES state.
constexpr simd< std::uint8_t, 16, Arch > aese(simd< std::uint8_t, 16, Arch > state, simd< std::uint8_t, 16, Arch > round_key) noexcept
Apply AddRoundKey, SubBytes and ShiftRows to one AES state.
#define native_inline
inline [[always_inline]]
#define native_nodiscard
C++17 [[nodiscard]].
#define native_const
[[const]] is not const
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
Standard-library adaptations documented here for SIMD value types.
Omitted architecture arguments use the native.simd provider's baseline.