mirror of
https://gitlab.com/fabinfra/fabaccess/nfc.git
synced 2025-03-12 14:51:51 +01:00
45 lines
1.0 KiB
C#
45 lines
1.0 KiB
C#
using System;
|
|
|
|
namespace NFC.Helper.Crypto.CRC
|
|
{
|
|
/// <summary>
|
|
/// CRC16 for DESFire Card
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|