Merge pull request #90 from merlokk/fix_14a_loop

Fix 14a loop
This commit is contained in:
Oleg Moiseenko 2019-02-05 19:11:46 +02:00 committed by GitHub
commit 324f5a6b04
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2248,7 +2248,7 @@ int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, u
return 0; //DATA LINK ERROR return 0; //DATA LINK ERROR
} else{ } else{
// S-Block WTX // S-Block WTX
while((data_bytes[0] & 0xF2) == 0xF2) { while(len && ((data_bytes[0] & 0xF2) == 0xF2)) {
uint32_t save_iso14a_timeout = iso14a_get_timeout(); uint32_t save_iso14a_timeout = iso14a_get_timeout();
// temporarily increase timeout // temporarily increase timeout
iso14a_set_timeout( MAX((data_bytes[1] & 0x3f) * save_iso14a_timeout, MAX_ISO14A_TIMEOUT) ); iso14a_set_timeout( MAX((data_bytes[1] & 0x3f) * save_iso14a_timeout, MAX_ISO14A_TIMEOUT) );
@ -2266,32 +2266,34 @@ int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, u
iso14a_set_timeout(save_iso14a_timeout); iso14a_set_timeout(save_iso14a_timeout);
} }
// if we received an I- or R(ACK)-Block with a block number equal to the // if we received an I- or R(ACK)-Block with a block number equal to the
// current block number, toggle the current block number // current block number, toggle the current block number
if (len >= 3 // PCB+CRC = 3 bytes if (len >= 3 // PCB+CRC = 3 bytes
&& ((data_bytes[0] & 0xC0) == 0 // I-Block && ((data_bytes[0] & 0xC0) == 0 // I-Block
|| (data_bytes[0] & 0xD0) == 0x80) // R-Block with ACK bit set to 0 || (data_bytes[0] & 0xD0) == 0x80) // R-Block with ACK bit set to 0
&& (data_bytes[0] & 0x01) == iso14_pcb_blocknum) // equal block numbers && (data_bytes[0] & 0x01) == iso14_pcb_blocknum) // equal block numbers
{ {
iso14_pcb_blocknum ^= 1; iso14_pcb_blocknum ^= 1;
} }
// if we received I-block with chaining we need to send ACK and receive another block of data // if we received I-block with chaining we need to send ACK and receive another block of data
if (res) if (res)
*res = data_bytes[0]; *res = data_bytes[0];
// crc check // crc check
if (len >=3 && !check_crc(CRC_14443_A, data_bytes, len)) { if (len >= 3 && !check_crc(CRC_14443_A, data_bytes, len)) {
return -1; return -1;
} }
} }
// cut frame byte if (len) {
len -= 1; // cut frame byte
// memmove(data_bytes, data_bytes + 1, len); len -= 1;
for (int i = 0; i < len; i++) // memmove(data_bytes, data_bytes + 1, len);
data_bytes[i] = data_bytes[i + 1]; for (int i = 0; i < len; i++)
data_bytes[i] = data_bytes[i + 1];
}
return len; return len;
} }