]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
More efficient _umac_nh_n.
authorNiels Möller <nisse@lysator.liu.se>
Thu, 11 Apr 2013 14:24:46 +0000 (16:24 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Thu, 11 Apr 2013 14:24:46 +0000 (16:24 +0200)
ChangeLog
umac-nh-n.c

index ac2f4997bb4a66e26f4643694af23ff47c8fec00..1d16d06ab3629f85aa54140ab1059a3efbb622ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2013-04-11  Niels Möller  <nisse@lysator.liu.se>
 
+       * umac-nh-n.c (_umac_nh_n): Rewrote as a single pass over the
+       message data.
+
        * examples/nettle-benchmark.c (time_umac): New function.
        (main): Call it.
 
index 953fb2f6e150c2197ccdba5aa0309a9a26643cf8..e9fddac4233c9aefccd467cc07725a27b7050ff5 100644 (file)
 # include "config.h"
 #endif
 
+#include <assert.h>
+#include <string.h>
+
 #include "umac.h"
+#include "macros.h"
 
-/* FIXME: Single pass over the input */
 void
 _umac_nh_n (uint64_t *out, unsigned n, const uint32_t *key,
            unsigned length, const uint8_t *msg)
 {
-  unsigned i;
-   for (i = 0; i < n; i++)
-     out[i] = _umac_nh (key + 4*i, length, msg);
+  assert (length > 0);
+  assert (length <= 1024);
+  assert (length % 32 == 0);
+
+  memset(out, 0, n*sizeof(*out));
+  
+  for (;length > 0; length -= 32, msg += 32, key += 8)
+    {
+      uint32_t a0, a1, b0, b1;
+      unsigned i;
+      a0 = LE_READ_UINT32 (msg);
+      a1 = LE_READ_UINT32 (msg + 4);
+      b0 = LE_READ_UINT32 (msg + 16);
+      b1 = LE_READ_UINT32 (msg + 20);
+      for (i = 0; i < n; i++)
+       out[i] += (uint64_t) (a0 + key[0+4*i]) * (b0 + key[4+4*i])
+         + (uint64_t) (a1 + key[1+4*i]) * (b1 + key[5+4*i]);
+      a0 = LE_READ_UINT32 (msg + 8);
+      a1 = LE_READ_UINT32 (msg + 12);
+      b0 = LE_READ_UINT32 (msg + 24);
+      b1 = LE_READ_UINT32 (msg + 28);
+      for (i = 0; i < n; i++)
+       out[i] += (uint64_t) (a0 + key[2+4*i]) * (b0 + key[6+4*i])
+         + (uint64_t) (a1 + key[3+4*i]) * (b1 + key[7+4*i]);      
+    }
 }