mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
FIX: since the correctionNeeded logic changed, with PR #87 (https://github.com/iceman1001/proxmark3/pull/87) this is the consequence changes to it.
This commit is contained in:
parent
81f9cbb188
commit
00baf27097
3 changed files with 29 additions and 33 deletions
|
@ -977,7 +977,7 @@ void SimulateEMVcard()
|
||||||
cmdsRecvd++;
|
cmdsRecvd++;
|
||||||
|
|
||||||
if (p_response != NULL) {
|
if (p_response != NULL) {
|
||||||
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n, receivedCmd[0] == 0x52);
|
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n);
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
|
|
||||||
|
|
||||||
|
@ -1096,11 +1096,11 @@ void EMVFuzz_RATS(uint8_t ratslen, uint8_t* RATS)
|
||||||
}
|
}
|
||||||
if (receivedCmd[0] == 0xE0) { // Received a RATS request
|
if (receivedCmd[0] == 0xE0) { // Received a RATS request
|
||||||
p_response = &responses[3]; order = 70;
|
p_response = &responses[3]; order = 70;
|
||||||
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n, (receivedCmd[0] == 0x52) || (receivedCmd[0] == 0x26));
|
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (p_response != NULL){
|
if (p_response != NULL){
|
||||||
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n, (receivedCmd[0] == 0x52) || (receivedCmd[0] == 0x26));
|
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1080,15 +1080,15 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
uint8_t emdata[MAX_MIFARE_FRAME_SIZE];
|
uint8_t emdata[MAX_MIFARE_FRAME_SIZE];
|
||||||
emlGetMemBt( emdata, start, 16);
|
emlGetMemBt( emdata, start, 16);
|
||||||
AppendCrc14443a(emdata, 16);
|
AppendCrc14443a(emdata, 16);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
// We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below
|
// We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else { // all other tags (16 byte block tags)
|
} else { // all other tags (16 byte block tags)
|
||||||
uint8_t emdata[MAX_MIFARE_FRAME_SIZE];
|
uint8_t emdata[MAX_MIFARE_FRAME_SIZE];
|
||||||
emlGetMemBt( emdata, block, 16);
|
emlGetMemBt( emdata, block, 16);
|
||||||
AppendCrc14443a(emdata, 16);
|
AppendCrc14443a(emdata, 16);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
// EmSendCmdEx(data+(4*receivedCmd[1]),16,false);
|
// EmSendCmdEx(data+(4*receivedCmd[1]),16);
|
||||||
// Dbprintf("Read request from reader: %x %x",receivedCmd[0],receivedCmd[1]);
|
// Dbprintf("Read request from reader: %x %x",receivedCmd[0],receivedCmd[1]);
|
||||||
// We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below
|
// We already responded, do not send anything with the EmSendCmd14443aRaw() that is called below
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
|
@ -1100,7 +1100,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
int len = (receivedCmd[2] - receivedCmd[1] + 1) * 4;
|
int len = (receivedCmd[2] - receivedCmd[1] + 1) * 4;
|
||||||
emlGetMemBt( emdata, start, len);
|
emlGetMemBt( emdata, start, len);
|
||||||
AppendCrc14443a(emdata, len);
|
AppendCrc14443a(emdata, len);
|
||||||
EmSendCmdEx(emdata, len+2, false);
|
EmSendCmdEx(emdata, len+2);
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else if(receivedCmd[0] == MIFARE_ULEV1_READSIG && tagType == 7) { // Received a READ SIGNATURE --
|
} else if(receivedCmd[0] == MIFARE_ULEV1_READSIG && tagType == 7) { // Received a READ SIGNATURE --
|
||||||
// first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature]
|
// first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature]
|
||||||
|
@ -1108,7 +1108,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
uint8_t emdata[34];
|
uint8_t emdata[34];
|
||||||
emlGetMemBt( emdata, start, 32);
|
emlGetMemBt( emdata, start, 32);
|
||||||
AppendCrc14443a(emdata, 32);
|
AppendCrc14443a(emdata, 32);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else if (receivedCmd[0] == MIFARE_ULEV1_READ_CNT && tagType == 7) { // Received a READ COUNTER --
|
} else if (receivedCmd[0] == MIFARE_ULEV1_READ_CNT && tagType == 7) { // Received a READ COUNTER --
|
||||||
uint8_t index = receivedCmd[1];
|
uint8_t index = receivedCmd[1];
|
||||||
|
@ -1117,7 +1117,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
num_to_bytes(counters[index], 3, cmd);
|
num_to_bytes(counters[index], 3, cmd);
|
||||||
AppendCrc14443a(cmd, sizeof(cmd)-2);
|
AppendCrc14443a(cmd, sizeof(cmd)-2);
|
||||||
}
|
}
|
||||||
EmSendCmdEx(cmd,sizeof(cmd),false);
|
EmSendCmdEx(cmd,sizeof(cmd));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else if (receivedCmd[0] == MIFARE_ULEV1_INCR_CNT && tagType == 7) { // Received a INC COUNTER --
|
} else if (receivedCmd[0] == MIFARE_ULEV1_INCR_CNT && tagType == 7) { // Received a INC COUNTER --
|
||||||
// number of counter
|
// number of counter
|
||||||
|
@ -1127,7 +1127,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
|
|
||||||
// send ACK
|
// send ACK
|
||||||
uint8_t ack[] = {0x0a};
|
uint8_t ack[] = {0x0a};
|
||||||
EmSendCmdEx(ack,sizeof(ack),false);
|
EmSendCmdEx(ack,sizeof(ack));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else if(receivedCmd[0] == MIFARE_ULEV1_CHECKTEAR && tagType == 7) { // Received a CHECK_TEARING_EVENT --
|
} else if(receivedCmd[0] == MIFARE_ULEV1_CHECKTEAR && tagType == 7) { // Received a CHECK_TEARING_EVENT --
|
||||||
// first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature]
|
// first 12 blocks of emu are [getversion answer - check tearing - pack - 0x00 - signature]
|
||||||
|
@ -1136,7 +1136,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
if (receivedCmd[1]<3) counter = receivedCmd[1];
|
if (receivedCmd[1]<3) counter = receivedCmd[1];
|
||||||
emlGetMemBt( emdata, 10+counter, 1);
|
emlGetMemBt( emdata, 10+counter, 1);
|
||||||
AppendCrc14443a(emdata, sizeof(emdata)-2);
|
AppendCrc14443a(emdata, sizeof(emdata)-2);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else if(receivedCmd[0] == ISO14443A_CMD_HALT) { // Received a HALT
|
} else if(receivedCmd[0] == ISO14443A_CMD_HALT) { // Received a HALT
|
||||||
LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
|
LogTrace(receivedCmd, Uart.len, Uart.startTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.endTime*16 - DELAY_AIR2ARM_AS_TAG, Uart.parity, TRUE);
|
||||||
|
@ -1146,7 +1146,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
uint8_t emdata[10];
|
uint8_t emdata[10];
|
||||||
emlGetMemBt( emdata, 0, 8 );
|
emlGetMemBt( emdata, 0, 8 );
|
||||||
AppendCrc14443a(emdata, sizeof(emdata)-2);
|
AppendCrc14443a(emdata, sizeof(emdata)-2);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -1242,7 +1242,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
uint8_t emdata[4];
|
uint8_t emdata[4];
|
||||||
emlGetMemBt( emdata, start, 2);
|
emlGetMemBt( emdata, start, 2);
|
||||||
AppendCrc14443a(emdata, 2);
|
AppendCrc14443a(emdata, 2);
|
||||||
EmSendCmdEx(emdata, sizeof(emdata), false);
|
EmSendCmdEx(emdata, sizeof(emdata));
|
||||||
p_response = NULL;
|
p_response = NULL;
|
||||||
uint32_t pwd = bytes_to_num(receivedCmd+1,4);
|
uint32_t pwd = bytes_to_num(receivedCmd+1,4);
|
||||||
|
|
||||||
|
@ -1338,7 +1338,7 @@ void SimulateIso14443aTag(int tagType, int flags, byte_t* data) {
|
||||||
cmdsRecvd++;
|
cmdsRecvd++;
|
||||||
|
|
||||||
if (p_response != NULL) {
|
if (p_response != NULL) {
|
||||||
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n, receivedCmd[0] == 0x52);
|
EmSendCmd14443aRaw(p_response->modulation, p_response->modulation_n);
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
||||||
GetParity(p_response->response, p_response->response_n, par);
|
GetParity(p_response->response, p_response->response_n, par);
|
||||||
|
@ -1596,10 +1596,11 @@ int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *parity) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen, bool correctionNeeded) {
|
int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen) {
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
uint32_t ThisTransferTime;
|
uint32_t ThisTransferTime;
|
||||||
|
bool correctionNeeded;
|
||||||
|
|
||||||
// Modulate Manchester
|
// Modulate Manchester
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
|
||||||
|
@ -1654,13 +1655,13 @@ int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen, bool correctionNeeded) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LastTimeProxToAirStart = ThisTransferTime + (correctionNeeded?8:0);
|
LastTimeProxToAirStart = ThisTransferTime + (correctionNeeded ? 8 : 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSend4bitEx(uint8_t resp, bool correctionNeeded){
|
int EmSend4bit(uint8_t resp){
|
||||||
Code4bitAnswerAsTag(resp);
|
Code4bitAnswerAsTag(resp);
|
||||||
int res = EmSendCmd14443aRaw(ToSend, ToSendMax, correctionNeeded);
|
int res = EmSendCmd14443aRaw(ToSend, ToSendMax);
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
uint8_t par[1] = {0x00};
|
uint8_t par[1] = {0x00};
|
||||||
GetParity(&resp, 1, par);
|
GetParity(&resp, 1, par);
|
||||||
|
@ -1677,13 +1678,9 @@ int EmSend4bitEx(uint8_t resp, bool correctionNeeded){
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSend4bit(uint8_t resp){
|
int EmSendCmdExPar(uint8_t *resp, uint16_t respLen, uint8_t *par){
|
||||||
return EmSend4bitEx(resp, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
int EmSendCmdExPar(uint8_t *resp, uint16_t respLen, bool correctionNeeded, uint8_t *par){
|
|
||||||
CodeIso14443aAsTagPar(resp, respLen, par);
|
CodeIso14443aAsTagPar(resp, respLen, par);
|
||||||
int res = EmSendCmd14443aRaw(ToSend, ToSendMax, correctionNeeded);
|
int res = EmSendCmd14443aRaw(ToSend, ToSendMax);
|
||||||
// do the tracing for the previous reader request and this tag answer:
|
// do the tracing for the previous reader request and this tag answer:
|
||||||
EmLogTrace(Uart.output,
|
EmLogTrace(Uart.output,
|
||||||
Uart.len,
|
Uart.len,
|
||||||
|
@ -1698,20 +1695,20 @@ int EmSendCmdExPar(uint8_t *resp, uint16_t respLen, bool correctionNeeded, uint8
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSendCmdEx(uint8_t *resp, uint16_t respLen, bool correctionNeeded){
|
int EmSendCmdEx(uint8_t *resp, uint16_t respLen){
|
||||||
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
||||||
GetParity(resp, respLen, par);
|
GetParity(resp, respLen, par);
|
||||||
return EmSendCmdExPar(resp, respLen, correctionNeeded, par);
|
return EmSendCmdExPar(resp, respLen, par);
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSendCmd(uint8_t *resp, uint16_t respLen){
|
int EmSendCmd(uint8_t *resp, uint16_t respLen){
|
||||||
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
uint8_t par[MAX_PARITY_SIZE] = {0x00};
|
||||||
GetParity(resp, respLen, par);
|
GetParity(resp, respLen, par);
|
||||||
return EmSendCmdExPar(resp, respLen, false, par);
|
return EmSendCmdExPar(resp, respLen, par);
|
||||||
}
|
}
|
||||||
|
|
||||||
int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par){
|
int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par){
|
||||||
return EmSendCmdExPar(resp, respLen, false, par);
|
return EmSendCmdExPar(resp, respLen, par);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmLogTrace(uint8_t *reader_data, uint16_t reader_len, uint32_t reader_StartTime, uint32_t reader_EndTime, uint8_t *reader_Parity,
|
bool EmLogTrace(uint8_t *reader_data, uint16_t reader_len, uint32_t reader_StartTime, uint32_t reader_EndTime, uint8_t *reader_Parity,
|
||||||
|
@ -2599,7 +2596,7 @@ void Mifare1ksim(uint8_t flags, uint8_t exitAfterNReads, uint8_t arg2, uint8_t *
|
||||||
// this if-statement doesn't match the specification above. (iceman)
|
// this if-statement doesn't match the specification above. (iceman)
|
||||||
if (len == 1 && ((receivedCmd[0] == ISO14443A_CMD_REQA && cardSTATE != MFEMUL_HALTED) || receivedCmd[0] == ISO14443A_CMD_WUPA)) {
|
if (len == 1 && ((receivedCmd[0] == ISO14443A_CMD_REQA && cardSTATE != MFEMUL_HALTED) || receivedCmd[0] == ISO14443A_CMD_WUPA)) {
|
||||||
selTimer = GetTickCount();
|
selTimer = GetTickCount();
|
||||||
EmSendCmdEx(atqa, sizeof(atqa), (receivedCmd[0] == ISO14443A_CMD_WUPA));
|
EmSendCmdEx(atqa, sizeof(atqa));
|
||||||
cardSTATE = MFEMUL_SELECT1;
|
cardSTATE = MFEMUL_SELECT1;
|
||||||
crypto1_destroy(pcs);
|
crypto1_destroy(pcs);
|
||||||
cardAUTHKEY = 0xff;
|
cardAUTHKEY = 0xff;
|
||||||
|
|
|
@ -96,11 +96,10 @@ extern int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data);
|
||||||
extern int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *resp_data, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades);
|
extern int iso14443a_select_card(uint8_t *uid_ptr, iso14a_card_select_t *resp_data, uint32_t *cuid_ptr, bool anticollision, uint8_t num_cascades);
|
||||||
extern void iso14a_set_trigger(bool enable);
|
extern void iso14a_set_trigger(bool enable);
|
||||||
|
|
||||||
int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen, bool correctionNeeded);
|
int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen);
|
||||||
int EmSend4bitEx(uint8_t resp, bool correctionNeeded);
|
|
||||||
int EmSend4bit(uint8_t resp);
|
int EmSend4bit(uint8_t resp);
|
||||||
int EmSendCmdExPar(uint8_t *resp, uint16_t respLen, bool correctionNeeded, uint8_t *par);
|
int EmSendCmdExPar(uint8_t *resp, uint16_t respLen, uint8_t *par);
|
||||||
int EmSendCmdEx(uint8_t *resp, uint16_t respLen, bool correctionNeeded);
|
int EmSendCmdEx(uint8_t *resp, uint16_t respLen);
|
||||||
extern int EmSendCmd(uint8_t *resp, uint16_t respLen);
|
extern int EmSendCmd(uint8_t *resp, uint16_t respLen);
|
||||||
extern int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *parity);
|
extern int EmGetCmd(uint8_t *received, uint16_t *len, uint8_t *parity);
|
||||||
int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par);
|
int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue