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),