From d583ad46d4babd962f362deac20fa5aa6cdce7c7 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 2 Jan 2012 10:22:17 +0000 Subject: adding crc16 to gnunet_crypto_lib.h --- src/include/gnunet_crypto_lib.h | 34 ++++++++++++++++++++++++ src/util/crypto_crc.c | 58 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h index 76806d432..0be9611ba 100644 --- a/src/include/gnunet_crypto_lib.h +++ b/src/include/gnunet_crypto_lib.h @@ -233,6 +233,40 @@ struct GNUNET_CRYPTO_AuthKey void GNUNET_CRYPTO_seed_weak_random (int32_t seed); + +/** + * Perform an incremental step in a CRC16 (for TCP/IP) calculation. + * + * @param sum current sum, initially 0 + * @param hdr buffer to calculate CRC over (must be 16-bit aligned) + * @param len number of bytes in hdr, must be multiple of 2 + * @return updated crc sum (must be subjected to GNUNET_CRYPTO_crc16_finish to get actual crc16) + */ +uint32_t +GNUNET_CRYPTO_crc16_step (uint32_t sum, uint16_t * hdr, size_t len); + + +/** + * Convert results from GNUNET_CRYPTO_crc16_step to final crc16. + * + * @param sum cummulative sum + * @return crc16 value + */ +uint16_t +GNUNET_CRYPTO_crc16_finish (uint32_t sum); + + +/** + * Calculate the checksum of a buffer in one step. + * + * @param hdr buffer to calculate CRC over (must be 16-bit aligned) + * @param len number of bytes in hdr, must be multiple of 2 + * @return crc16 value + */ +uint16_t +GNUNET_CRYPTO_crc16_n (uint16_t *hdr, size_t len); + + /** * Compute the CRC32 checksum for the first len * bytes of the buffer. diff --git a/src/util/crypto_crc.c b/src/util/crypto_crc.c index 698d8d450..c26541457 100644 --- a/src/util/crypto_crc.c +++ b/src/util/crypto_crc.c @@ -17,14 +17,14 @@ Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - For the actual CRC code: + For the actual CRC-32 code: Copyright abandoned; this code is in the public domain. Provided to GNUnet by peter@horizon.com */ /** * @file util/crypto_crc.c - * @brief implementation of CRC32 + * @brief implementation of CRC16 and CRC32 * @author Christian Grothoff */ @@ -113,4 +113,58 @@ GNUNET_CRYPTO_crc32_n (const void *buf, size_t len) return crc; } + + +/** + * Perform an incremental step in a CRC16 (for TCP/IP) calculation. + * + * @param sum current sum, initially 0 + * @param hdr buffer to calculate CRC over (must be 16-bit aligned) + * @param len number of bytes in hdr, must be multiple of 2 + * @return updated crc sum (must be subjected to GNUNET_CRYPTO_crc16_finish to get actual crc16) + */ +uint32_t +GNUNET_CRYPTO_crc16_step (uint32_t sum, uint16_t * hdr, size_t len) +{ + GNUNET_assert (0 == (len & 1)); + for (; len >= 2; len -= 2) + sum += *(hdr++); + if (len == 1) + sum += *((unsigned char *) hdr); + return sum; +} + +/** + * Convert results from GNUNET_CRYPTO_crc16_step to final crc16. + * + * @param sum cummulative sum + * @return crc16 value + */ +uint16_t +GNUNET_CRYPTO_crc16_finish (uint32_t sum) +{ + sum = (sum >> 16) + (sum & 0xFFFF); + sum += (sum >> 16); + + return ~sum; +} + + +/** + * Calculate the checksum of a buffer in one step. + * + * @param hdr buffer to calculate CRC over (must be 16-bit aligned) + * @param len number of bytes in hdr, must be multiple of 2 + * @return crc16 value + */ +uint16_t +GNUNET_CRYPTO_crc16_n (uint16_t *hdr, size_t len) +{ + uint32_t sum = GNUNET_CRYPTO_crc16_step (0, hdr, len); + + return GNUNET_CRYPTO_crc16_finish (sum); +} + + + /* end of crypto_crc.c */ -- cgit v1.2.3