diff --git a/ChangeLog b/ChangeLog
index 465b998ccc..d271197d33 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2024-10-15  Sam Russell  <sam.h.russell@gmail.com>
+
+	crc: New tests for non-byte-aligned data.
+	* tests/test-crc.c: New test.
+
 2024-10-13  Bruno Haible  <bruno@clisp.org>
 
 	string-desc: New function string_desc_c_casecmp.
diff --git a/tests/test-crc.c b/tests/test-crc.c
index 16d2ff08eb..722843de44 100644
--- a/tests/test-crc.c
+++ b/tests/test-crc.c
@@ -21,11 +21,19 @@
 #include "crc.h"
 
 #include <stdio.h>
+#include <string.h>
 
 int
 main (int argc, char *argv[])
 {
   uint32_t p;
+  size_t i;
+  char plaintext[] = "Gnulib crc testsGnulib crc tests"
+                     "Gnulib crc testsGnulib crc tests"
+                     "Gnulib crc testsGnulib crc tests"
+                     "Gnulib crc testsGnulib crc tests"
+                     "Gnulib crc testsGnulib crc tests";
+  char data[sizeof(plaintext) + sizeof(unsigned long int)];
 
   p = crc32_update_no_xor (42, "foo", 3);
   if (p != 0x46e87f05)
@@ -55,5 +63,25 @@ main (int argc, char *argv[])
       return 1;
     }
 
+  /*
+   * Test for new CRC32 implementation
+   * The original implementation works on a byte-by-byte basis
+   * but new implementations may work on 8 or 16 byte alignments.
+   * This test will confirm correct operation with non-aligned
+   * data.
+   */
+
+  for (i = 0; i < sizeof(unsigned long int); i++)
+    {
+      memcpy(data + i, plaintext, sizeof(plaintext));
+      p = crc32_update_no_xor (0, data + i, sizeof(plaintext));
+      if (p != 0x654978c3)
+        {
+          printf ("aligned c at %lu got %lx\n", i, (unsigned long) p);
+          return 1;
+        }
+    }
+
+
   return 0;
 }
