diff --git a/SabreTools.Hashing.Test/TestHelper.cs b/SabreTools.Hashing.Test/TestHelper.cs
index abbe4f7..0edb1f7 100644
--- a/SabreTools.Hashing.Test/TestHelper.cs
+++ b/SabreTools.Hashing.Test/TestHelper.cs
@@ -21,6 +21,28 @@ namespace SabreTools.Hashing.Test
{HashType.BLAKE3, "d4bd7ca6f1ebea9580d9381106b248eb5b6069170d0bfd00b17d659fcd10dcdc"},
#endif
+ {HashType.CRC8, "fc"},
+ {HashType.CRC8_AUTOSAR, "ca"},
+ {HashType.CRC8_BLUETOOTH, "00"},
+ {HashType.CRC8_CDMA2000, "2d"},
+ {HashType.CRC8_DARC, "35"},
+ {HashType.CRC8_DVBS2, "5c"},
+ {HashType.CRC8_GSMA, "d8"},
+ {HashType.CRC8_GSMB, "f3"},
+ {HashType.CRC8_HITAG, "aa"},
+ {HashType.CRC8_I4321, "a9"},
+ {HashType.CRC8_ICODE, "61"},
+ {HashType.CRC8_LTE, "d7"},
+ {HashType.CRC8_MAXIMDOW, "bd"},
+ {HashType.CRC8_MIFAREMAD, "9b"},
+ {HashType.CRC8_NRSC5, "e2"},
+ {HashType.CRC8_OPENSAFETY, "fc"},
+ {HashType.CRC8_ROHC, "17"},
+ {HashType.CRC8_SAEJ1850, "55"},
+ {HashType.CRC8_SMBUS, "fc"},
+ {HashType.CRC8_TECH3250, "7d"},
+ {HashType.CRC8_WCDMA, "c6"},
+
{HashType.CRC10_ATM, "26b"},
{HashType.CRC10_CDMA2000, "14f"},
{HashType.CRC10_GSM, "0e7"},
diff --git a/SabreTools.Hashing/Crc/StandardDefinitions.cs b/SabreTools.Hashing/Crc/StandardDefinitions.cs
index 32db76d..dc447eb 100644
--- a/SabreTools.Hashing/Crc/StandardDefinitions.cs
+++ b/SabreTools.Hashing/Crc/StandardDefinitions.cs
@@ -3,6 +3,290 @@ namespace SabreTools.Hashing.Crc
///
internal static class StandardDefinitions
{
+ #region CRC-8
+
+ ///
+ /// CRC-8/AUTOSAR
+ ///
+ public static readonly CrcDefinition CRC8_AUTOSAR = new()
+ {
+ Name = "CRC-8/AUTOSAR",
+ Width = 8,
+ Poly = 0x2f,
+ Init = 0xff,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0xff,
+ };
+
+ ///
+ /// CRC-8/BLUETOOTH
+ ///
+ public static readonly CrcDefinition CRC8_BLUETOOTH = new()
+ {
+ Name = "CRC-8/BLUETOOTH",
+ Width = 8,
+ Poly = 0xa7,
+ Init = 0x00,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/CDMA2000
+ ///
+ public static readonly CrcDefinition CRC8_CDMA2000 = new()
+ {
+ Name = "CRC-8/CDMA2000",
+ Width = 8,
+ Poly = 0x9b,
+ Init = 0xff,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/DARC
+ ///
+ public static readonly CrcDefinition CRC8_DARC = new()
+ {
+ Name = "CRC-8/DARC",
+ Width = 8,
+ Poly = 0x39,
+ Init = 0x00,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/DVB-S2
+ ///
+ public static readonly CrcDefinition CRC8_DVBS2 = new()
+ {
+ Name = "CRC-8/DVB-S2",
+ Width = 8,
+ Poly = 0xd5,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/GSM-A
+ ///
+ public static readonly CrcDefinition CRC8_GSMA = new()
+ {
+ Name = "CRC-8/GSM-A",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/GSM-B
+ ///
+ public static readonly CrcDefinition CRC8_GSMB = new()
+ {
+ Name = "CRC-8/GSM-B",
+ Width = 8,
+ Poly = 0x49,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0xff,
+ };
+
+ ///
+ /// CRC-8/HITAG
+ ///
+ public static readonly CrcDefinition CRC8_HITAG = new()
+ {
+ Name = "CRC-8/HITAG",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0xff,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/I-432-1 [CRC-8/ITU]
+ ///
+ public static readonly CrcDefinition CRC8_I4321 = new()
+ {
+ Name = "CRC-8/I-432-1",
+ Width = 8,
+ Poly = 0x07,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x55,
+ };
+
+ ///
+ /// CRC-8/I-CODE
+ ///
+ public static readonly CrcDefinition CRC8_ICODE = new()
+ {
+ Name = "CRC-8/I-CODE",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0xfd,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/LTE
+ ///
+ public static readonly CrcDefinition CRC8_LTE = new()
+ {
+ Name = "CRC-8/LTE",
+ Width = 8,
+ Poly = 0x9b,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/MAXIM-DOW [CRC-8/MAXIM, DOW-CRC]
+ ///
+ public static readonly CrcDefinition CRC8_MAXIMDOW = new()
+ {
+ Name = "CRC-8/MAXIM-DOW",
+ Width = 8,
+ Poly = 0x31,
+ Init = 0x00,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/MIFARE-MAD
+ ///
+ public static readonly CrcDefinition CRC8_MIFAREMAD = new()
+ {
+ Name = "CRC-8/MIFARE-MAD",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0xc7,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/NRSC-5
+ ///
+ public static readonly CrcDefinition CRC8_NRSC5 = new()
+ {
+ Name = "CRC-8/NRSC-5",
+ Width = 8,
+ Poly = 0x31,
+ Init = 0xff,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/OPENSAFETY
+ ///
+ public static readonly CrcDefinition CRC8_OPENSAFETY = new()
+ {
+ Name = "CRC-8/OPENSAFETY",
+ Width = 8,
+ Poly = 0x2f,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/ROHC
+ ///
+ public static readonly CrcDefinition CRC8_ROHC = new()
+ {
+ Name = "CRC-8/ROHC",
+ Width = 8,
+ Poly = 0x07,
+ Init = 0xff,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/SAE-J1850
+ ///
+ public static readonly CrcDefinition CRC8_SAEJ1850 = new()
+ {
+ Name = "CRC-8/SAE-J1850",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0xff,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0xff,
+ };
+
+ ///
+ /// CRC-8/SMBUS [CRC-8]
+ ///
+ public static readonly CrcDefinition CRC8_SMBUS = new()
+ {
+ Name = "CRC-8/SMBUS",
+ Width = 8,
+ Poly = 0x07,
+ Init = 0x00,
+ ReflectIn = false,
+ ReflectOut = false,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/TECH-3250 [CRC-8/AES, CRC-8/EBU]
+ ///
+ public static readonly CrcDefinition CRC8_TECH3250 = new()
+ {
+ Name = "CRC-8/TECH-3250",
+ Width = 8,
+ Poly = 0x1d,
+ Init = 0xff,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ ///
+ /// CRC-8/WCDMA
+ ///
+ public static readonly CrcDefinition CRC8_WCDMA = new()
+ {
+ Name = "CRC-8/WCDMA",
+ Width = 8,
+ Poly = 0x9b,
+ Init = 0x00,
+ ReflectIn = true,
+ ReflectOut = true,
+ XorOut = 0x00,
+ };
+
+ #endregion
+
#region CRC-10
///
diff --git a/SabreTools.Hashing/HashType.cs b/SabreTools.Hashing/HashType.cs
index ea2f3a0..ba51a5c 100644
--- a/SabreTools.Hashing/HashType.cs
+++ b/SabreTools.Hashing/HashType.cs
@@ -17,6 +17,116 @@ namespace SabreTools.Hashing
BLAKE3,
#endif
+ #region CRC-8
+
+ ///
+ /// CRC 8-bit checksum
+ ///
+ /// Identical to
+ CRC8,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/AUTOSAR)
+ ///
+ CRC8_AUTOSAR,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/BLUETOOTH)
+ ///
+ CRC8_BLUETOOTH,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/CDMA2000)
+ ///
+ CRC8_CDMA2000,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/DARC)
+ ///
+ CRC8_DARC,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/DVB-S2)
+ ///
+ CRC8_DVBS2,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/GSM-A)
+ ///
+ CRC8_GSMA,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/GSM-B)
+ ///
+ CRC8_GSMB,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/HITAG)
+ ///
+ CRC8_HITAG,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/I-432-1 [CRC-8/ITU])
+ ///
+ CRC8_I4321,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/I-CODE)
+ ///
+ CRC8_ICODE,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/LTE)
+ ///
+ CRC8_LTE,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/MAXIM-DOW [CRC-8/MAXIM, DOW-CRC])
+ ///
+ CRC8_MAXIMDOW,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/MIFARE-MAD)
+ ///
+ CRC8_MIFAREMAD,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/NRSC-5)
+ ///
+ CRC8_NRSC5,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/OPENSAFETY)
+ ///
+ CRC8_OPENSAFETY,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/ROHC)
+ ///
+ CRC8_ROHC,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/SAE-J1850)
+ ///
+ CRC8_SAEJ1850,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/SMBUS [CRC-8])
+ ///
+ CRC8_SMBUS,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/TECH-3250 [CRC-8/AES, CRC-8/EBU])
+ ///
+ CRC8_TECH3250,
+
+ ///
+ /// CRC 8-bit checksum (CRC-8/WCDMA)
+ ///
+ CRC8_WCDMA,
+
+ #endregion
+
#region CRC-10
///
diff --git a/SabreTools.Hashing/HashWrapper.cs b/SabreTools.Hashing/HashWrapper.cs
index 8d3157c..62be7c5 100644
--- a/SabreTools.Hashing/HashWrapper.cs
+++ b/SabreTools.Hashing/HashWrapper.cs
@@ -119,6 +119,28 @@ namespace SabreTools.Hashing
HashType.BLAKE3 => new Blake3HashAlgorithm(),
#endif
+ HashType.CRC8 => new CrcRunner(StandardDefinitions.CRC8_SMBUS),
+ HashType.CRC8_AUTOSAR => new CrcRunner(StandardDefinitions.CRC8_AUTOSAR),
+ HashType.CRC8_BLUETOOTH => new CrcRunner(StandardDefinitions.CRC8_BLUETOOTH),
+ HashType.CRC8_CDMA2000 => new CrcRunner(StandardDefinitions.CRC8_CDMA2000),
+ HashType.CRC8_DARC => new CrcRunner(StandardDefinitions.CRC8_DARC),
+ HashType.CRC8_DVBS2 => new CrcRunner(StandardDefinitions.CRC8_DVBS2),
+ HashType.CRC8_GSMA => new CrcRunner(StandardDefinitions.CRC8_GSMA),
+ HashType.CRC8_GSMB => new CrcRunner(StandardDefinitions.CRC8_GSMB),
+ HashType.CRC8_HITAG => new CrcRunner(StandardDefinitions.CRC8_HITAG),
+ HashType.CRC8_I4321 => new CrcRunner(StandardDefinitions.CRC8_I4321),
+ HashType.CRC8_ICODE => new CrcRunner(StandardDefinitions.CRC8_ICODE),
+ HashType.CRC8_LTE => new CrcRunner(StandardDefinitions.CRC8_LTE),
+ HashType.CRC8_MAXIMDOW => new CrcRunner(StandardDefinitions.CRC8_MAXIMDOW),
+ HashType.CRC8_MIFAREMAD => new CrcRunner(StandardDefinitions.CRC8_MIFAREMAD),
+ HashType.CRC8_NRSC5 => new CrcRunner(StandardDefinitions.CRC8_NRSC5),
+ HashType.CRC8_OPENSAFETY => new CrcRunner(StandardDefinitions.CRC8_OPENSAFETY),
+ HashType.CRC8_ROHC => new CrcRunner(StandardDefinitions.CRC8_ROHC),
+ HashType.CRC8_SAEJ1850 => new CrcRunner(StandardDefinitions.CRC8_SAEJ1850),
+ HashType.CRC8_SMBUS => new CrcRunner(StandardDefinitions.CRC8_SMBUS),
+ HashType.CRC8_TECH3250 => new CrcRunner(StandardDefinitions.CRC8_TECH3250),
+ HashType.CRC8_WCDMA => new CrcRunner(StandardDefinitions.CRC8_WCDMA),
+
HashType.CRC10_ATM => new CrcRunner(StandardDefinitions.CRC10_ATM),
HashType.CRC10_CDMA2000 => new CrcRunner(StandardDefinitions.CRC10_CDMA2000),
HashType.CRC10_GSM => new CrcRunner(StandardDefinitions.CRC10_GSM),