X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/b0127e65f1bef754e0ac72893e2ba99f9ca7f106..04202e7aa76dd9f0628d8245ae01fd224e5fbf17:/armsrc/iso14443a.c diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 530418e5..780a7ca0 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -21,7 +21,7 @@ #include "mifareutil.h" static uint32_t iso14a_timeout; -uint8_t *trace = (uint8_t *) BigBuf; +uint8_t *trace = (uint8_t *) BigBuf+TRACE_OFFSET; int traceLen = 0; int rsamples = 0; int tracing = TRUE; @@ -68,12 +68,15 @@ void iso14a_set_trigger(int enable) { trigger = enable; } -void iso14a_clear_tracelen(void) { +void iso14a_clear_trace(void) { + memset(trace, 0x44, TRACE_SIZE); traceLen = 0; } + void iso14a_set_tracing(int enable) { tracing = enable; } + void iso14a_set_timeout(uint32_t timeout) { iso14a_timeout = timeout; } @@ -580,8 +583,7 @@ void RAMFUNC SnoopIso14443a(uint8_t param) { LEDsoff(); // init trace buffer - traceLen = 0; - memset(trace, 0x44, TRACE_SIZE); + iso14a_clear_trace(); // We won't start recording the frames that we acquire until we trigger; // a good trigger condition to get started is probably when we see a @@ -905,8 +907,7 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd) { // Enable and clear the trace tracing = TRUE; - traceLen = 0; - memset(trace, 0x44, TRACE_SIZE); + iso14a_clear_trace(); // This function contains the tag emulation uint8_t sak; @@ -1769,6 +1770,7 @@ void ReaderIso14443a(UsbCommand * c, UsbCommand * ack) iso14a_command_t param = c->arg[0]; uint8_t * cmd = c->d.asBytes; size_t len = c->arg[1]; + uint8_t *receiveBuf = (((uint8_t *)BigBuf) + FREE_BUFFER_OFFSET); if(param & ISO14A_REQUEST_TRIGGER) iso14a_set_trigger(1); @@ -1787,7 +1789,19 @@ void ReaderIso14443a(UsbCommand * c, UsbCommand * ack) } if(param & ISO14A_APDU) { - ack->arg[0] = iso14_apdu(cmd, len, ack->d.asBytes); + memcpy(receiveBuf, ack->d.asBytes, len); + ack->arg[0] = iso14_apdu(cmd, len, receiveBuf); + + while(ack->arg[0] > sizeof(ack->d)) + { + memcpy(ack->d.asBytes, receiveBuf, sizeof(ack->d)); + UsbSendPacket((void *)ack, sizeof(UsbCommand)); + + receiveBuf+=sizeof(ack->d); + ack->arg[0]-=sizeof(ack->d); + } + + memcpy(ack->d.asBytes, receiveBuf, ack->arg[0]); UsbSendPacket((void *)ack, sizeof(UsbCommand)); } @@ -1849,11 +1863,12 @@ void ReaderMifare(uint32_t parameter) while(TRUE) { - LED_C_ON(); + LED_C_OFF(); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - SpinDelay(200); + SpinDelay(50); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD); - LED_C_OFF(); + LED_C_ON(); + SpinDelay(2); // Test if the action was cancelled if(BUTTON_PRESS()) { @@ -2379,8 +2394,7 @@ void RAMFUNC SniffMifare(uint8_t param) { // C(red) A(yellow) B(green) LEDsoff(); // init trace buffer - traceLen = 0; - memset(trace, 0x44, TRACE_SIZE); + iso14a_clear_trace(); // The command (reader -> tag) that we're receiving. // The length of a received command will in most cases be no more than 18 bytes. @@ -2512,4 +2526,4 @@ done: Dbprintf("maxDataLen=%x, Uart.state=%x, Uart.byteCnt=%x Uart.byteCntMax=%x", maxDataLen, Uart.state, Uart.byteCnt, Uart.byteCntMax); LEDsoff(); -} \ No newline at end of file +}