]>
git.zerfleddert.de Git - proxmark3-svn/blob - armsrc/mifaresniff.c
1 //-----------------------------------------------------------------------------
4 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
5 // at your option, any later version. See the LICENSE.txt file for the text of
7 //-----------------------------------------------------------------------------
8 // Routines to support mifare classic sniffer.
9 //-----------------------------------------------------------------------------
11 #include "mifaresniff.h"
13 #include "proxmark3.h"
16 #include "iso14443crc.h"
17 #include "iso14443a.h"
18 #include "crapto1/crapto1.h"
19 #include "mifareutil.h"
23 #include "fpgaloader.h"
26 static int sniffState
= SNF_INIT
;
27 static uint8_t sniffUIDType
;
28 static uint8_t sniffUID
[8] = {0x00};
29 static uint8_t sniffATQA
[2] = {0x00};
30 static uint8_t sniffSAK
;
31 static uint8_t sniffBuf
[16] = {0x00};
32 static uint32_t timerData
= 0;
35 bool MfSniffInit(void){
36 memset(sniffUID
, 0x00, 8);
37 memset(sniffATQA
, 0x00, 2);
39 sniffUIDType
= SNF_UID_4
;
44 bool MfSniffEnd(void){
46 cmd_send(CMD_ACK
,0,0,0,0,0);
52 bool RAMFUNC
MfSniffLogic(const uint8_t *data
, uint16_t len
, uint8_t *parity
, uint16_t bitCnt
, bool reader
) {
54 if (reader
&& (len
== 1) && (bitCnt
== 7)) { // reset on 7-Bit commands from reader
55 sniffState
= SNF_INIT
;
60 if ((len
== 1) && (reader
) && (bitCnt
== 7) ) { // REQA or WUPA from reader
61 sniffUIDType
= SNF_UID_4
;
62 memset(sniffUID
, 0x00, 8);
63 memset(sniffATQA
, 0x00, 2);
65 sniffState
= SNF_ATQA
;
67 sniffState
= SNF_MAGIC_WUPC2
;
72 if ((len
== 1) && (reader
) && (data
[0] == 0x43) ) {
73 sniffState
= SNF_CARD_IDLE
;
77 if ((!reader
) && (len
== 2)) { // ATQA from tag
78 memcpy(sniffATQA
, data
, 2);
79 sniffState
= SNF_UID1
;
84 if ((reader
) && (len
== 9) && (data
[0] == 0x93) && (data
[1] == 0x70) && (CheckCrc14443(CRC_14443_A
, data
, 9))) { // Select 4 Byte UID from reader
85 memcpy(sniffUID
+ 3, &data
[2], 4);
91 if ((!reader
) && (len
== 3) && (CheckCrc14443(CRC_14443_A
, data
, 3))) { // SAK from card?
93 if ((sniffUID
[3] == 0x88) && (sniffUIDType
== SNF_UID_4
)) { // CL2 UID part to be expected
94 sniffUIDType
= SNF_UID_7
;
95 memcpy(sniffUID
, sniffUID
+ 4, 3);
96 sniffState
= SNF_UID2
;
97 } else { // select completed
98 sniffState
= SNF_CARD_IDLE
;
104 if ((reader
) && (len
== 9) && (data
[0] == 0x95) && (data
[1] == 0x70) && (CheckCrc14443(CRC_14443_A
, data
, 9))) {
105 memcpy(sniffUID
+ 3, &data
[2], 4);
106 sniffState
= SNF_SAK
;
110 case SNF_CARD_IDLE
:{ // trace the card select sequence
113 memcpy(sniffBuf
+ 2, sniffUID
, 7);
114 memcpy(sniffBuf
+ 9, sniffATQA
, 2);
115 sniffBuf
[11] = sniffSAK
;
118 LogTrace(sniffBuf
, 14, 0, 0, NULL
, true);
119 sniffState
= SNF_CARD_CMD
;
120 } // intentionally no break;
122 LogTrace(data
, len
, 0, 0, parity
, reader
);
123 timerData
= GetTickCount();
128 sniffState
= SNF_INIT
;
136 bool RAMFUNC
MfSniffSend(uint16_t maxTimeoutMs
) {
137 if (BigBuf_get_traceLen() && (GetTickCount() > timerData
+ maxTimeoutMs
)) {
138 return intMfSniffSend();
143 // internal sending function. not a RAMFUNC.
144 bool intMfSniffSend() {
147 int pckLen
= BigBuf_get_traceLen();
149 uint8_t *trace
= BigBuf_get_addr();
153 pckSize
= MIN(USB_CMD_DATA_SIZE
, pckLen
);
155 cmd_send(CMD_ACK
, 1, BigBuf_get_traceLen(), pckSize
, trace
+ BigBuf_get_traceLen() - pckLen
, pckSize
);
163 cmd_send(CMD_ACK
,2,0,0,0,0);