From: Niels Möller Date: Thu, 11 Apr 2013 14:24:46 +0000 (+0200) Subject: More efficient _umac_nh_n. X-Git-Tag: nettle_2.7_release_20130424~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c1be763f2bab7fdc7ad4505df84b075e230fc53;p=thirdparty%2Fnettle.git More efficient _umac_nh_n. --- diff --git a/ChangeLog b/ChangeLog index ac2f4997..1d16d06a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2013-04-11 Niels Möller + * 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. 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 +#include + #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]); + } }