]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge branch 'master' of https://github.com/holiman/proxmark3
authoriceman1001 <iceman@iuse.se>
Tue, 20 Jan 2015 19:59:24 +0000 (20:59 +0100)
committericeman1001 <iceman@iuse.se>
Tue, 20 Jan 2015 19:59:24 +0000 (20:59 +0100)
Conflicts:
armsrc/appmain.c
armsrc/apps.h

Step 1 for the Ultralight / Ultralight-c

1  2 
armsrc/apps.h
armsrc/iso14443a.c
armsrc/mifarecmd.c
armsrc/mifaresniff.c
armsrc/mifareutil.c
armsrc/mifareutil.h
client/Makefile

diff --combined armsrc/apps.h
index 27e08fa1e528f7a894b67d652854eeb27821947b,cc462dc1e2551ada46cd36d5bbaf532d75d40cd7..376e52c8cb321b606b533a7c3b45fb3f447df90e
@@@ -39,25 -39,6 +39,25 @@@ uint32_t BigBuf[BIGBUF_SIZE / sizeof(ui
  #define FREE_BUFFER_OFFSET            (CARD_MEMORY_OFFSET + CARD_MEMORY_SIZE)
  #define FREE_BUFFER_SIZE              (BIGBUF_SIZE - FREE_BUFFER_OFFSET - 1)
  
 +/*
 +The statements above translates into this :
 +BIGBUF_SIZE         = 40000
 +TRACE_OFFSET        = 0
 +TRACE_SIZE          = 3000
 +RECV_CMD_OFFSET     = 3000
 +MAX_FRAME_SIZE      = 256
 +MAX_PARITY_SIZE     = 32
 +RECV_CMD_PAR_OFFSET = 3256
 +RECV_RESP_OFFSET    = 3288
 +RECV_RESP_PAR_OFFSET= 3544
 +CARD_MEMORY_OFFSET  = 3576
 +CARD_MEMORY_SIZE    = 4096
 +DMA_BUFFER_OFFSET   = 3576
 +DMA_BUFFER_SIZE     = 4096
 +FREE_BUFFER_OFFSET  = 7672
 +FREE_BUFFER_SIZE    = 32327
 + */
 +
  extern const uint8_t OddByteParity[256];
  extern uint8_t *trace; // = (uint8_t *) BigBuf;
  extern int traceLen;   // = 0;
@@@ -136,8 -117,6 +136,8 @@@ void SetAdcMuxFor(uint32_t whichGpio)
  #define FPGA_HF_SIMULATOR_MODULATE_BPSK                               (1<<0)
  #define FPGA_HF_SIMULATOR_MODULATE_212K                               (2<<0)
  #define FPGA_HF_SIMULATOR_MODULATE_424K                               (4<<0)
 +#define FPGA_HF_SIMULATOR_MODULATE_424K_8BIT          0x5//101
 +
  // Options for ISO14443A
  #define FPGA_HF_ISO14443A_SNIFFER                             (0<<0)
  #define FPGA_HF_ISO14443A_TAGSIM_LISTEN                               (1<<0)
@@@ -200,7 -179,9 +200,9 @@@ void ReaderMifare(bool first_try)
  int32_t dist_nt(uint32_t nt1, uint32_t nt2);
  void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *data);
  void MifareUReadBlock(uint8_t arg0,uint8_t *datain);
- void MifareUReadCard(uint8_t arg0, int arg1, uint8_t *datain);
+ void MifareUC_Auth1(uint8_t arg0, uint8_t *datain);
+ void MifareUC_Auth2(uint32_t arg0, uint8_t *datain);
+ void MifareUReadCard(uint8_t arg0, int Pages, uint8_t *datain);
  void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
  void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
  void MifareUWriteBlock(uint8_t arg0,uint8_t *datain);
diff --combined armsrc/iso14443a.c
index d326be2c5f6dff70ab535b54a4dc2e101ffbbebc,cf55e6068c9b65d01d06efd583ae76bede2296f6..2722ccb2ef04b62c41a3945a1a0be1d390f396ed
@@@ -1001,10 -1001,10 +1001,11 @@@ void SimulateIso14443aTag(int tagType, 
        }
        
        // The second response contains the (mandatory) first 24 bits of the UID
--      uint8_t response2[5];
++      uint8_t response2[5] = {0x00};
  
        // Check if the uid uses the (optional) part
--      uint8_t response2a[5];
++      uint8_t response2a[5] = {0x00};
++      
        if (uid_2nd) {
                response2[0] = 0x88;
                num_to_bytes(uid_1st,3,response2+1);
        response2[4] = response2[0] ^ response2[1] ^ response2[2] ^ response2[3];
  
        // Prepare the mandatory SAK (for 4 and 7 byte UID)
--      uint8_t response3[3];
++      uint8_t response3[3]  = {0x00};
        response3[0] = sak;
        ComputeCrc14443(CRC_14443_A, response3, 1, &response3[1], &response3[2]);
  
        // Prepare the optional second SAK (for 7 byte UID), drop the cascade bit
--      uint8_t response3a[3];
++      uint8_t response3a[3]  = {0x00};
        response3a[0] = sak & 0xFB;
        ComputeCrc14443(CRC_14443_A, response3a, 1, &response3a[1], &response3a[2]);
  
@@@ -1772,7 -1772,7 +1773,7 @@@ int iso14443a_select_card(byte_t *uid_p
                                Dbprintf("Multiple tags detected. Collision after Bit %d", Demod.collisionPos);
                                for (uint16_t i = collision_answer_offset; i < Demod.collisionPos; i++, uid_resp_bits++) {      // add valid UID bits before collision point
                                        uint16_t UIDbit = (resp[i/8] >> (i % 8)) & 0x01;
 -                                      uid_resp[uid_resp_bits & 0xf8] |= UIDbit << (uid_resp_bits % 8);
 +                                      uid_resp[uid_resp_bits 8] |= UIDbit << (uid_resp_bits % 8);
                                }
                                uid_resp[uid_resp_bits/8] |= 1 << (uid_resp_bits % 8);                                  // next time select the card(s) with a 1 in the collision position
                                uid_resp_bits++;
diff --combined armsrc/mifarecmd.c
index 22926dcfaf399f15c605000865939eafccfb7e70,22926dcfaf399f15c605000865939eafccfb7e70..a96164fc65114ccfa61e80cb22efbb606560fbbd
@@@ -104,14 -104,14 +104,14 @@@ void MifareUC_Auth1(uint8_t arg0, uint8
        if(!iso14443a_select_card(uid, NULL, &cuid)) {\r
                if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
                        Dbprintf("Can't select card");\r
--              OnError(0);\r
++              //OnError(0);\r
                return;\r
        };\r
        \r
        if(mifare_ultra_auth1(cuid, dataoutbuf)){\r
                if (MF_DBGLEVEL >= MF_DBG_ERROR)        \r
                        Dbprintf("Authentication part1: Fail.");\r
--              OnError(1);\r
++              //OnError(1);\r
                return;\r
        }\r
  \r
@@@ -138,7 -138,7 +138,7 @@@ void MifareUC_Auth2(uint32_t arg0, uint
        if(mifare_ultra_auth2(cuid, key, dataoutbuf)){\r
            if (MF_DBGLEVEL >= MF_DBG_ERROR) \r
                        Dbprintf("Authentication part2: Fail...");\r
--              OnError(1);\r
++              //OnError(1);\r
                return;                 \r
        }\r
        \r
@@@ -1141,14 -1141,14 +1141,14 @@@ void Mifare_DES_Auth1(uint8_t arg0, uin
        if(!len) {\r
                if (MF_DBGLEVEL >= MF_DBG_ERROR)        \r
                        Dbprintf("Can't select card");\r
--              OnError(1);\r
++              //OnError(1);\r
                return;\r
        };\r
  \r
        if(mifare_desfire_des_auth1(cuid, dataout)){\r
                if (MF_DBGLEVEL >= MF_DBG_ERROR)        \r
                        Dbprintf("Authentication part1: Fail.");\r
--              OnError(4);\r
++              //OnError(4);\r
                return;\r
        }\r
  \r
@@@ -1171,7 -1171,7 +1171,7 @@@ void Mifare_DES_Auth2(uint32_t arg0, ui
        if( isOK) {\r
            if (MF_DBGLEVEL >= MF_DBG_EXTENDED) \r
                        Dbprintf("Authentication part2: Failed");  \r
--              OnError(4);\r
++              //OnError(4);\r
                return;\r
        }\r
  \r
        cmd_send(CMD_ACK, isOK, 0, 0, dataout, sizeof(dataout));\r
        FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);\r
        LEDsoff();\r
--}
++}
diff --combined armsrc/mifaresniff.c
index fed127725f9c3caf86b394a2e2fed1bf6e816711,fed127725f9c3caf86b394a2e2fed1bf6e816711..9b6f5f04c417d3514973a5dac79221821d22613b
  \r
  static int sniffState = SNF_INIT;\r
  static uint8_t sniffUIDType;\r
--static uint8_t sniffUID[8];\r
--static uint8_t sniffATQA[2];\r
++static uint8_t sniffUID[8] = {0x00};\r
++static uint8_t sniffATQA[2] = {0x00};\r
  static uint8_t sniffSAK;\r
--static uint8_t sniffBuf[16];\r
++static uint8_t sniffBuf[16] = {0x00};\r
  static uint32_t timerData = 0;\r
  \r
  \r
diff --combined armsrc/mifareutil.c
index 2b3a5fcf244c87cb71653ace1bac86c5ad94b10b,2b3a5fcf244c87cb71653ace1bac86c5ad94b10b..163eca790f932317cd9ed5db7651cfb906ba032e
@@@ -623,3 -623,3 +623,98 @@@ void emlClearMem(void) 
        emlSetMem((uint8_t *)uid, 0, 1);\r
        return;\r
  }\r
++\r
++\r
++// Mifare desfire commands\r
++int mifare_sendcmd_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing)\r
++{\r
++    uint8_t dcmd[5] = {0x00};\r
++    dcmd[0] = cmd;\r
++    memcpy(dcmd+1,data,2);\r
++      AppendCrc14443a(dcmd, 3);\r
++      \r
++      ReaderTransmit(dcmd, sizeof(dcmd), NULL);\r
++      int len = ReaderReceive(answer, answer_parity);\r
++      if(!len) {\r
++              if (MF_DBGLEVEL >= MF_DBG_ERROR) \r
++                      Dbprintf("Authentication failed. Card timeout.");\r
++              return 1;\r
++    }\r
++      return len;\r
++}\r
++\r
++int mifare_sendcmd_special2(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer,uint8_t *answer_parity, uint32_t *timing)\r
++{\r
++    uint8_t dcmd[20] = {0x00};\r
++    dcmd[0] = cmd;\r
++    memcpy(dcmd+1,data,17);\r
++      AppendCrc14443a(dcmd, 18);\r
++\r
++      ReaderTransmit(dcmd, sizeof(dcmd), NULL);\r
++      int len = ReaderReceive(answer, answer_parity);\r
++      if(!len){\r
++        if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
++                      Dbprintf("Authentication failed. Card timeout.");\r
++              return 1;\r
++    }\r
++      return len;\r
++}\r
++\r
++int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData){\r
++\r
++      int len;\r
++      // load key, keynumber\r
++      uint8_t data[2]={0x0a, 0x00};\r
++      uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
++      uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;\r
++      \r
++      len = mifare_sendcmd_special(NULL, 1, 0x02, data, receivedAnswer,receivedAnswerPar,NULL);\r
++      if (len == 1) {\r
++              if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
++                      Dbprintf("Cmd Error: %02x", receivedAnswer[0]);\r
++              return 1;\r
++      }\r
++      \r
++      if (len == 12) {\r
++              if (MF_DBGLEVEL >= MF_DBG_EXTENDED)     {\r
++                      Dbprintf("Auth1 Resp: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",\r
++                              receivedAnswer[0],receivedAnswer[1],receivedAnswer[2],receivedAnswer[3],receivedAnswer[4],\r
++                              receivedAnswer[5],receivedAnswer[6],receivedAnswer[7],receivedAnswer[8],receivedAnswer[9],\r
++                              receivedAnswer[10],receivedAnswer[11]);\r
++                      }\r
++                      memcpy(blockData, receivedAnswer, 12);\r
++              return 0;\r
++      }\r
++      return 1;\r
++}\r
++\r
++int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData){\r
++\r
++      int len;\r
++      uint8_t data[17] = {0x00};\r
++      data[0] = 0xAF;\r
++      memcpy(data+1,key,16);\r
++      \r
++      uint8_t* receivedAnswer = get_bigbufptr_recvrespbuf();\r
++      uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;\r
++      \r
++      len = mifare_sendcmd_special2(NULL, 1, 0x03, data, receivedAnswer, receivedAnswerPar ,NULL);\r
++      \r
++      if ((receivedAnswer[0] == 0x03) && (receivedAnswer[1] == 0xae)) {\r
++              if (MF_DBGLEVEL >= MF_DBG_ERROR)\r
++                      Dbprintf("Auth Error: %02x %02x", receivedAnswer[0], receivedAnswer[1]);\r
++              return 1;\r
++      }\r
++      \r
++      if (len == 12){\r
++              if (MF_DBGLEVEL >= MF_DBG_EXTENDED) {\r
++                      Dbprintf("Auth2 Resp: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",\r
++                              receivedAnswer[0],receivedAnswer[1],receivedAnswer[2],receivedAnswer[3],receivedAnswer[4],\r
++                              receivedAnswer[5],receivedAnswer[6],receivedAnswer[7],receivedAnswer[8],receivedAnswer[9],\r
++                              receivedAnswer[10],receivedAnswer[11]);\r
++                      }\r
++              memcpy(blockData, receivedAnswer, 12);\r
++              return 0;\r
++      }\r
++      return 1;\r
++}
diff --combined armsrc/mifareutil.h
index a62a9f0b871a3362af91ba43cc09b5e1f37cabfe,a62a9f0b871a3362af91ba43cc09b5e1f37cabfe..2770a442f8146ff1a28781756a1ffe29e2e2a45f
@@@ -72,6 -72,6 +72,11 @@@ int mifare_ultra_special_writeblock(uin
  int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid); 
  int mifare_ultra_halt(uint32_t uid);
  \r
++// desfire\r
++int mifare_sendcmd_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);\r
++int mifare_sendcmd_special2(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer,uint8_t *answer_parity, uint32_t *timing);\r
++int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData);\r
++int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData);\r
  
  // crypto functions
  void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *receivedCmd, int len);
diff --combined client/Makefile
index 523a1ad117c8fbf977ac0ee6c5ff9015600dc268,523a1ad117c8fbf977ac0ee6c5ff9015600dc268..77fee4e664733a9b3231320f8af5dd4e32b2b060
@@@ -13,11 -13,11 +13,10 @@@ CXX=g+
  VPATH = ../common
  OBJDIR = obj
  
--LDLIBS = -L/opt/local/lib -L/usr/local/lib ../liblua/liblua.a -lreadline -lpthread -lm
++LDLIBS = -L/opt/local/lib -L/usr/local/lib ../liblua/liblua.a -lreadline -lpthread -lm -lcrypto
  LDFLAGS = $(COMMON_FLAGS)
--CFLAGS = -std=c99 -I. -I../include -I../common -I/opt/local/include -I../liblua -Wall $(COMMON_FLAGS) -g -O4 
++CFLAGS = -std=c99 -lcrypto -I. -I../include -I../common -I/opt/local/include -I../liblua -Wall $(COMMON_FLAGS) -g -O4 
  LUAPLATFORM = generic
--
  ifneq (,$(findstring MINGW,$(platform)))
  CXXFLAGS = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui
  QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4
Impressum, Datenschutz