/*----- Header files ------------------------------------------------------*/
+#include "config.h"
+
#include <assert.h>
#include <stdio.h>
#include <mLib/bits.h>
#include "blkc.h"
+#include "dispatch.h"
#include "gcipher.h"
#include "rijndael.h"
#include "rijndael-base.h"
-#include "rijndael-tab.h"
/*----- Global variables --------------------------------------------------*/
const octet rijndael_keysz[] = { KSZ_RANGE, RIJNDAEL_KEYSZ, 4, 32, 4 };
-/*----- Constant tables ---------------------------------------------------*/
-
-const octet rijndael_s[256] = RIJNDAEL_S;
-const octet rijndael_si[256] = RIJNDAEL_SI;
-const uint32 rijndael_t[4][256] = RIJNDAEL_T;
-const uint32 rijndael_ti[4][256] = RIJNDAEL_TI;
-const uint32 rijndael_u[4][256] = RIJNDAEL_U;
-const octet rijndael_rcon[] = RIJNDAEL_RCON;
-
/*----- Main code ---------------------------------------------------------*/
/* --- @rijndael_setup@ --- *
* Use: Low-level key-scheduling.
*/
-void rijndael_setup(rijndael_ctx *k, unsigned nb, const void *buf, size_t sz)
+static void simple_setup(rijndael_ctx *k, unsigned nb,
+ const void *buf, unsigned nk)
{
- unsigned nk, nr, nw;
+ unsigned nr = k->nr, nw;
unsigned i, j, jj;
const octet *p;
uint32 ww;
- /* --- Sort out the key size --- */
-
- KSZ_ASSERT(rijndael, sz);
- nk = sz / 4;
-
- /* --- Select the number of rounds --- */
-
- nr = (nk > nb ? nk : nb) + 6;
- if (nr < 10)
- nr = 10;
- k->nr = nr;
-
/* --- Fetch the first key words out --- */
p = buf;
k->wi[i] = k->w[j + jj++];
}
+CPU_DISPATCH(static, EMPTY, void, setup,
+ (rijndael_ctx *k, unsigned nb, const void *buf, unsigned nk),
+ (k, nb, buf, nk), pick_setup, simple_setup)
+
+#if CPUFAM_X86 || CPUFAM_AMD64
+extern setup__functype rijndael_setup_x86ish_aesni;
+#endif
+#if CPUFAM_ARMEL && HAVE_AS_ARMV8_CRYPTO
+extern setup__functype rijndael_setup_arm_crypto;
+#endif
+
+static setup__functype *pick_setup(void)
+{
+#if CPUFAM_X86 || CPUFAM_AMD64
+ DISPATCH_PICK_COND(rijndael_setup, rijndael_setup_x86ish_aesni,
+ cpu_feature_p(CPUFEAT_X86_AESNI));
+#endif
+#if CPUFAM_ARMEL && HAVE_AS_ARMV8_CRYPTO
+ DISPATCH_PICK_COND(rijndael_setup, rijndael_setup_arm_crypto,
+ cpu_feature_p(CPUFEAT_ARM_AES));
+#endif
+ DISPATCH_PICK_FALLBACK(rijndael_setup, simple_setup);
+}
+
+void rijndael_setup(rijndael_ctx *k, unsigned nb, const void *buf, size_t sz)
+{
+ unsigned nk, nr;
+
+ /* --- Sort out the key size --- */
+
+ KSZ_ASSERT(rijndael, sz);
+ nk = sz / 4;
+
+ /* --- Select the number of rounds --- */
+
+ nr = (nk > nb ? nk : nb) + 6;
+ if (nr < 10)
+ nr = 10;
+ k->nr = nr;
+
+ /* --- Do the main setup --- */
+
+ setup(k, nb, buf, nk);
+}
+
/*----- That's all, folks -------------------------------------------------*/