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
)
13 ch
= (ch
^ (unsigned char) ((*lpwCrc
) & 0x00FF));
14 ch
= (ch
^ (ch
<< 4));
15 *lpwCrc
= (*lpwCrc
>> 8) ^ ((unsigned short) ch
<< 8) ^
16 ((unsigned short) ch
<< 3) ^ ((unsigned short) ch
>> 4);
20 void ComputeCrc14443(int CrcType
,
21 const unsigned char *Data
, int Length
,
22 unsigned char *TransmitFirst
,
23 unsigned char *TransmitSecond
)
25 unsigned char chBlock
;
26 unsigned short wCrc
=CrcType
;
30 UpdateCrc14443(chBlock
, &wCrc
);
33 if (CrcType
== CRC_14443_B
)
34 wCrc
= ~wCrc
; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
36 *TransmitFirst
= (unsigned char) (wCrc
& 0xFF);
37 *TransmitSecond
= (unsigned char) ((wCrc
>> 8) & 0xFF);
41 int CheckCrc14443(int CrcType
, const unsigned char *Data
, int Length
) {
44 if (Length
< 3) return 0;
45 ComputeCrc14443(CrcType
, Data
, Length
- 2, &b1
, &b2
);
46 if ((b1
== Data
[Length
- 2]) && (b2
== Data
[Length
- 1])) return 1;