mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
Merge pull request #3243 from Antiklesys/master
Fix for circular buffer error during hf iclass sim
This commit is contained in:
+11
-3
@@ -196,7 +196,7 @@ void iclass_simulate(uint8_t sim_type, uint8_t num_csns, bool send_reply, uint8_
|
||||
if (send_reply)
|
||||
reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i, 0, mac_responses, i * EPURSE_MAC_SIZE);
|
||||
|
||||
} else if (sim_type == ICLASS_SIM_MODE_FULL || sim_type == ICLASS_SIM_MODE_FULL_GLITCH || sim_type == ICLASS_SIM_MODE_FULL_GLITCH_KEY) {
|
||||
} else if (sim_type == ICLASS_SIM_MODE_FULL || sim_type == ICLASS_SIM_MODE_FULL_GLITCH || sim_type == ICLASS_SIM_MODE_FULL_GLITCH_KEY || sim_type == ICLASS_SIM_MODE_FULL_LIVE) {
|
||||
|
||||
//This is 'full sim' mode, where we use the emulator storage for data.
|
||||
//ie: BigBuf_get_EM_addr should be previously filled with data from the "eload" command
|
||||
@@ -292,6 +292,14 @@ out:
|
||||
*/
|
||||
int do_iclass_simulation(int simulationMode, uint8_t *reader_mac_buf) {
|
||||
|
||||
// FULL_LIVE = FULL + per-byte USB poll so the client can push live emul
|
||||
// updates (see hf iclass tagsim). Unfold the flag and continue as FULL
|
||||
// so all existing FULL-mode checks below work unchanged.
|
||||
const bool allow_usb_interrupt = (simulationMode == ICLASS_SIM_MODE_FULL_LIVE);
|
||||
if (simulationMode == ICLASS_SIM_MODE_FULL_LIVE) {
|
||||
simulationMode = ICLASS_SIM_MODE_FULL;
|
||||
}
|
||||
|
||||
// free eventually allocated BigBuf memory
|
||||
BigBuf_free_keep_EM();
|
||||
|
||||
@@ -499,7 +507,7 @@ int do_iclass_simulation(int simulationMode, uint8_t *reader_mac_buf) {
|
||||
trace_data_size = 0;
|
||||
|
||||
uint32_t reader_eof_time = 0;
|
||||
len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time);
|
||||
len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time, allow_usb_interrupt);
|
||||
if (len == -2) {
|
||||
// USB data arrived while waiting for RF — drain all pending EML_MEMSET
|
||||
// commands inline (without FpgaDownloadAndGo) so live tag updates work.
|
||||
@@ -1118,7 +1126,7 @@ int do_iclass_simulation_nonsec(void) {
|
||||
WDT_HIT();
|
||||
|
||||
uint32_t reader_eof_time = 0;
|
||||
len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time);
|
||||
len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time, false);
|
||||
if (len < 0) {
|
||||
button_pressed = true;
|
||||
exit_loop = true;
|
||||
|
||||
+5
-4
@@ -1492,7 +1492,7 @@ static int RAMFUNC Handle15693SampleFromReader(bool bit, DecodeReader_t *reader)
|
||||
// correctly.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time) {
|
||||
int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time, bool allow_usb_interrupt) {
|
||||
int samples = 0;
|
||||
bool gotFrame = false;
|
||||
|
||||
@@ -1567,8 +1567,9 @@ int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eo
|
||||
break;
|
||||
}
|
||||
|
||||
if ((dr->state == STATE_READER_UNSYNCD ||
|
||||
dr->state == STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF) &&
|
||||
if (allow_usb_interrupt &&
|
||||
(dr->state == STATE_READER_UNSYNCD ||
|
||||
dr->state == STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF) &&
|
||||
data_available()) {
|
||||
dr->byteCount = -2;
|
||||
break;
|
||||
@@ -2267,7 +2268,7 @@ void SimTagIso15693(const uint8_t *uid, uint8_t block_size) {
|
||||
|
||||
// Listen to reader
|
||||
uint32_t reader_eof_time = 0;
|
||||
int cmd_len = GetIso15693CommandFromReader(cmd, sizeof(cmd), &reader_eof_time);
|
||||
int cmd_len = GetIso15693CommandFromReader(cmd, sizeof(cmd), &reader_eof_time, false);
|
||||
if (cmd_len < 0) {
|
||||
button_pressed = true;
|
||||
break;
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ void CodeIso15693AsReader(const uint8_t *cmd, int n);
|
||||
void CodeIso15693AsTag(const uint8_t *cmd, size_t len);
|
||||
|
||||
void TransmitTo15693Reader(const uint8_t *cmd, size_t len, uint32_t *start_time, uint32_t slot_time, bool slow);
|
||||
int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time);
|
||||
int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time, bool allow_usb_interrupt);
|
||||
void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time, bool shallow_mod);
|
||||
int GetIso15693AnswerFromTag(uint8_t *response, uint16_t max_len, uint16_t timeout, uint32_t *eof_time, bool fsk, bool recv_speed, uint16_t *resp_len);
|
||||
|
||||
|
||||
@@ -1508,7 +1508,7 @@ static int CmdHFiClassTagSim(const char *Cmd) {
|
||||
}
|
||||
|
||||
clearCommandBuffer();
|
||||
SendCommandMIX(CMD_HF_ICLASS_SIMULATE, ICLASS_SIM_MODE_FULL, 0, 1, csn, 8);
|
||||
SendCommandMIX(CMD_HF_ICLASS_SIMULATE, ICLASS_SIM_MODE_FULL_LIVE, 0, 1, csn, 8);
|
||||
|
||||
// --- live FC/CN navigation (wiegand mode only; binary mode has no FC/CN to adjust)
|
||||
if (bin_len == 0) {
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
#define ICLASS_SIM_MODE_EXIT_AFTER_MAC 5 // note: device internal only
|
||||
#define ICLASS_SIM_MODE_FULL_GLITCH 6
|
||||
#define ICLASS_SIM_MODE_FULL_GLITCH_KEY 7
|
||||
#define ICLASS_SIM_MODE_FULL_LIVE 8 // FULL + USB poll for live emul updates (hf iclass tagsim)
|
||||
|
||||
|
||||
// iCLASS auth request data structure
|
||||
|
||||
Reference in New Issue
Block a user