diff --git a/src/crypto_utils.c b/src/crypto_utils.c index 7adba39..84a3213 100644 --- a/src/crypto_utils.c +++ b/src/crypto_utils.c @@ -278,3 +278,16 @@ mbedtls_ecp_group_id ec_get_curve_from_prime(const uint8_t *prime, size_t prime_ } return MBEDTLS_ECP_DP_NONE; } + +#define POLY 0xedb88320 + +uint32_t crc32c(const uint8_t *buf, size_t len) { + uint32_t crc = 0xffffffff; + while (len--) { + crc ^= *buf++; + for (int k = 0; k < 8; k++) { + crc = (crc >> 1) ^ (POLY & (0 - (crc & 1))); + } + } + return ~crc; +} diff --git a/src/crypto_utils.h b/src/crypto_utils.h index 83631fb..c2952b9 100644 --- a/src/crypto_utils.h +++ b/src/crypto_utils.h @@ -56,5 +56,6 @@ extern int aes_decrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, extern int aes_encrypt_cfb_256(const uint8_t *key, const uint8_t *iv, uint8_t *data, uint16_t len); extern int aes_decrypt_cfb_256(const uint8_t *key, const uint8_t *iv, uint8_t *data, uint16_t len); extern mbedtls_ecp_group_id ec_get_curve_from_prime(const uint8_t *prime, size_t prime_len); +extern uint32_t crc32c(const uint8_t *buf, size_t len); #endif