native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
native.arm.aes.ccm
1// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
2module;
3#include "native/isa_import.h"
4#include "native/arm/detail/crypto_constant.h"
5#include "native/arm/aes.h"
6export module native.arm.aes;
7export import native.arm.features;
8export import native.simd;
9#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
10export namespace native {
21
23 template<isa<arm> Arch> requires(Arch.has(arm_feature::aes))
25 constexpr simd<std::uint8_t, 16, Arch> aese(simd<std::uint8_t, 16, Arch> state, simd<std::uint8_t, 16, Arch> round_key) noexcept {
26 if consteval { return detail::arm_constant::aes_round<false>(state, round_key); }
27 else {
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()));
30 }
31 }
32
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);
37 }
38
40 template<isa<arm> Arch> requires(Arch.has(arm_feature::aes))
42 constexpr simd<std::uint8_t, 16, Arch> aesd(simd<std::uint8_t, 16, Arch> state, simd<std::uint8_t, 16, Arch> round_key) noexcept {
43 if consteval { return detail::arm_constant::aes_round<true>(state, round_key); }
44 else {
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()));
47 }
48 }
49
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);
54 }
55
57 template<isa<arm> Arch> requires(Arch.has(arm_feature::aes))
59 constexpr simd<std::uint8_t, 16, Arch> aesmc(simd<std::uint8_t, 16, Arch> state) noexcept {
60 if consteval { return detail::arm_constant::aes_mix<false>(state); }
61 else {
62 auto result = detail::arm_aes::aesmc<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()));
64 }
65 }
66
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);
71 }
72
74 template<isa<arm> Arch> requires(Arch.has(arm_feature::aes))
76 constexpr simd<std::uint8_t, 16, Arch> aesimc(simd<std::uint8_t, 16, Arch> state) noexcept {
77 if consteval { return detail::arm_constant::aes_mix<true>(state); }
78 else {
79 auto result = detail::arm_aes::aesimc<Arch>(__builtin_bit_cast(uint8x16_t, state.to_native()));
81 }
82 }
83
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);
88 }
89
90 // Require exact semantic shapes and a consistent feature tag.
92 template<isa<arm> Arch, class... T> void aese(T...) = delete;
93
95 template<isa<arm> Arch, class... T> void aesd(T...) = delete;
96
98 template<isa<arm> Arch, class... T> void aesmc(T...) = delete;
99
101 template<isa<arm> Arch, class... T> void aesimc(T...) = delete;
102
104}
105#endif
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]]
Definition attributes.h:212
#define native_nodiscard
C++17 [[nodiscard]].
Definition attributes.h:189
#define native_const
[[const]] is not const
Definition attributes.h:108
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
Definition attributes.h:476
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.