From b4d0307d9e476cb64899af2905f90a03aa958f3c Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 29 Jul 2020 13:37:32 -0700 Subject: [PATCH] Some AES NEON reorg. --- core/AES.cpp | 13 ++++++++----- core/AES.hpp | 23 ++++++++++++++--------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/core/AES.cpp b/core/AES.cpp index ad87dbc51..aadacd07e 100644 --- a/core/AES.cpp +++ b/core/AES.cpp @@ -744,8 +744,8 @@ void AES::CTR::crypt(const void *const input, unsigned int len) noexcept } #endif // ZT_AES_AESNI -#ifdef ZT_ARCH_ARM_HAS_NEON - if (true) { +#ifdef ZT_AES_NEON + if (s_hasNeonAes) { uint8x16_t dd = vld1q_u8(reinterpret_cast(_ctr)); const uint32x4_t one = {0,0,0,1}; @@ -842,7 +842,7 @@ void AES::CTR::crypt(const void *const input, unsigned int len) noexcept vst1q_u8(reinterpret_cast(_ctr), dd); return; } -#endif // ZT_ARCH_ARM_HAS_NEON +#endif // ZT_AES_NEON uint64_t keyStream[2]; uint32_t ctr = Utils::ntoh(reinterpret_cast(_ctr)[3]); @@ -1330,7 +1330,10 @@ void AES::_decrypt_aesni(const void *in, void *out) const noexcept #endif // ZT_AES_AESNI -#ifdef ZT_ARCH_ARM_HAS_NEON +#ifdef ZT_AES_NEON + +const bool AES::s_hasNeonAes = true; +const bool AES::s_hasNeonGcm = true; #define ZT_INIT_ARMNEON_CRYPTO_SUBWORD(w) ((uint32_t)s_sbox[w & 0xffU] + ((uint32_t)s_sbox[(w >> 8U) & 0xffU] << 8U) + ((uint32_t)s_sbox[(w >> 16U) & 0xffU] << 16U) + ((uint32_t)s_sbox[(w >> 24U) & 0xffU] << 24U)) #define ZT_INIT_ARMNEON_CRYPTO_ROTWORD(w) (((w) << 8U) | ((w) >> 24U)) @@ -1411,6 +1414,6 @@ void AES::_decrypt_armneon_crypto(const void *const in, void *const out) const n vst1q_u8(reinterpret_cast(out), tmp); } -#endif // ZT_ARCH_ARM_HAS_NEON +#endif // ZT_AES_NEON } // namespace ZeroTier diff --git a/core/AES.hpp b/core/AES.hpp index 3efeb3daa..4b4d83c90 100644 --- a/core/AES.hpp +++ b/core/AES.hpp @@ -21,6 +21,9 @@ #if !defined(ZT_AES_NO_ACCEL) && defined(ZT_ARCH_X64) #define ZT_AES_AESNI 1 #endif +#if !defined(ZT_AES_NO_ACCEL) && defined(ZT_ARCH_ARM_HAS_NEON) +#define ZT_AES_NEON 1 +#endif namespace ZeroTier { @@ -75,8 +78,8 @@ public: return; } #endif -#ifdef ZT_ARCH_ARM_HAS_NEON - if (true) { +#ifdef ZT_AES_NEON + if (s_hasNeonAes) { _init_armneon_crypto(reinterpret_cast(key)); return; } @@ -98,8 +101,8 @@ public: return; } #endif -#ifdef ZT_ARCH_ARM_HAS_NEON - if (true) { +#ifdef ZT_AES_NEON + if (s_hasNeonAes) { _encrypt_armneon_crypto(in, out); return; } @@ -121,8 +124,8 @@ public: return; } #endif -#ifdef ZT_ARCH_ARM_HAS_NEON - if (true) { +#ifdef ZT_AES_NEON + if (s_hasNeonAes) { _decrypt_armneon_crypto(in, out); return; } @@ -521,7 +524,7 @@ private: } ni; #endif -#ifdef ZT_ARCH_ARM_HAS_NEON +#ifdef ZT_AES_NEON struct { uint8x16_t ek[15]; @@ -540,11 +543,13 @@ private: #ifdef ZT_AES_AESNI void _init_aesni(const uint8_t key[32]) noexcept; - void _encrypt_aesni(const void *const in, void *const out) const noexcept; + void _encrypt_aesni(const void *in, void *out) const noexcept; void _decrypt_aesni(const void *in, void *out) const noexcept; #endif -#ifdef ZT_ARCH_ARM_HAS_NEON +#ifdef ZT_AES_NEON + static const bool s_hasNeonAes; + static const bool s_hasNeonGcm; void _init_armneon_crypto(const uint8_t key[32]) noexcept; void _encrypt_armneon_crypto(const void *const in, void *const out) const noexcept; void _decrypt_armneon_crypto(const void *const in, void *const out) const noexcept;