ISO/IEC14443a CRC计算
ISO/IEC 14443a CRC Calcuation
大家好,我正在完成我的 NFC 项目固件的最后一部分。我正在尝试与使用 NXP 的 MF0ULx1 MIFARE Ultralight EV1 - 非接触式票证 IC 的 AD-740 NFC 标签进行通信。我用的NFCreader是NXP的CLRC663。我正在通过 SPI 使用 PSOC5LP 设备控制 NFC reader。
现在你已经了解了所有的背景信息,我现在要问我的问题了。
对于这个特定的 NXP Read Method 我需要将我的 Cmd 和 Addr 编码为长度为 2 字节的 CRC。我可以 link 参考的数据表引用了 ISO/IEC 14443。在 Google 中搜索它会将我带到维基百科页面,然后显示 PDF 的四个部分。我假设我需要传输协议部分的第 4 部分。唯一的问题是这个 PDF 被付费墙屏蔽了。这是故意的吗??
我在互联网上四处搜寻,发现了一些代码示例,可能会阻止我购买 170 美元的 PDF 只是为了查看多项式...
代码示例 1 - 我可以在评论中 post 来源 link。没有代表在主要 post.
中执行此操作
// Calculate an ISO 14443a CRC. Code translated from the code in
// iso14443a_crc().
func ISO14443aCRC(data []byte) [2]byte {
crc := uint32(0x6363)
for _, bt := range data
{
bt ^= uint8(crc & 0xff)
bt ^= bt << 4
bt32 := uint32(bt)
crc = (crc >> 8) ^ (bt32 << 8) ^ (bt32 << 3) ^ (bt32 >> 4)
}
return [2]byte{byte(crc & 0xff), byte((crc >> 8) & 0xff)}
}
代码示例 2 - 我可以在评论中 post 来源 link。没有代表在主要 post.
中执行此操作
void iso14443a_crc(byte_t* pbtData, size_t szLen, byte_t* pbtCrc)
{
byte_t bt;
uint32_t wCrc = 0x6363;
do {
bt = *pbtData++;
bt = (bt^(byte_t)(wCrc & 0x00FF));
bt = (bt^(bt<<4));
wCrc = (wCrc >> 8)^((uint32_t)bt << 8)^((uint32_t)bt<<3)^((uint32_t)bt>>4);
} while (--szLen);
*pbtCrc++ = (byte_t) (wCrc & 0xFF);
*pbtCrc = (byte_t) ((wCrc >> 8) & 0xFF);
}
现在我的最后一个问题 包含所有这些信息...可以安全地假设:
CRC多项式为:0x6363
种子值为:0x00FF
可以看到视觉表示here
ISO14443A多项式为0x8408,初始值为0x6363。
我在计算 ISO/IEC 14443 的 CRC_A 时找到了一些有用的资源:
- Online calculator by Pavel Zhovner
- Generic CRC calculator
- Libnfc 包含 CRC_A 和 CRC_B 的实现:
- iso14443a_crc in iso14443-subr.c
- iso14443b_crc in iso14443-subr.c
- 每个方法还有一个变体可以将其附加到字节数组
为了后代,这里是 libnfc 的 iso14443a_crc
实现:
void
iso14443a_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc)
{
uint32_t wCrc = 0x6363;
do {
uint8_t bt;
bt = *pbtData++;
bt = (bt ^ (uint8_t)(wCrc & 0x00FF));
bt = (bt ^ (bt << 4));
wCrc = (wCrc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
} while (--szLen);
*pbtCrc++ = (uint8_t)(wCrc & 0xFF);
*pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF);
}
大家好,我正在完成我的 NFC 项目固件的最后一部分。我正在尝试与使用 NXP 的 MF0ULx1 MIFARE Ultralight EV1 - 非接触式票证 IC 的 AD-740 NFC 标签进行通信。我用的NFCreader是NXP的CLRC663。我正在通过 SPI 使用 PSOC5LP 设备控制 NFC reader。
现在你已经了解了所有的背景信息,我现在要问我的问题了。
对于这个特定的 NXP Read Method 我需要将我的 Cmd 和 Addr 编码为长度为 2 字节的 CRC。我可以 link 参考的数据表引用了 ISO/IEC 14443。在 Google 中搜索它会将我带到维基百科页面,然后显示 PDF 的四个部分。我假设我需要传输协议部分的第 4 部分。唯一的问题是这个 PDF 被付费墙屏蔽了。这是故意的吗??
我在互联网上四处搜寻,发现了一些代码示例,可能会阻止我购买 170 美元的 PDF 只是为了查看多项式...
代码示例 1 - 我可以在评论中 post 来源 link。没有代表在主要 post.
中执行此操作 // Calculate an ISO 14443a CRC. Code translated from the code in
// iso14443a_crc().
func ISO14443aCRC(data []byte) [2]byte {
crc := uint32(0x6363)
for _, bt := range data
{
bt ^= uint8(crc & 0xff)
bt ^= bt << 4
bt32 := uint32(bt)
crc = (crc >> 8) ^ (bt32 << 8) ^ (bt32 << 3) ^ (bt32 >> 4)
}
return [2]byte{byte(crc & 0xff), byte((crc >> 8) & 0xff)}
}
代码示例 2 - 我可以在评论中 post 来源 link。没有代表在主要 post.
中执行此操作 void iso14443a_crc(byte_t* pbtData, size_t szLen, byte_t* pbtCrc)
{
byte_t bt;
uint32_t wCrc = 0x6363;
do {
bt = *pbtData++;
bt = (bt^(byte_t)(wCrc & 0x00FF));
bt = (bt^(bt<<4));
wCrc = (wCrc >> 8)^((uint32_t)bt << 8)^((uint32_t)bt<<3)^((uint32_t)bt>>4);
} while (--szLen);
*pbtCrc++ = (byte_t) (wCrc & 0xFF);
*pbtCrc = (byte_t) ((wCrc >> 8) & 0xFF);
}
现在我的最后一个问题 包含所有这些信息...可以安全地假设:
CRC多项式为:0x6363
种子值为:0x00FF
可以看到视觉表示here
ISO14443A多项式为0x8408,初始值为0x6363。
我在计算 ISO/IEC 14443 的 CRC_A 时找到了一些有用的资源:
- Online calculator by Pavel Zhovner
- Generic CRC calculator
- Libnfc 包含 CRC_A 和 CRC_B 的实现:
- iso14443a_crc in iso14443-subr.c
- iso14443b_crc in iso14443-subr.c
- 每个方法还有一个变体可以将其附加到字节数组
为了后代,这里是 libnfc 的 iso14443a_crc
实现:
void
iso14443a_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc)
{
uint32_t wCrc = 0x6363;
do {
uint8_t bt;
bt = *pbtData++;
bt = (bt ^ (uint8_t)(wCrc & 0x00FF));
bt = (bt ^ (bt << 4));
wCrc = (wCrc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
} while (--szLen);
*pbtCrc++ = (uint8_t)(wCrc & 0xFF);
*pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF);
}