1 //-----------------------------------------------------------------------------
2 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
3 // at your option, any later version. See the LICENSE.txt file for the text of
5 //-----------------------------------------------------------------------------
6 // ISO14443 CRC calculation code.
7 //-----------------------------------------------------------------------------
9 #include "iso14443crc.h"
11 static unsigned short UpdateCrc14443(unsigned char ch
, unsigned short *lpwCrc
) {
12 ch
= (ch
^ (unsigned char)((*lpwCrc
) & 0x00FF));
13 ch
= (ch
^ (ch
<< 4));
14 *lpwCrc
= (*lpwCrc
>> 8) ^ ((unsigned short) ch
<< 8) ^
15 ((unsigned short) ch
<< 3) ^ ((unsigned short) ch
>> 4);
19 void ComputeCrc14443(int CrcType
,
20 const unsigned char *Data
, int Length
,
21 unsigned char *TransmitFirst
,
22 unsigned char *TransmitSecond
) {
23 unsigned char chBlock
;
24 unsigned short wCrc
= CrcType
;
28 UpdateCrc14443(chBlock
, &wCrc
);
31 if (CrcType
== CRC_14443_B
)
32 wCrc
= ~wCrc
; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
34 *TransmitFirst
= (unsigned char)(wCrc
& 0xFF);
35 *TransmitSecond
= (unsigned char)((wCrc
>> 8) & 0xFF);
39 int CheckCrc14443(int CrcType
, const unsigned char *Data
, int Length
) {
42 if (Length
< 3) return 0;
43 ComputeCrc14443(CrcType
, Data
, Length
- 2, &b1
, &b2
);
44 if ((b1
== Data
[Length
- 2]) && (b2
== Data
[Length
- 1])) return 1;