summaryrefslogtreecommitdiff
path: root/umac-nh-n.c
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2013-04-11 16:24:46 +0200
committerNiels Möller <nisse@lysator.liu.se>2013-04-11 16:24:46 +0200
commit7c1be763f2bab7fdc7ad4505df84b075e230fc53 (patch)
tree149dfc1f5d715f9b8b181e63bb92ee1099ec3642 /umac-nh-n.c
parenta482e83c24a47bd1cf655c9afddc7518018d5723 (diff)
downloadnettle-7c1be763f2bab7fdc7ad4505df84b075e230fc53.tar.gz
More efficient _umac_nh_n.
Diffstat (limited to 'umac-nh-n.c')
-rw-r--r--umac-nh-n.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/umac-nh-n.c b/umac-nh-n.c
index 953fb2f6..e9fddac4 100644
--- a/umac-nh-n.c
+++ b/umac-nh-n.c
@@ -25,14 +25,39 @@
# 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]);
+ }
}