]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/iso15693tools.c
2da6c7f9f3e312cce39cdeacb95d1780c12157fa
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 "iso15693tools.h"
12 #include "proxmark3.h"
22 #define ISO15693_CRC_PRESET (uint16_t)0xFFFF
23 #define ISO15693_CRC_POLY (uint16_t)0x8408
26 // The CRC as described in ISO 15693-Part 3-Annex C
29 // returns crc as 16bit value
30 uint16_t Iso15693Crc(uint8_t *v
, int n
) {
34 reg
= ISO15693_CRC_PRESET
;
35 for (i
= 0; i
< n
; i
++) {
36 reg
= reg
^ ((uint32_t)v
[i
]);
37 for (j
= 0; j
< 8; j
++) {
39 reg
= (reg
>> 1) ^ ISO15693_CRC_POLY
;
46 return ~(uint16_t)(reg
& 0xffff);
49 // adds a CRC to a dataframe
50 // req[] iso15963 frame without crc
51 // n length without crc
52 // returns the new length of the dataframe.
53 int Iso15693AddCrc(uint8_t *req
, int n
) {
54 uint16_t crc
= Iso15693Crc(req
, n
);
61 // returns a string representation of the UID
62 // UID is transmitted and stored LSB first, displayed MSB first
63 // target char* buffer, where to put the UID, if NULL a static buffer is returned
64 // uid[] the UID in transmission order
65 // return: ptr to string
66 char* Iso15693sprintUID(char *target
, uint8_t *uid
) {
67 static char tempbuf
[2*8+1] = "";
68 if (target
== NULL
) target
= tempbuf
;
69 sprintf(target
, "%02X%02X%02X%02X%02X%02X%02X%02X", uid
[7], uid
[6], uid
[5], uid
[4], uid
[3], uid
[2], uid
[1], uid
[0]);
74 uint16_t iclass_crc16(char *data_p
, unsigned short length
) {
77 uint16_t crc
= ISO15693_CRC_PRESET
;
83 for (i
= 0, data
= (unsigned int)0xff & *data_p
++; i
< 8; i
++, data
>>= 1) {
84 if ((crc
& 0x0001) ^ (data
& 0x0001))
85 crc
= (crc
>> 1) ^ ISO15693_CRC_POLY
;
92 crc
= (crc
<< 8) | (data
>> 8 & 0xff);