]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
iClass full simulation of tags now officially works, with some cheating regarding... v2.0.0-rc1
authorMartin Holst Swende <martin@swende.se>
Mon, 2 Mar 2015 20:30:22 +0000 (21:30 +0100)
committerMartin Holst Swende <martin@swende.se>
Mon, 2 Mar 2015 20:30:22 +0000 (21:30 +0100)
armsrc/iclass.c

index 4d847909767cba93d8106cc6055f144f1e96f8c4..260e6a6033f7f736173c0558ee8c034366f05434 100644 (file)
@@ -1042,6 +1042,10 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
        Dbprintf("Done...");
 
 }
        Dbprintf("Done...");
 
 }
+void AppendCrc(uint8_t* data, int len)
+{
+       ComputeCrc14443(CRC_ICLASS,data,len,data+len,data+len+1);
+}
 
 /**
  * @brief Does the actual simulation
 
 /**
  * @brief Does the actual simulation
@@ -1144,9 +1148,11 @@ int doIClassSimulation( int simulationMode, uint8_t *reader_mac_buf)
        memcpy(resp_cc, ToSend, ToSendMax); resp_cc_len = ToSendMax;
 
        //This is used for responding to READ-block commands or other data which is dynamically generated
        memcpy(resp_cc, ToSend, ToSendMax); resp_cc_len = ToSendMax;
 
        //This is used for responding to READ-block commands or other data which is dynamically generated
-       uint8_t *data_response = BigBuf_malloc(8 * 2 + 2);
-       //This is used for responding to READ-block commands or other data which is dynamically generated
-       uint8_t *data_generic_trace = BigBuf_malloc(8 * 2 + 2);
+       //First the 'trace'-data, not encoded for FPGA
+       uint8_t *data_generic_trace = BigBuf_malloc(8 + 2);//8 bytes data + 2byte CRC is max tag answer
+       //Then storage for the modulated data
+       //Each bit is doubled when modulated for FPGA, and we also have SOF and EOF (2 bytes)
+       uint8_t *data_response = BigBuf_malloc( (8+2) * 2 + 2);
 
        // Start from off (no field generated)
        //FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 
        // Start from off (no field generated)
        //FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
@@ -1252,8 +1258,28 @@ int doIClassSimulation( int simulationMode, uint8_t *reader_mac_buf)
                } else if(simulationMode == MODE_FULLSIM && receivedCmd[0] == ICLASS_CMD_READ_OR_IDENTIFY && len == 4){
                        //Read block
                        uint16_t blk = receivedCmd[1];
                } else if(simulationMode == MODE_FULLSIM && receivedCmd[0] == ICLASS_CMD_READ_OR_IDENTIFY && len == 4){
                        //Read block
                        uint16_t blk = receivedCmd[1];
-                       trace_data = emulator+(blk << 3);
-                       trace_data_size = 8;
+                       //Take the data...
+                       memcpy(data_generic_trace, emulator+(blk << 3),8);
+                       //Add crc
+                       AppendCrc(data_generic_trace, 8);
+                       trace_data = data_generic_trace;
+                       trace_data_size = 10;
+                       CodeIClassTagAnswer(trace_data , trace_data_size);
+                       memcpy(data_response, ToSend, ToSendMax);
+                       modulated_response = data_response;
+                       modulated_response_size = ToSendMax;
+               }else if(receivedCmd[0] == ICLASS_CMD_UPDATE && simulationMode == MODE_FULLSIM)
+               {//Probably the reader wants to update the nonce. Let's just ignore that for now.
+                       // OBS! If this is implemented, don't forget to regenerate the cipher_state
+                       //We're expected to respond with the data+crc, exactly what's already in the receivedcmd
+                       //receivedcmd is now UPDATE 1b | ADDRESS 1b| DATA 8b| Signature 4b or CRC 2b|
+
+                       //Take the data...
+                       memcpy(data_generic_trace, receivedCmd+2,8);
+                       //Add crc
+                       AppendCrc(data_generic_trace, 8);
+                       trace_data = data_generic_trace;
+                       trace_data_size = 10;
                        CodeIClassTagAnswer(trace_data , trace_data_size);
                        memcpy(data_response, ToSend, ToSendMax);
                        modulated_response = data_response;
                        CodeIClassTagAnswer(trace_data , trace_data_size);
                        memcpy(data_response, ToSend, ToSendMax);
                        modulated_response = data_response;
Impressum, Datenschutz