From 71e181512d1cd61d3865f93f5b85b208b5720ba5 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 17 Jan 2016 16:05:16 +0000 Subject: add crc8 --- src/include/gnunet_crypto_lib.h | 15 +++++++++++++++ src/util/crypto_crc.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h index 77b4d0452..23caade12 100644 --- a/src/include/gnunet_crypto_lib.h +++ b/src/include/gnunet_crypto_lib.h @@ -402,6 +402,19 @@ void GNUNET_CRYPTO_seed_weak_random (int32_t seed); +/** + * @ingroup hash + * Calculate the checksum of a buffer in one step. + * + * @param buf buffer to calculate CRC over + * @param len number of bytes in @a buf + * @return crc8 value + */ +uint8_t +GNUNET_CRYPTO_crc8_n (const void *buf, + size_t len); + + /** * Perform an incremental step in a CRC16 (for TCP/IP) calculation. * @@ -439,6 +452,8 @@ GNUNET_CRYPTO_crc16_n (const void *buf, size_t len); + + /** * @ingroup hash * Compute the CRC32 checksum for the first len diff --git a/src/util/crypto_crc.c b/src/util/crypto_crc.c index ec2e80683..b5df01959 100644 --- a/src/util/crypto_crc.c +++ b/src/util/crypto_crc.c @@ -165,5 +165,35 @@ GNUNET_CRYPTO_crc16_n (const void *buf, size_t len) } +/** + * @ingroup hash + * Calculate the checksum of a buffer in one step. + * + * @param buf buffer to calculate CRC over + * @param len number of bytes in @a buf + * @return crc8 value + */ +uint8_t +GNUNET_CRYPTO_crc8_n (const void *buf, + size_t len) +{ + const uint8_t *data = buf; + unsigned int crc = 0; + int i; + int j; + + for (j = len; 0 != j; j--) + { + crc ^= (*data++ << 8); + for (i = 8; 0 != i; i--) + { + if (0 != (crc & 0x8000)) + crc ^= (0x1070 << 3); + crc <<= 1; + } + } + return (uint8_t) (crc >> 8); +} + /* end of crypto_crc.c */ -- cgit v1.2.3