|
@@ -198,6 +198,25 @@ char ClaCheckSum(unsigned char *buffer, int len)
|
|
|
return chksum;
|
|
|
}
|
|
|
|
|
|
+int chksumValid(unsigned char * buffer)
|
|
|
+{
|
|
|
+ int result = FAIL;
|
|
|
+ int chksum = 0;
|
|
|
+
|
|
|
+ if(buffer[0] > 2)
|
|
|
+ {
|
|
|
+ for(int idx=0;idx<(buffer[0]);idx++)
|
|
|
+ {
|
|
|
+ chksum ^= buffer[idx];
|
|
|
+ }
|
|
|
+
|
|
|
+ if(chksum == buffer[buffer[0]])
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
bool getRequestCardSN(int Fd, int moduleType, RFID* rfid)
|
|
|
{
|
|
|
bool isSuccess = false;
|
|
@@ -250,15 +269,14 @@ bool ISO14443A_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
{
|
|
|
bool isSuccess = false;
|
|
|
int tx_len = 4;
|
|
|
- unsigned char txByte[tx_len];
|
|
|
- unsigned char rxByte[254];
|
|
|
- unsigned char tmp[254];
|
|
|
+ unsigned char txByte[4] = {0};
|
|
|
+ unsigned char rxByte[254] = {0};
|
|
|
|
|
|
- unsigned char TX_MESSAGE[254];
|
|
|
- unsigned char RX_MESSAGE[254];
|
|
|
- unsigned char TMP_MESSAGE[254];
|
|
|
- unsigned char TX_LENGTH;
|
|
|
- unsigned char RX_LENGTH;
|
|
|
+ unsigned char TX_MESSAGE[254] = {0};
|
|
|
+ unsigned char RX_MESSAGE[254] = {0};
|
|
|
+ unsigned char TMP_MESSAGE[254] = {0};
|
|
|
+ unsigned char TX_LENGTH = 0;
|
|
|
+ unsigned char RX_LENGTH = 0;
|
|
|
|
|
|
switch(moduleType)
|
|
|
{
|
|
@@ -274,41 +292,42 @@ bool ISO14443A_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
|
|
|
if(Fd > 0)
|
|
|
{
|
|
|
- memset(rxByte, 0, sizeof (rxByte));
|
|
|
if(system_command(Fd, txByte, tx_len, rxByte) > 0)
|
|
|
{
|
|
|
- memset(tmp, 0, sizeof tmp);
|
|
|
- memcpy(tmp, rxByte, sizeof(rxByte));
|
|
|
- if(tmp[1] == RFID_CMD_ISO1443A_REQUEST)
|
|
|
+ if(chksumValid(rxByte) == PASS)
|
|
|
{
|
|
|
- if(tmp[0] == 0x09)
|
|
|
+ if((rxByte[1] == RFID_CMD_ISO1443A_REQUEST))
|
|
|
{
|
|
|
- DEBUG_INFO_1("MIFARE CLASSIC.\n");
|
|
|
-
|
|
|
- cardLength = LENGTH_4;
|
|
|
- memcpy(data, rxByte+2, cardLength);
|
|
|
-
|
|
|
- isSuccess = true;
|
|
|
+ if(rxByte[0] == 0x09)
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_4;
|
|
|
+ memcpy(data, rxByte+2, cardLength);
|
|
|
+ DEBUG_INFO_1("MIFARE CLASSIC SN: %02X-%02X-%02X-%02X\n", data[0], data[1], data[2], data[3]);
|
|
|
+ isSuccess = true;
|
|
|
+ }
|
|
|
+ else if(rxByte[0] == 0x0C)
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_7;
|
|
|
+ memcpy(data, rxByte+2, cardLength);
|
|
|
+ DEBUG_INFO_1("MIFARE PLUS SN: %02X-%02X-%02X-%02X-%02X-%02X-%02X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
|
|
|
+
|
|
|
+ isSuccess = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
}
|
|
|
- else if(tmp[0] == 0x0C)
|
|
|
+ else if (rxByte[1] == 0xDF)
|
|
|
{
|
|
|
- DEBUG_INFO_1("MIFARE PLUS.\n");
|
|
|
-
|
|
|
- cardLength = LENGTH_7;
|
|
|
- memcpy(data, rxByte+2, cardLength);
|
|
|
-
|
|
|
- isSuccess = true;
|
|
|
+ cardLength = LENGTH_0;
|
|
|
+ isSuccess = false;
|
|
|
}
|
|
|
else
|
|
|
{}
|
|
|
}
|
|
|
- else if (tmp[1] == 0xDF)
|
|
|
+ else
|
|
|
{
|
|
|
- cardLength = LENGTH_0;
|
|
|
- isSuccess = false;
|
|
|
+ //DEBUG_ERROR_1("Response check sum mismatch.\n");
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
}
|
|
|
else
|
|
|
{}
|
|
@@ -394,9 +413,8 @@ bool ISO14443B_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
bool isSuccess = false;
|
|
|
int cardLength;
|
|
|
int tx_len = 5;
|
|
|
- unsigned char txByte[tx_len];
|
|
|
- unsigned char rxByte[254];
|
|
|
- unsigned char tmp[254];
|
|
|
+ unsigned char txByte[5] = {0};
|
|
|
+ unsigned char rxByte[254] = {0};
|
|
|
|
|
|
/*
|
|
|
unsigned char TX_MESSAGE[254];
|
|
@@ -421,27 +439,30 @@ bool ISO14443B_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
|
|
|
if(Fd > 0)
|
|
|
{
|
|
|
- memset(rxByte, 0, sizeof (rxByte));
|
|
|
if(system_command(Fd, txByte, tx_len, rxByte) > 0)
|
|
|
{
|
|
|
- memset(tmp, 0, sizeof tmp);
|
|
|
- memcpy(tmp, rxByte, sizeof(rxByte));
|
|
|
- if(tmp[1] == RFID_CMD_ISO1443B_REQUEST)
|
|
|
+ if(chksumValid(rxByte) == PASS)
|
|
|
{
|
|
|
- DEBUG_INFO_1("ISO14443 TYPE B.\n");
|
|
|
-
|
|
|
- cardLength = LENGTH_4;
|
|
|
- memcpy(data, rxByte+3, cardLength);
|
|
|
+ if((rxByte[1] == RFID_CMD_ISO1443B_REQUEST) && (rxByte[0] >= 12))
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_4;
|
|
|
+ memcpy(data, rxByte+3, cardLength);
|
|
|
+ DEBUG_INFO_1("ISO14443-B SN: %02X-%02X-%02X-%02X\n", data[0], data[1], data[2], data[3]);
|
|
|
|
|
|
- isSuccess = true;
|
|
|
+ isSuccess = true;
|
|
|
+ }
|
|
|
+ else if(rxByte[1] == 0x9F)
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_0;
|
|
|
+ isSuccess = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
}
|
|
|
- else if(tmp[1] == 0x9F)
|
|
|
+ else
|
|
|
{
|
|
|
- cardLength = LENGTH_0;
|
|
|
- isSuccess = false;
|
|
|
+ //DEBUG_ERROR_1("Response check sum mismatch.\n");
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
}
|
|
|
else
|
|
|
{}
|
|
@@ -515,15 +536,14 @@ bool FELICA_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
bool isSuccess = false;
|
|
|
int cardLength;
|
|
|
int tx_len = 9;
|
|
|
- unsigned char txByte[tx_len];
|
|
|
- unsigned char rxByte[254];
|
|
|
- unsigned char tmp[254];
|
|
|
+ unsigned char txByte[9] = {0};
|
|
|
+ unsigned char rxByte[254] = {0};
|
|
|
|
|
|
- unsigned char TX_MESSAGE[254];
|
|
|
- unsigned char RX_MESSAGE[254];
|
|
|
- unsigned char TMP_MESSAGE[254];
|
|
|
- unsigned char TX_LENGTH;
|
|
|
- unsigned char RX_LENGTH;
|
|
|
+ unsigned char TX_MESSAGE[254] = {0};
|
|
|
+ unsigned char RX_MESSAGE[254] = {0};
|
|
|
+ unsigned char TMP_MESSAGE[254] = {0};
|
|
|
+ unsigned char TX_LENGTH = 0;
|
|
|
+ unsigned char RX_LENGTH = 0;
|
|
|
|
|
|
switch(moduleType)
|
|
|
{
|
|
@@ -547,24 +567,28 @@ bool FELICA_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
|
|
|
memset(rxByte, 0, sizeof (rxByte));
|
|
|
if(system_command(Fd, txByte, tx_len, rxByte) > 0)
|
|
|
{
|
|
|
- memset(tmp, 0, sizeof tmp);
|
|
|
- memcpy(tmp, rxByte, sizeof(rxByte));
|
|
|
- if(tmp[1] == RFID_CMD_FELICA_POLLING_REQUEST)
|
|
|
+ if(chksumValid(rxByte) == PASS)
|
|
|
{
|
|
|
- DEBUG_INFO_1("FELICA.\n");
|
|
|
-
|
|
|
- cardLength = LENGTH_6;
|
|
|
- memcpy(data, rxByte+6, cardLength);
|
|
|
+ if((rxByte[1] == RFID_CMD_FELICA_POLLING_REQUEST) && (rxByte[0] >= 22))
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_6;
|
|
|
+ memcpy(data, rxByte+6, cardLength);
|
|
|
+ DEBUG_INFO_1("FELICA SN: %02X-%02X-%02X-%02X-%02X-%02X\n", data[0], data[1], data[2], data[3], data[4], data[5]);
|
|
|
|
|
|
- isSuccess = true;
|
|
|
+ isSuccess = true;
|
|
|
+ }
|
|
|
+ else if(rxByte[1] == 0xD0)
|
|
|
+ {
|
|
|
+ cardLength = LENGTH_0;
|
|
|
+ isSuccess = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
}
|
|
|
- else if(tmp[1] == 0xD0)
|
|
|
+ else
|
|
|
{
|
|
|
- cardLength = LENGTH_0;
|
|
|
- isSuccess = false;
|
|
|
+ //DEBUG_ERROR_1("Response check sum mismatch.\n");
|
|
|
}
|
|
|
- else
|
|
|
- {}
|
|
|
}
|
|
|
else
|
|
|
{}
|
|
@@ -1023,4 +1047,4 @@ bool setDefaultOfAutomaticDetectingCard(int Fd, int moduleType, int Value)
|
|
|
}
|
|
|
|
|
|
return isSuccess;
|
|
|
-}
|
|
|
+}
|