/*----- Header files ------------------------------------------------------*/
+#include "config.h"
+
#include <stdarg.h>
#include <mLib/bits.h>
#include "arena.h"
#include "chacha.h"
#include "chacha-core.h"
+#include "dispatch.h"
#include "gcipher.h"
#include "grand.h"
#include "keysz.h"
* the feedforward step.
*/
-static void core(unsigned r, const chacha_matrix src, chacha_matrix dest)
+CPU_DISPATCH(static, (void), void, core,
+ (unsigned r, const chacha_matrix src, chacha_matrix dest),
+ (r, src, dest), pick_core, simple_core);
+
+static void simple_core(unsigned r, const chacha_matrix src,
+ chacha_matrix dest)
{ CHACHA_nR(dest, src, r); CHACHA_FFWD(dest, src); }
+#if CPUFAM_X86 || CPUFAM_AMD64
+extern core__functype chacha_core_x86ish_sse2;
+#endif
+
+#if CPUFAM_ARMEL
+extern core__functype chacha_core_arm_neon;
+#endif
+
+static core__functype *pick_core(void)
+{
+#if CPUFAM_X86 || CPUFAM_AMD64
+ DISPATCH_PICK_COND(chacha_core, chacha_core_x86ish_sse2,
+ cpu_feature_p(CPUFEAT_X86_SSE2));
+#endif
+#if CPUFAM_ARMEL
+ DISPATCH_PICK_COND(chacha_core, chacha_core_arm_neon,
+ cpu_feature_p(CPUFEAT_ARM_NEON));
+#endif
+ DISPATCH_PICK_FALLBACK(chacha_core, simple_core);
+}
+
/* --- @populate@ --- *
*
* Arguments: @chacha_matrix a@ = a matrix to fill in
chacha_seek(ctx, 0);
}
-/* --- @chacha_seek@, @chacha_seeku64@ --- *
+/* --- @chacha_seek{,u64}@ --- *
*
* Arguments: @chacha_ctx *ctx@ = pointer to context
* @unsigned long i@, @kludge64 i@ = new position to set
ctx->bufi = CHACHA_OUTSZ;
}
-/* --- @chacha_tell@, @chacha_tellu64@ --- *
+/* --- @chacha_tell{,u64}@ --- *
*
* Arguments: @chacha_ctx *ctx@ = pointer to context
*
{ kludge64 i = chacha_tellu64(ctx); return (GET64(unsigned long, i)); }
kludge64 chacha_tellu64(chacha_ctx *ctx)
- { kludge64 i; SET64(i, ctx->a[9], ctx->a[8]); return (i); }
+ { kludge64 i; SET64(i, ctx->a[13], ctx->a[12]); return (i); }
-/* --- @chacha{,12,8}_encrypt@ --- *
+/* --- @chacha{20,12,8}_encrypt@ --- *
*
* Arguments: @chacha_ctx *ctx@ = pointer to context
* @const void *src@ = source buffer (or null)
}
CHACHA_VARS(DEFXNONCE)
-/* --- @xchacha{20,12,8}_seek@, @xchacha{20,12,8}_seeku64@ --- *
+/* --- @xchacha{20,12,8}_seek{,u64}@ --- *
*
* Arguments: @xchachaR_ctx *ctx@ = pointer to context
* @unsigned long i@, @kludge64 i@ = new position to set
* different.
*/
-/* --- @xchacha{20,12,8}_tell@, @xchacha{20,12,8}_tellu64@ --- *
+/* --- @xchacha{20,12,8}_tell{,u64}@ --- *
*
* Arguments: @chacha_ctx *ctx@ = pointer to context
*
* different.
*/
-/* --- @xchacha{,12,8}_encrypt@ --- *
+/* --- @xchacha{20,12,8}_encrypt@ --- *
*
* Arguments: @xchachaR_ctx *ctx@ = pointer to context
* @const void *src@ = source buffer (or null)
\
grand *chacha##rr##_rand(const void *k, size_t ksz, const void *n) \
{ \
- grctx *g = S_CREATE(g); \
+ grctx *g = S_CREATE(grctx); \
g->r.r.ops = &grops_rand_##rr; \
g->r.ops = &grops_##rr; \
chacha_init(&g->ctx, k, ksz, n); \
\
grand *xchacha##rr##_rand(const void *k, size_t ksz, const void *n) \
{ \
- grxctx_##rr *g = S_CREATE(g); \
+ grxctx_##rr *g = S_CREATE(grxctx_##rr); \
g->r.r.ops = &grxops_rand_##rr; \
g->r.ops = &grxops_##rr; \
XCHACHA_INIT(rr, &g->ctx, k, ksz, n); \