]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iso14443a.c
add 14a apdu send framing (based on RRG repo PR86 by Merlokk) (#795)
[proxmark3-svn] / armsrc / iso14443a.c
index 2fffe8373cfee3f02112b022438f3edc31d7f371..0247820ec81ea6dfb9ef0cc2d3d6cc573a9b98cf 100644 (file)
@@ -1938,13 +1938,16 @@ b8 b7 b6 b5 b4 b3 b2 b1
 b5,b6 = 00 - DESELECT
         11 - WTX 
 */    
 b5,b6 = 00 - DESELECT
         11 - WTX 
 */    
-int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data, uint8_t *res) {
+int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, bool send_chaining, void *data, uint8_t *res) {
        uint8_t parity[MAX_PARITY_SIZE];
        uint8_t real_cmd[cmd_len + 4];
        
        if (cmd_len) {
                // ISO 14443 APDU frame: PCB [CID] [NAD] APDU CRC PCB=0x02
                real_cmd[0] = 0x02; // bnr,nad,cid,chn=0; i-block(0x00) 
        uint8_t parity[MAX_PARITY_SIZE];
        uint8_t real_cmd[cmd_len + 4];
        
        if (cmd_len) {
                // ISO 14443 APDU frame: PCB [CID] [NAD] APDU CRC PCB=0x02
                real_cmd[0] = 0x02; // bnr,nad,cid,chn=0; i-block(0x00) 
+               if (send_chaining) {
+                       real_cmd[0] |= 0x10;
+               }
                // put block number into the PCB
                real_cmd[0] |= iso14_pcb_blocknum;
                memcpy(real_cmd + 1, cmd, cmd_len);
                // put block number into the PCB
                real_cmd[0] |= iso14_pcb_blocknum;
                memcpy(real_cmd + 1, cmd, cmd_len);
@@ -2066,7 +2069,7 @@ void ReaderIso14443a(UsbCommand *c)
 
        if(param & ISO14A_APDU && !cantSELECT) {
                uint8_t res;
 
        if(param & ISO14A_APDU && !cantSELECT) {
                uint8_t res;
-               arg0 = iso14_apdu(cmd, len, buf, &res);
+               arg0 = iso14_apdu(cmd, len, (param & ISO14A_SEND_CHAINING), buf, &res);
                FpgaDisableTracing();
                LED_B_ON();
                cmd_send(CMD_ACK, arg0, res, 0, buf, sizeof(buf));
                FpgaDisableTracing();
                LED_B_ON();
                cmd_send(CMD_ACK, arg0, res, 0, buf, sizeof(buf));
Impressum, Datenschutz