using System; namespace NFC.Helper.Crypto.CRC { /// /// CRC16 for DESFire Card /// public class CRC16 { public UInt16 Polynomial { get; } = 0x8408; public UInt16 InitValue { get; } = 0x6363; public UInt16 Calculate(byte[] data, UInt16 crc16) { for (int i = 0; i < data.Length; i++) { crc16 ^= data[i]; for (int b = 0; b < 8; b++) { bool b_Bit = (crc16 & 0x01) > 0; crc16 >>= 1; if (b_Bit) { crc16 ^= Polynomial; } } } return crc16; } public byte[] Calculate(params byte[][] data) { UInt16 crc16 = InitValue; foreach(byte[] d in data) { crc16 = Calculate(d, crc16); } return BitConverter.GetBytes(crc16); } } }