progs/cc-kem.c: Add `naclbox' crypto transform.
[catacomb] / symm / salsa20.c
index 0104e5e..3465ad9 100644 (file)
@@ -5,13 +5,36 @@
  * (c) 2015 Straylight/Edgeware
  */
 
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of Catacomb.
+ *
+ * Catacomb is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * Catacomb is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with Catacomb; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ */
+
 /*----- Header files ------------------------------------------------------*/
 
+#include "config.h"
+
 #include <stdarg.h>
 
 #include <mLib/bits.h>
 
 #include "arena.h"
+#include "dispatch.h"
 #include "gcipher.h"
 #include "grand.h"
 #include "keysz.h"
@@ -39,9 +62,35 @@ const octet salsa20_keysz[] = { KSZ_SET, 32, 16, 10, 0 };
  *             the feedforward step.
  */
 
-static void core(unsigned r, const salsa20_matrix src, salsa20_matrix dest)
+CPU_DISPATCH(static, (void), void, core,
+            (unsigned r, const salsa20_matrix src, salsa20_matrix dest),
+            (r, src, dest), pick_core, simple_core);
+
+static void simple_core(unsigned r, const salsa20_matrix src,
+                       salsa20_matrix dest)
   { SALSA20_nR(dest, src, r); SALSA20_FFWD(dest, src); }
 
+#if CPUFAM_X86 || CPUFAM_AMD64
+extern core__functype salsa20_core_x86ish_sse2;
+#endif
+
+#if CPUFAM_ARMEL
+extern core__functype salsa20_core_arm_neon;
+#endif
+
+static core__functype *pick_core(void)
+{
+#if CPUFAM_X86 || CPUFAM_AMD64
+  DISPATCH_PICK_COND(salsa20_core, salsa20_core_x86ish_sse2,
+                    cpu_feature_p(CPUFEAT_X86_SSE2));
+#endif
+#if CPUFAM_ARMEL
+  DISPATCH_PICK_COND(salsa20_core, salsa20_core_arm_neon,
+                    cpu_feature_p(CPUFEAT_ARM_NEON));
+#endif
+  DISPATCH_PICK_FALLBACK(salsa20_core, simple_core);
+}
+
 /* --- @populate@ --- *
  *
  * Arguments:  @salsa20_matrix a@ = a matrix to fill in
@@ -672,13 +721,13 @@ static void grdestroy(grand *r)
   static const grand_ops grops_rand_##rr = {                           \
     SALSA20_NAME_##rr, GRAND_CRYPTO, 0,                                        \
     grmisc, grdestroy, grword,                                         \
-    grbyte, grword, grand_range, grfill                                        \
+    grbyte, grword, grand_defaultrange, grfill                         \
   };                                                                   \
                                                                        \
   grand *SALSA20_DECOR(salsa20, 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;                                            \
     salsa20_init(&g->ctx, k, ksz, n);                                  \
@@ -715,13 +764,13 @@ SALSA20_VARS(DEFGRAND)
   static const grand_ops grxops_rand_##rr = {                          \
     "x" SALSA20_NAME_##rr, GRAND_CRYPTO, 0,                            \
     grmisc, grxdestroy_##rr, grword,                                   \
-    grbyte, grword, grand_range, grfill                                        \
+    grbyte, grword, grand_defaultrange, grfill                         \
   };                                                                   \
                                                                        \
   grand *SALSA20_DECOR(xsalsa20, 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;                                           \
     XSALSA20_INIT(rr, &g->ctx, k, ksz, n);                             \