//----------------------------------------------------------------------------- // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of // the license. //----------------------------------------------------------------------------- // ISO15693 CRC & other commons //----------------------------------------------------------------------------- #include "iso15693tools.h" // The CRC as described in ISO 15693-Part 3-Annex C // v buffer with data // n length // returns crc as 16bit value /* uint16_t Iso15693Crc(uint8_t *v, int n) { uint32_t reg; int i, j; reg = 0xffff; for(i = 0; i < n; i++) { reg = reg ^ ((uint32_t)v[i]); for (j = 0; j < 8; j++) { if (reg & 0x0001) { reg = (reg >> 1) ^ 0x8408; } else { reg = (reg >> 1); } } } return ~(uint16_t)(reg & 0xffff); } */ uint16_t Iso15693Crc(uint8_t *d, size_t n){ init_table(CRC_15); return crc16_x25(d, n); } // adds a CRC to a dataframe // d[] iso15963 frame without crc // n length without crc // returns the new length of the dataframe. int Iso15693AddCrc(uint8_t *d, size_t n) { uint16_t crc = Iso15693Crc(d, n); d[n] = crc & 0xff; d[n+1] = crc >> 8; return n + 2; } // check the CRC as described in ISO 15693-Part 3-Annex C // v buffer with data // n length (including crc) // If calculated with crc bytes, the residue should be 0xF0B8 bool Iso15693CheckCrc(uint8_t *d, size_t n) { return (Iso15693Crc(d, n) == ISO15_CRC_CHECK ); //uint16_t crc = Iso15693Crc(v, n-2); // if ( (( crc & 0xff ) == v[n-2]) && (( crc >> 8 ) == v[n-1]) ) // return true; // return false; } int sprintf(char *str, const char *format, ...); // returns a string representation of the UID // UID is transmitted and stored LSB first, displayed MSB first // target char* buffer, where to put the UID, if NULL a static buffer is returned // uid[] the UID in transmission order // return: ptr to string char* Iso15693sprintUID(char *target, uint8_t *uid) { static char tempbuf[2*8+1] = {0}; if (target == NULL) target = tempbuf; 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] ); return target; } uint16_t iclass_crc16(uint8_t *d, uint16_t n) { unsigned int data; uint16_t crc = 0xffff; if (n == 0) return (~crc); do { for (uint8_t i=0, data = *d++; i < 8; i++, data >>= 1) { if ((crc & 0x0001) ^ (data & 0x0001)) crc = (crc >> 1) ^ ISO15_CRC_POLY; else crc >>= 1; } } while (--n); crc = ~crc; data = crc; crc = (crc << 8) | (data >> 8 & 0xff); crc = crc ^ 0xBC3; return crc; }