/**************************************************************** ** ** test_chksum_size_one(): Checksum 1 byte buffer ** ****************************************************************/ static void test_chksum_size_one(void) { uint8_t buf[1] = {23}; /* Buffer to checksum */ uint32_t chksum; /* Checksum value */ /* Buffer w/real data */ chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0x17001700, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xfa2568b7, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0xa209c931, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(buf, 0, sizeof(buf)); chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xfa60fb57, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x8ba9414b, "H5_checksum_lookup3"); } /* test_chksum_size_one() */
/**************************************************************** ** ** test_chksum_size_two(): Checksum 2 byte buffer ** ****************************************************************/ static void test_chksum_size_two(void) { uint8_t buf[2] = {23, 187}; /* Buffer to checksum */ uint32_t chksum; /* Checksum value */ /* Buffer w/real data */ chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0x17bb17bb, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xfc856608, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x8ba7a6c9, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(buf, 0, sizeof(buf)); chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xfc7e9b20, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x62cd61b3, "H5_checksum_lookup3"); } /* test_chksum_size_two() */
/**************************************************************** ** ** test_chksum_large(): Checksum larger buffer ** ****************************************************************/ static void test_chksum_large(void) { uint32_t chksum; /* Checksum value */ size_t u; /* Local index variable */ /* Initialize buffer w/known data */ for(u = 0; u < BUF_LEN; u++) large_buf[u] = (uint8_t)(u * 3); /* Buffer w/real data */ chksum = H5_checksum_fletcher32(large_buf, sizeof(large_buf)); VERIFY(chksum, 0x85b4e2a, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(large_buf, sizeof(large_buf)); VERIFY(chksum, 0xfbd0f7c0, "H5_checksum_crc"); chksum = H5_checksum_lookup3(large_buf, sizeof(large_buf), 0); VERIFY(chksum, 0x1bd2ee7b, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(large_buf, 0, sizeof(large_buf)); chksum = H5_checksum_fletcher32(large_buf, sizeof(large_buf)); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(large_buf, sizeof(large_buf)); VERIFY(chksum, 0xfac8b4c4, "H5_checksum_crc"); chksum = H5_checksum_lookup3(large_buf, sizeof(large_buf), 0); VERIFY(chksum, 0x930c7afc, "H5_checksum_lookup3"); } /* test_chksum_large() */
/**************************************************************** ** ** test_chksum_size_four(): Checksum 4 byte buffer ** ****************************************************************/ static void test_chksum_size_four(void) { uint8_t buf[4] = {23, 187, 98, 217};/* Buffer to checksum */ uint32_t chksum; /* Checksum value */ /* Buffer w/real data */ chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0x924f7a94, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xff398a46, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x2c88bb51, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(buf, 0, sizeof(buf)); chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xff117081, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x049396b8, "H5_checksum_lookup3"); } /* test_chksum_size_four() */
/**************************************************************** ** ** test_chksum_size_three(): Checksum 3 byte buffer ** ****************************************************************/ static void test_chksum_size_three(void) { uint8_t buf[3] = {23, 187, 98}; /* Buffer to checksum */ uint32_t chksum; /* Checksum value */ /* Buffer w/real data */ chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0x917679bb, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xfebc5d70, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0xcebdf4f0, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(buf, 0, sizeof(buf)); chksum = H5_checksum_fletcher32(buf, sizeof(buf)); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(buf, sizeof(buf)); VERIFY(chksum, 0xf9cc4c7a, "H5_checksum_crc"); chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); VERIFY(chksum, 0x6bd0060f, "H5_checksum_lookup3"); } /* test_chksum_size_three() */
/**************************************************************** ** ** test_chksum_large(): Checksum larger buffer ** ****************************************************************/ static void test_chksum_large(void) { uint8_t *large_buf; /* Buffer for checksum calculations */ uint32_t chksum; /* Checksum value */ size_t u; /* Local index variable */ /* Allocate the buffer */ large_buf = (uint8_t *)HDmalloc((size_t)BUF_LEN); CHECK_PTR(large_buf, "HDmalloc"); /* Initialize buffer w/known data */ for(u = 0; u < BUF_LEN; u++) large_buf[u] = (uint8_t)(u * 3); /* Buffer w/real data */ chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN); VERIFY(chksum, 0x85b4e2a, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN); VERIFY(chksum, 0xfbd0f7c0, "H5_checksum_crc"); chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0); VERIFY(chksum, 0x1bd2ee7b, "H5_checksum_lookup3"); /* Buffer w/zero(s) for data */ HDmemset(large_buf, 0, (size_t)BUF_LEN); chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN); VERIFY(chksum, 0, "H5_checksum_fletcher32"); chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN); VERIFY(chksum, 0xfac8b4c4, "H5_checksum_crc"); chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0); VERIFY(chksum, 0x930c7afc, "H5_checksum_lookup3"); /* Release memory for buffer */ HDfree(large_buf); } /* test_chksum_large() */
/* ARGSUSED */ static size_t H5Z_filter_fletcher32 (unsigned flags, size_t H5_ATTR_UNUSED cd_nelmts, const unsigned H5_ATTR_UNUSED cd_values[], size_t nbytes, size_t *buf_size, void **buf) { void *outbuf = NULL; /* Pointer to new buffer */ unsigned char *src = (unsigned char*)(*buf); uint32_t fletcher; /* Checksum value */ uint32_t reversed_fletcher; /* Possible wrong checksum value */ uint8_t c[4]; uint8_t tmp; size_t ret_value; /* Return value */ FUNC_ENTER_NOAPI(0) HDassert(sizeof(uint32_t)>=4); if (flags & H5Z_FLAG_REVERSE) { /* Read */ /* Do checksum if it's enabled for read; otherwise skip it * to save performance. */ if (!(flags & H5Z_FLAG_SKIP_EDC)) { unsigned char *tmp_src; /* Pointer to checksum in buffer */ size_t src_nbytes = nbytes; /* Original number of bytes */ uint32_t stored_fletcher; /* Stored checksum value */ /* Get the stored checksum */ src_nbytes -= FLETCHER_LEN; tmp_src=src+src_nbytes; UINT32DECODE(tmp_src, stored_fletcher); /* Compute checksum (can't fail) */ fletcher = H5_checksum_fletcher32(src, src_nbytes); /* The reversed checksum. There was a bug in the calculating code of * the Fletcher32 checksum in the library before v1.6.3. The checksum * value wasn't consistent between big-endian and little-endian systems. * This bug was fixed in Release 1.6.3. However, after fixing the bug, * the checksum value is no longer the same as before on little-endian * system. We'll check both the correct checksum and the wrong * checksum to be consistent with Release 1.6.2 and before. */ HDmemcpy(c, &fletcher, (size_t)4); tmp = c[1]; c[1] = c[0]; c[0] = tmp; tmp = c[3]; c[3] = c[2]; c[2] = tmp; HDmemcpy(&reversed_fletcher, c, (size_t)4); /* Verify computed checksum matches stored checksum */ if(stored_fletcher != fletcher && stored_fletcher != reversed_fletcher) HGOTO_ERROR(H5E_STORAGE, H5E_READERROR, 0, "data error detected by Fletcher32 checksum") } /* Set return values */ /* (Re-use the input buffer, just note that the size is smaller by the size of the checksum) */ ret_value = nbytes-FLETCHER_LEN; } else { /* Write */