From 44ae2a75e44a7e6d1b83e8151bcd4bda03a69aee Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 25 Sep 2020 18:00:21 +0100 Subject: [PATCH] trivial: Add CRC8 as well --- libfwupdplugin/fu-common.c | 26 ++++++++++++++++++++++++++ libfwupdplugin/fu-common.h | 2 ++ libfwupdplugin/fu-self-test.c | 1 + libfwupdplugin/fwupdplugin.map | 1 + plugins/vli/fu-vli-common.c | 15 --------------- plugins/vli/fu-vli-common.h | 3 --- plugins/vli/fu-vli-usbhub-common.c | 2 +- 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/libfwupdplugin/fu-common.c b/libfwupdplugin/fu-common.c index ee8969260..13db2afa5 100644 --- a/libfwupdplugin/fu-common.c +++ b/libfwupdplugin/fu-common.c @@ -2336,6 +2336,32 @@ fu_common_get_esp_for_path (const gchar *esp_path, GError **error) return NULL; } +/** + * fu_common_crc8: + * @buf: memory buffer + * @bufsz: sizeof buf + * + * Returns the cyclic redundancy check value for the given memory buffer. + * + * Returns: CRC value + * + * Since: 1.5.0 + **/ +guint8 +fu_common_crc8 (const guint8 *buf, gsize bufsz) +{ + guint32 crc = 0; + for (gsize j = bufsz; j > 0; j--) { + crc ^= (*(buf++) << 8); + for (guint32 i = 8; i; i--) { + if (crc & 0x8000) + crc ^= (0x1070 << 3); + crc <<= 1; + } + } + return ~((guint8) (crc >> 8)); +} + /** * fu_common_crc16: * @buf: memory buffer diff --git a/libfwupdplugin/fu-common.h b/libfwupdplugin/fu-common.h index 2d15f41c2..c65dafa7c 100644 --- a/libfwupdplugin/fu-common.h +++ b/libfwupdplugin/fu-common.h @@ -240,6 +240,8 @@ FuVolume *fu_common_get_esp_for_path (const gchar *esp_path, GError **error); FuVolume *fu_common_get_esp_default (GError **error); +guint8 fu_common_crc8 (const guint8 *buf, + gsize bufsz); guint16 fu_common_crc16 (const guint8 *buf, gsize bufsz); guint32 fu_common_crc32 (const guint8 *buf, diff --git a/libfwupdplugin/fu-self-test.c b/libfwupdplugin/fu-self-test.c index e6cb49ffc..383788f9d 100644 --- a/libfwupdplugin/fu-self-test.c +++ b/libfwupdplugin/fu-self-test.c @@ -111,6 +111,7 @@ static void fu_common_crc_func (void) { guint8 buf[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }; + g_assert_cmpint (fu_common_crc8 (buf, sizeof(buf)), ==, 0x7A); g_assert_cmpint (fu_common_crc16 (buf, sizeof(buf)), ==, 0x4DF1); g_assert_cmpint (fu_common_crc32 (buf, sizeof(buf)), ==, 0x40EFAB9E); } diff --git a/libfwupdplugin/fwupdplugin.map b/libfwupdplugin/fwupdplugin.map index 6a1910db9..7164d61b3 100644 --- a/libfwupdplugin/fwupdplugin.map +++ b/libfwupdplugin/fwupdplugin.map @@ -616,6 +616,7 @@ LIBFWUPDPLUGIN_1.5.0 { fu_common_crc16; fu_common_crc32; fu_common_crc32_full; + fu_common_crc8; fu_common_filename_glob; fu_common_is_cpu_intel; fu_device_bind_driver; diff --git a/plugins/vli/fu-vli-common.c b/plugins/vli/fu-vli-common.c index 38e93537a..c5b7fda1b 100644 --- a/plugins/vli/fu-vli-common.c +++ b/plugins/vli/fu-vli-common.c @@ -9,21 +9,6 @@ #include "fu-vli-common.h" -guint8 -fu_vli_common_crc8 (const guint8 *buf, gsize bufsz) -{ - guint32 crc = 0; - for (gsize j = bufsz; j > 0; j--) { - crc ^= (*(buf++) << 8); - for (guint32 i = 8; i; i--) { - if (crc & 0x8000) - crc ^= (0x1070 << 3); - crc <<= 1; - } - } - return (guint8) (crc >> 8); -} - const gchar * fu_vli_common_device_kind_to_string (FuVliDeviceKind device_kind) { diff --git a/plugins/vli/fu-vli-common.h b/plugins/vli/fu-vli-common.h index e3c2c9e35..30d964835 100644 --- a/plugins/vli/fu-vli-common.h +++ b/plugins/vli/fu-vli-common.h @@ -43,6 +43,3 @@ const gchar *fu_vli_common_device_kind_to_string (FuVliDeviceKind device_kind); FuVliDeviceKind fu_vli_common_device_kind_from_string (const gchar *device_kind); guint32 fu_vli_common_device_kind_get_size (FuVliDeviceKind device_kind); guint32 fu_vli_common_device_kind_get_offset (FuVliDeviceKind device_kind); - -guint8 fu_vli_common_crc8 (const guint8 *buf, - gsize bufsz); diff --git a/plugins/vli/fu-vli-usbhub-common.c b/plugins/vli/fu-vli-usbhub-common.c index e45ee85d8..3fa77f964 100644 --- a/plugins/vli/fu-vli-usbhub-common.c +++ b/plugins/vli/fu-vli-usbhub-common.c @@ -12,7 +12,7 @@ guint8 fu_vli_usbhub_header_crc8 (FuVliUsbhubHeader *hdr) { - return fu_vli_common_crc8 ((const guint8 *) hdr, sizeof(*hdr) - 1); + return ~fu_common_crc8 ((const guint8 *) hdr, sizeof(*hdr) - 1); } void