X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/55d8165698494a72b866a02f9fbf02d99320e7df..8851fe49eb5c9112f3bd00e285f9c502dfd0deb3:/symm/chacha.c diff --git a/symm/chacha.c b/symm/chacha.c index bd94ffde..43d23dc7 100644 --- a/symm/chacha.c +++ b/symm/chacha.c @@ -27,6 +27,8 @@ /*----- Header files ------------------------------------------------------*/ +#include "config.h" + #include #include @@ -34,6 +36,7 @@ #include "arena.h" #include "chacha.h" #include "chacha-core.h" +#include "dispatch.h" #include "gcipher.h" #include "grand.h" #include "keysz.h" @@ -59,9 +62,35 @@ const octet chacha_keysz[] = { KSZ_SET, 32, 16, 10, 0 }; * 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 @@ -189,9 +218,9 @@ unsigned long chacha_tell(chacha_ctx *ctx) { 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) @@ -415,7 +444,7 @@ CHACHA_VARS(DEFXNONCE) * different. */ -/* --- @xchacha{,12,8}_encrypt@ --- * +/* --- @xchacha{20,12,8}_encrypt@ --- * * * Arguments: @xchachaR_ctx *ctx@ = pointer to context * @const void *src@ = source buffer (or null) @@ -672,12 +701,12 @@ static void grdestroy(grand *r) static const grand_ops grops_rand_##rr = { \ "chacha" #rr, GRAND_CRYPTO, 0, \ grmisc, grdestroy, grword, \ - grbyte, grword, grand_range, grfill \ + grbyte, grword, grand_defaultrange, grfill \ }; \ \ 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); \ @@ -714,12 +743,12 @@ CHACHA_VARS(DEFGRAND) static const grand_ops grxops_rand_##rr = { \ "xchacha" #rr, GRAND_CRYPTO, 0, \ grmisc, grxdestroy_##rr, grword, \ - grbyte, grword, grand_range, grfill \ + grbyte, grword, grand_defaultrange, grfill \ }; \ \ 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); \