]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
gcm: Micro optimized gcm_fill, for big and little endian.
authorNiels Möller <nisse@lysator.liu.se>
Fri, 25 Sep 2020 17:27:02 +0000 (19:27 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Fri, 25 Sep 2020 17:27:02 +0000 (19:27 +0200)
ChangeLog
gcm.c

index f1fc7e9b24827ba545257b405b101a61287df6cf..07a32586244a52b9855856f06918a1cd6cc8a775 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2020-09-25  Niels Möller  <nisse@lysator.liu.se>
+
+       * gcm.c (gcm_fill): Added separate implementations for big- and
+       little-endian, to use uint64_t stores and less overhead.
+
 2020-09-24  Niels Möller  <nisse@obsidian>
 
        * aclocal.m4 (GMP_ASM_POWERPC_R_REGISTERS): Prefer to use register
diff --git a/gcm.c b/gcm.c
index cf615daf18bd60efc6a49459213c392bd09d0066..48b3e75a5c37866729ecba09f47054fbb5b4d915 100644 (file)
--- a/gcm.c
+++ b/gcm.c
@@ -334,6 +334,46 @@ gcm_update(struct gcm_ctx *ctx, const struct gcm_key *key,
 }
 
 static nettle_fill16_func gcm_fill;
+#if WORDS_BIGENDIAN
+static void
+gcm_fill(uint8_t *ctr, size_t blocks, union nettle_block16 *buffer)
+{
+  uint64_t hi, mid;
+  uint32_t lo;
+  size_t i;
+  hi = READ_UINT64(ctr);
+  mid = (uint64_t) READ_UINT32(ctr + 8) << 32;
+  lo = READ_UINT32(ctr + 12);
+
+  for (i = 0; i < blocks; i++)
+    {
+      buffer[i].u64[0] = hi;
+      buffer[i].u64[1] = mid + lo++;
+    }
+  WRITE_UINT32(ctr + 12, lo);
+
+}
+#elif HAVE_BUILTIN_BSWAP64
+/* Assume __builtin_bswap32 is also available */
+static void
+gcm_fill(uint8_t *ctr, size_t blocks, union nettle_block16 *buffer)
+{
+  uint64_t hi, mid;
+  uint32_t lo;
+  size_t i;
+  hi = LE_READ_UINT64(ctr);
+  mid = LE_READ_UINT32(ctr + 8);
+  lo = READ_UINT32(ctr + 12);
+
+  for (i = 0; i < blocks; i++)
+    {
+      buffer[i].u64[0] = hi;
+      buffer[i].u64[1] = mid + ((uint64_t)__builtin_bswap32(lo) << 32);
+      lo++;
+    }
+  WRITE_UINT32(ctr + 12, lo);
+}
+#else
 static void
 gcm_fill(uint8_t *ctr, size_t blocks, union nettle_block16 *buffer)
 {
@@ -349,6 +389,7 @@ gcm_fill(uint8_t *ctr, size_t blocks, union nettle_block16 *buffer)
 
   WRITE_UINT32(ctr + GCM_BLOCK_SIZE - 4, c);
 }
+#endif
 
 void
 gcm_encrypt (struct gcm_ctx *ctx, const struct gcm_key *key,