mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-13 18:57:12 +08:00
merged iso14 arm side
This commit is contained in:
parent
074c138de7
commit
0cfa47e628
2 changed files with 21 additions and 10 deletions
|
@ -2212,15 +2212,21 @@ b8 b7 b6 b5 b4 b3 b2 b1
|
||||||
b5,b6 = 00 - DESELECT
|
b5,b6 = 00 - DESELECT
|
||||||
11 - WTX
|
11 - WTX
|
||||||
*/
|
*/
|
||||||
int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data) {
|
int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data, uint8_t *res) {
|
||||||
uint8_t parity[MAX_PARITY_SIZE] = {0x00};
|
uint8_t parity[MAX_PARITY_SIZE] = {0x00};
|
||||||
uint8_t real_cmd[cmd_len+4];
|
uint8_t real_cmd[cmd_len + 4];
|
||||||
|
|
||||||
|
if (cmd_len) {
|
||||||
// ISO 14443 APDU frame: PCB [CID] [NAD] APDU CRC PCB=0x02
|
// ISO 14443 APDU frame: PCB [CID] [NAD] APDU CRC PCB=0x02
|
||||||
real_cmd[0] = 0x02; // bnr,nad,cid,chn=0; i-block(0x00)
|
real_cmd[0] = 0x02; // bnr,nad,cid,chn=0; i-block(0x00)
|
||||||
// put block number into the PCB
|
// put block number into the PCB
|
||||||
real_cmd[0] |= iso14_pcb_blocknum;
|
real_cmd[0] |= iso14_pcb_blocknum;
|
||||||
memcpy(real_cmd + 1, cmd, cmd_len);
|
memcpy(real_cmd + 1, cmd, cmd_len);
|
||||||
|
} else {
|
||||||
|
// R-block. ACK
|
||||||
|
real_cmd[0] = 0xA2; // r-block + ACK
|
||||||
|
real_cmd[0] |= iso14_pcb_blocknum;
|
||||||
|
}
|
||||||
AddCrc14A(real_cmd, cmd_len + 1);
|
AddCrc14A(real_cmd, cmd_len + 1);
|
||||||
|
|
||||||
ReaderTransmit(real_cmd, cmd_len + 3, NULL);
|
ReaderTransmit(real_cmd, cmd_len + 3, NULL);
|
||||||
|
@ -2260,6 +2266,10 @@ int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data) {
|
||||||
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 (res)
|
||||||
|
*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;
|
||||||
|
@ -2320,8 +2330,9 @@ void ReaderIso14443a(UsbCommand *c) {
|
||||||
iso14a_set_timeout(timeout);
|
iso14a_set_timeout(timeout);
|
||||||
|
|
||||||
if ((param & ISO14A_APDU)) {
|
if ((param & ISO14A_APDU)) {
|
||||||
arg0 = iso14_apdu(cmd, len, buf);
|
uint8_t res;
|
||||||
cmd_send(CMD_ACK, arg0, 0, 0, buf, sizeof(buf));
|
arg0 = iso14_apdu(cmd, len, buf, &res);
|
||||||
|
cmd_send(CMD_ACK, arg0, res, 0, buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((param & ISO14A_RAW)) {
|
if ((param & ISO14A_RAW)) {
|
||||||
|
|
|
@ -114,7 +114,7 @@ extern void ReaderTransmitPar(uint8_t *frame, uint16_t len, uint8_t *par, uint32
|
||||||
extern int ReaderReceive(uint8_t *receivedAnswer, uint8_t *par);
|
extern int ReaderReceive(uint8_t *receivedAnswer, uint8_t *par);
|
||||||
|
|
||||||
extern void iso14443a_setup(uint8_t fpga_minor_mode);
|
extern void iso14443a_setup(uint8_t fpga_minor_mode);
|
||||||
extern int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data);
|
extern int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data, uint8_t *res);
|
||||||
extern int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *resp_data, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats);
|
extern int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *resp_data, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades, bool no_rats);
|
||||||
extern int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades);
|
extern int iso14443a_fast_select_card(uint8_t *uid_ptr, uint8_t num_cascades);
|
||||||
extern void iso14a_set_trigger(bool enable);
|
extern void iso14a_set_trigger(bool enable);
|
||||||
|
|
Loading…
Reference in a new issue