]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
add test/fuzz for fast crc32
authorSebastian Pop <s.pop@samsung.com>
Thu, 15 Nov 2018 20:31:43 +0000 (14:31 -0600)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sat, 8 Dec 2018 11:36:30 +0000 (12:36 +0100)
test/fuzz/checksum_fuzzer.c

index e7003dd8c607514c4f3802275251cf01fb524a62..10fc138fb82d215a5418d133c30869d9fff1578b 100644 (file)
 #endif
 
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) {
-  uint32_t crc1 = PREFIX(crc32)(0L, NULL, 0);
-  uint32_t crc2 = PREFIX(crc32)(0L, NULL, 0);
-  uint32_t adler1 = PREFIX(adler32)(0L, NULL, 0);
-  uint32_t adler2 = PREFIX(adler32)(0L, NULL, 0);;
+  uint32_t crc0 = PREFIX(crc32)(0L, NULL, 0);
+  uint32_t crc1 = crc0;
+  uint32_t crc2 = crc0;
+  uint32_t adler0 = PREFIX(adler32)(0L, NULL, 0);
+  uint32_t adler1 = adler0;
+  uint32_t adler2 = adler0;
   /* Checksum with a buffer of size equal to the first byte in the input. */
   uint32_t buffSize = data[0];
   uint32_t offset = 0;
+  uint32_t op[32];
 
   /* Discard inputs larger than 1Mb. */
   static size_t kMaxSize = 1024 * 1024;
@@ -32,8 +35,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) {
     ++buffSize;
 
   /* CRC32 */
-  for (offset = 0; offset + buffSize <= dataLen; offset += buffSize)
+  PREFIX(crc32_combine_gen)(op, buffSize);
+  for (offset = 0; offset + buffSize <= dataLen; offset += buffSize) {
+    uint32_t crc3 = PREFIX(crc32_z)(crc0, data + offset, buffSize);
+    uint32_t crc4 = PREFIX(crc32_combine_op)(crc1, crc3, op);
     crc1 = PREFIX(crc32_z)(crc1, data + offset, buffSize);
+    assert(crc1 == crc4);
+  }
   crc1 = PREFIX(crc32_z)(crc1, data + offset, dataLen % buffSize);
 
   crc2 = PREFIX(crc32_z)(crc2, data, dataLen);
@@ -42,6 +50,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataLen) {
   assert(PREFIX(crc32_combine)(crc1, crc2, dataLen) ==
          PREFIX(crc32_combine)(crc1, crc1, dataLen));
 
+  /* Fast CRC32 combine. */
+  PREFIX(crc32_combine_gen)(op, dataLen);
+  assert(PREFIX(crc32_combine_op)(crc1, crc2, op) ==
+         PREFIX(crc32_combine_op)(crc2, crc1, op));
+  assert(PREFIX(crc32_combine)(crc1, crc2, dataLen) ==
+         PREFIX(crc32_combine_op)(crc2, crc1, op));
+
   /* Adler32 */
   for (offset = 0; offset + buffSize <= dataLen; offset += buffSize)
     adler1 = PREFIX(adler32_z)(adler1, data + offset, buffSize);