]>
git.zerfleddert.de Git - proxmark3-svn/blob - common/iso15693tools.c
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 // ISO15693 CRC & other commons
7 //-----------------------------------------------------------------------------
10 #include "proxmark3.h"
13 //#include "iso15693tools.h"
17 // The CRC as described in ISO 15693-Part 3-Annex C
20 // returns crc as 16bit value
21 uint16_t Iso15693Crc(uint8_t *v
, int n
)
27 for(i
= 0; i
< n
; i
++) {
28 reg
= reg
^ ((uint32_t)v
[i
]);
29 for (j
= 0; j
< 8; j
++) {
31 reg
= (reg
>> 1) ^ 0x8408;
38 return ~(uint16_t)(reg
& 0xffff);
41 // adds a CRC to a dataframe
42 // req[] iso15963 frame without crc
43 // n length without crc
44 // returns the new length of the dataframe.
45 int Iso15693AddCrc(uint8_t *req
, int n
) {
46 uint16_t crc
=Iso15693Crc(req
,n
);
53 int sprintf(char *str
, const char *format
, ...);
55 // returns a string representation of the UID
56 // UID is transmitted and stored LSB first, displayed MSB first
57 // target char* buffer, where to put the UID, if NULL a static buffer is returned
58 // uid[] the UID in transmission order
59 // return: ptr to string
60 char* Iso15693sprintUID(char *target
,uint8_t *uid
) {
61 static char tempbuf
[2*8+1]="";
62 if (target
==NULL
) target
=tempbuf
;
63 sprintf(target
,"%02X%02X%02X%02X%02X%02X%02X%02X",
64 uid
[7],uid
[6],uid
[5],uid
[4],uid
[3],uid
[2],uid
[1],uid
[0]);
68 //CRC-16 Routine used within iclass
69 unsigned short iclass_crc16(char *data_p
, unsigned short length
)
73 unsigned int crc
= 0xffff;
80 for (i
=0, data
=(unsigned int)0xff & *data_p
++;
84 if ((crc
& 0x0001) ^ (data
& 0x0001))
85 crc
= (crc
>> 1) ^ POLY
;
92 crc
= (crc
<< 8) | (data
>> 8 & 0xff);