mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
CHG: @marshmellow42 changes on deviceside.
ADD: increase debuglevel for printing a statment in ul_ev1_auth
This commit is contained in:
parent
b18948fd92
commit
95aeb706d7
7 changed files with 78 additions and 65 deletions
|
@ -844,11 +844,11 @@ void UsbPacketReceived(uint8_t *packet, int len)
|
||||||
case CMD_MIFARE_WRITEBL:
|
case CMD_MIFARE_WRITEBL:
|
||||||
MifareWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
MifareWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||||
break;
|
break;
|
||||||
case CMD_MIFAREU_WRITEBL_COMPAT:
|
//case CMD_MIFAREU_WRITEBL_COMPAT:
|
||||||
MifareUWriteBlock(c->arg[0], c->d.asBytes);
|
//MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
|
||||||
break;
|
//break;
|
||||||
case CMD_MIFAREU_WRITEBL:
|
case CMD_MIFAREU_WRITEBL:
|
||||||
MifareUWriteBlock_Special(c->arg[0], c->arg[1], c->d.asBytes);
|
MifareUWriteBlock(c->arg[0], c->arg[1], c->d.asBytes);
|
||||||
break;
|
break;
|
||||||
case CMD_MIFARE_NESTED:
|
case CMD_MIFARE_NESTED:
|
||||||
MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||||
|
|
|
@ -179,8 +179,8 @@ void MifareUC_Auth(uint8_t arg0, uint8_t *datain);
|
||||||
void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain);
|
void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, 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 MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void MifareUWriteBlock(uint8_t arg0,uint8_t *datain);
|
//void MifareUWriteBlockCompat(uint8_t arg0,uint8_t *datain);
|
||||||
void MifareUWriteBlock_Special(uint8_t arg0, uint8_t arg1, uint8_t *datain);
|
void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain);
|
||||||
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
||||||
void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void Mifare1ksim(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void Mifare1ksim(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
|
|
|
@ -300,7 +300,7 @@ void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < blocks; i++){
|
for (int i = 0; i < blocks; i++){
|
||||||
if ((i*4) + 4 > CARD_MEMORY_SIZE) {
|
if ((i*4) + 4 >= CARD_MEMORY_SIZE) {
|
||||||
Dbprintf("Data exceeds buffer!!");
|
Dbprintf("Data exceeds buffer!!");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -332,10 +332,10 @@ void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
if (MF_DBGLEVEL >= MF_DBG_EXTENDED) Dbprintf("Blocks read %d", countblocks);
|
if (MF_DBGLEVEL >= MF_DBG_EXTENDED) Dbprintf("Blocks read %d", countblocks);
|
||||||
|
|
||||||
countblocks *= 4;
|
countblocks *= 4;
|
||||||
|
|
||||||
cmd_send(CMD_ACK, 1, countblocks, BigBuf_max_traceLen(), 0, 0);
|
cmd_send(CMD_ACK, 1, countblocks, BigBuf_max_traceLen(), 0, 0);
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
LEDsoff();
|
LEDsoff();
|
||||||
|
|
||||||
BigBuf_free();
|
BigBuf_free();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,7 +411,8 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
||||||
LEDsoff();
|
LEDsoff();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
/* // Command not needed but left for future testing
|
||||||
|
void MifareUWriteBlockCompat(uint8_t arg0, uint8_t *datain)
|
||||||
{
|
{
|
||||||
uint8_t blockNo = arg0;
|
uint8_t blockNo = arg0;
|
||||||
byte_t blockdata[16] = {0x00};
|
byte_t blockdata[16] = {0x00};
|
||||||
|
@ -431,7 +432,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
if(mifare_ultra_writeblock(blockNo, blockdata)) {
|
if(mifare_ultra_writeblock_compat(blockNo, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(0);
|
OnError(0);
|
||||||
return; };
|
return; };
|
||||||
|
@ -448,6 +449,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
LEDsoff();
|
LEDsoff();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Arg0 : Block to write to.
|
// Arg0 : Block to write to.
|
||||||
// Arg1 : 0 = use no authentication.
|
// Arg1 : 0 = use no authentication.
|
||||||
|
@ -455,7 +457,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
||||||
// 2 = use 0x1B authentication.
|
// 2 = use 0x1B authentication.
|
||||||
// datain : 4 first bytes is data to be written.
|
// datain : 4 first bytes is data to be written.
|
||||||
// : 4/16 next bytes is authentication key.
|
// : 4/16 next bytes is authentication key.
|
||||||
void MifareUWriteBlock_Special(uint8_t arg0, uint8_t arg1, uint8_t *datain)
|
void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)
|
||||||
{
|
{
|
||||||
uint8_t blockNo = arg0;
|
uint8_t blockNo = arg0;
|
||||||
bool useKey = (arg1 == 1); //UL_C
|
bool useKey = (arg1 == 1); //UL_C
|
||||||
|
@ -497,7 +499,7 @@ void MifareUWriteBlock_Special(uint8_t arg0, uint8_t arg1, uint8_t *datain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mifare_ultra_special_writeblock(blockNo, blockdata)) {
|
if(mifare_ultra_writeblock(blockNo, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(0);
|
OnError(0);
|
||||||
return;
|
return;
|
||||||
|
@ -537,7 +539,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
||||||
blockdata[1] = pwd[6];
|
blockdata[1] = pwd[6];
|
||||||
blockdata[2] = pwd[5];
|
blockdata[2] = pwd[5];
|
||||||
blockdata[3] = pwd[4];
|
blockdata[3] = pwd[4];
|
||||||
if(mifare_ultra_special_writeblock( 44, blockdata)) {
|
if(mifare_ultra_writeblock( 44, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(44);
|
OnError(44);
|
||||||
return;
|
return;
|
||||||
|
@ -547,7 +549,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
||||||
blockdata[1] = pwd[2];
|
blockdata[1] = pwd[2];
|
||||||
blockdata[2] = pwd[1];
|
blockdata[2] = pwd[1];
|
||||||
blockdata[3] = pwd[0];
|
blockdata[3] = pwd[0];
|
||||||
if(mifare_ultra_special_writeblock( 45, blockdata)) {
|
if(mifare_ultra_writeblock( 45, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(45);
|
OnError(45);
|
||||||
return;
|
return;
|
||||||
|
@ -557,7 +559,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
||||||
blockdata[1] = pwd[14];
|
blockdata[1] = pwd[14];
|
||||||
blockdata[2] = pwd[13];
|
blockdata[2] = pwd[13];
|
||||||
blockdata[3] = pwd[12];
|
blockdata[3] = pwd[12];
|
||||||
if(mifare_ultra_special_writeblock( 46, blockdata)) {
|
if(mifare_ultra_writeblock( 46, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(46);
|
OnError(46);
|
||||||
return;
|
return;
|
||||||
|
@ -567,7 +569,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
||||||
blockdata[1] = pwd[10];
|
blockdata[1] = pwd[10];
|
||||||
blockdata[2] = pwd[9];
|
blockdata[2] = pwd[9];
|
||||||
blockdata[3] = pwd[8];
|
blockdata[3] = pwd[8];
|
||||||
if(mifare_ultra_special_writeblock( 47, blockdata)) {
|
if(mifare_ultra_writeblock( 47, blockdata)) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||||
OnError(47);
|
OnError(47);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -65,31 +65,30 @@ uint8_t mf_crypto1_encrypt4bit(struct Crypto1State *pcs, uint8_t data) {
|
||||||
return bt;
|
return bt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send commands
|
// send 2 byte commands
|
||||||
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing)
|
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing)
|
||||||
{
|
{
|
||||||
return mifare_sendcmd_shortex(pcs, crypted, cmd, data, answer, answer_parity, timing);
|
return mifare_sendcmd_shortex(pcs, crypted, cmd, data, answer, answer_parity, timing);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mifare_sendcmd_short_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t* data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing)
|
// send X byte basic commands
|
||||||
|
int mifare_sendcmd(uint8_t cmd, uint8_t* data, uint8_t data_size, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing)
|
||||||
{
|
{
|
||||||
uint8_t dcmd[8];
|
uint8_t dcmd[data_size+3];
|
||||||
dcmd[0] = cmd;
|
dcmd[0] = cmd;
|
||||||
dcmd[1] = data[0];
|
memcpy(dcmd+1,data,data_size);
|
||||||
dcmd[2] = data[1];
|
AppendCrc14443a(dcmd, data_size+1);
|
||||||
dcmd[3] = data[2];
|
ReaderTransmit(dcmd, sizeof(dcmd), timing);
|
||||||
dcmd[4] = data[3];
|
|
||||||
dcmd[5] = data[4];
|
|
||||||
AppendCrc14443a(dcmd, 6);
|
|
||||||
ReaderTransmit(dcmd, sizeof(dcmd), NULL);
|
|
||||||
int len = ReaderReceive(answer, answer_parity);
|
int len = ReaderReceive(answer, answer_parity);
|
||||||
if(!len) {
|
if(!len) {
|
||||||
if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Card timeout.");
|
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("%02X Cmd failed. Card timeout.", cmd);
|
||||||
return 2;
|
len = ReaderReceive(answer,answer_parity);
|
||||||
|
//return 0;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
int mifare_sendcmd_short_mfucauth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing)
|
int mifare_sendcmd_short_mfucauth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing)
|
||||||
{
|
{
|
||||||
uint8_t dcmd[19];
|
uint8_t dcmd[19];
|
||||||
|
@ -131,7 +130,9 @@ int mifare_sendcmd_short_mfuev1auth(struct Crypto1State *pcs, uint8_t crypted, u
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// send 2 byte commands
|
||||||
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing)
|
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing)
|
||||||
{
|
{
|
||||||
uint8_t dcmd[4], ecmd[4];
|
uint8_t dcmd[4], ecmd[4];
|
||||||
|
@ -318,8 +319,11 @@ int mifare_ul_ev1_auth(uint8_t *keybytes, uint8_t *pack){
|
||||||
uint8_t key[4] = {0x00};
|
uint8_t key[4] = {0x00};
|
||||||
memcpy(key, keybytes, 4);
|
memcpy(key, keybytes, 4);
|
||||||
|
|
||||||
Dbprintf("EV1 Auth : %02x%02x%02x%02x", key[0], key[1], key[2], key[3]);
|
if (MF_DBGLEVEL >= MF_DBG_EXTENDED)
|
||||||
len = mifare_sendcmd_short_mfuev1auth(NULL, 0, 0x1B, key, resp, respPar, NULL);
|
Dbprintf("EV1 Auth : %02x%02x%02x%02x", key[0], key[1], key[2], key[3]);
|
||||||
|
|
||||||
|
len = mifare_sendcmd(0x1B, key, sizeof(key), resp, respPar, NULL);
|
||||||
|
//len = mifare_sendcmd_short_mfuev1auth(NULL, 0, 0x1B, key, resp, respPar, NULL);
|
||||||
if (len != 4) {
|
if (len != 4) {
|
||||||
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x %u", resp[0], len);
|
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x %u", resp[0], len);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -380,8 +384,8 @@ int mifare_ultra_auth(uint8_t *keybytes){
|
||||||
|
|
||||||
// encrypt out, in, length, key, iv
|
// encrypt out, in, length, key, iv
|
||||||
tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);
|
tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);
|
||||||
|
//len = mifare_sendcmd_short_mfucauth(NULL, 1, 0xAF, rnd_ab, resp, respPar, NULL);
|
||||||
len = mifare_sendcmd_short_mfucauth(NULL, 1, 0xAF, rnd_ab, resp, respPar, NULL);
|
len = mifare_sendcmd(0xAF, rnd_ab, sizeof(rnd_ab), resp, respPar, NULL);
|
||||||
if (len != 11) {
|
if (len != 11) {
|
||||||
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", resp[0]);
|
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", resp[0]);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -425,6 +429,7 @@ int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData)
|
||||||
uint8_t receivedAnswer[MAX_FRAME_SIZE];
|
uint8_t receivedAnswer[MAX_FRAME_SIZE];
|
||||||
uint8_t receivedAnswerPar[MAX_PARITY_SIZE];
|
uint8_t receivedAnswerPar[MAX_PARITY_SIZE];
|
||||||
|
|
||||||
|
|
||||||
len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
||||||
if (len == 1) {
|
if (len == 1) {
|
||||||
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);
|
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]);
|
||||||
|
@ -493,7 +498,8 @@ int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t bl
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData)
|
/* // command not needed, but left for future testing
|
||||||
|
int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData)
|
||||||
{
|
{
|
||||||
uint16_t len;
|
uint16_t len;
|
||||||
uint8_t par[3] = {0}; // enough for 18 parity bits
|
uint8_t par[3] = {0}; // enough for 18 parity bits
|
||||||
|
@ -501,7 +507,6 @@ int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData)
|
||||||
uint8_t receivedAnswer[MAX_FRAME_SIZE];
|
uint8_t receivedAnswer[MAX_FRAME_SIZE];
|
||||||
uint8_t receivedAnswerPar[MAX_PARITY_SIZE];
|
uint8_t receivedAnswerPar[MAX_PARITY_SIZE];
|
||||||
|
|
||||||
// command MIFARE_CLASSIC_WRITEBLOCK
|
|
||||||
len = mifare_sendcmd_short(NULL, true, 0xA0, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
len = mifare_sendcmd_short(NULL, true, 0xA0, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
||||||
|
|
||||||
if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK
|
if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK
|
||||||
|
@ -524,20 +529,21 @@ int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
int mifare_ultra_special_writeblock(uint8_t blockNo, uint8_t *blockData)
|
int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData)
|
||||||
{
|
{
|
||||||
uint16_t len;
|
uint16_t len;
|
||||||
uint8_t d_block[8] = {0x00};
|
uint8_t d_block[5] = {0x00};
|
||||||
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
|
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
|
||||||
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];
|
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];
|
||||||
|
|
||||||
// command MIFARE_CLASSIC_WRITEBLOCK
|
// command MIFARE_CLASSIC_WRITEBLOCK
|
||||||
d_block[0]= blockNo;
|
d_block[0]= blockNo;
|
||||||
memcpy(d_block+1,blockData,4);
|
memcpy(d_block+1,blockData,4);
|
||||||
AppendCrc14443a(d_block, 6);
|
//AppendCrc14443a(d_block, 6);
|
||||||
|
|
||||||
len = mifare_sendcmd_short_special(NULL, 1, 0xA2, d_block, receivedAnswer, receivedAnswerPar, NULL);
|
len = mifare_sendcmd(0xA2, d_block, sizeof(d_block), receivedAnswer, receivedAnswerPar, NULL);
|
||||||
|
|
||||||
if (receivedAnswer[0] != 0x0A) { // 0x0a - ACK
|
if (receivedAnswer[0] != 0x0A) { // 0x0a - ACK
|
||||||
if (MF_DBGLEVEL >= MF_DBG_ERROR)
|
if (MF_DBGLEVEL >= MF_DBG_ERROR)
|
||||||
|
|
|
@ -54,22 +54,24 @@ extern int MF_DBGLEVEL;
|
||||||
|
|
||||||
//functions
|
//functions
|
||||||
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
||||||
int mifare_sendcmd_short_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
int mifare_sendcmd(uint8_t cmd, uint8_t *data, uint8_t data_size, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
||||||
|
//int mifare_sendcmd_short_mfucauth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing);
|
||||||
int mifare_sendcmd_short_mfucauth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing);
|
//int mifare_sendcmd_short_mfuev1auth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing);
|
||||||
int mifare_sendcmd_short_mfuev1auth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing);
|
|
||||||
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint8_t *answer_parity, uint32_t *timing);
|
||||||
|
|
||||||
|
// mifare classic
|
||||||
int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested);
|
int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested);
|
||||||
int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t * ntptr, uint32_t *timing);
|
int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint8_t isNested, uint32_t * ntptr, uint32_t *timing);
|
||||||
int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
|
int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid);
|
||||||
|
int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
|
|
||||||
|
// Ultralight/NTAG...
|
||||||
int mifare_ul_ev1_auth(uint8_t *key, uint8_t *pack);
|
int mifare_ul_ev1_auth(uint8_t *key, uint8_t *pack);
|
||||||
int mifare_ultra_auth(uint8_t *key);
|
int mifare_ultra_auth(uint8_t *key);
|
||||||
int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData);
|
int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData);
|
||||||
int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
//int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData);
|
||||||
int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData);
|
int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData);
|
||||||
int mifare_ultra_special_writeblock(uint8_t blockNo, uint8_t *blockData);
|
|
||||||
int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid);
|
|
||||||
int mifare_ultra_halt();
|
int mifare_ultra_halt();
|
||||||
|
|
||||||
// desfire
|
// desfire
|
||||||
|
|
|
@ -1952,6 +1952,7 @@ int CmdHF14AMfSniff(const char *Cmd){
|
||||||
}
|
}
|
||||||
if (wantDecrypt)
|
if (wantDecrypt)
|
||||||
mfTraceInit(uid, atqa, sak, wantSaveToEmlFile);
|
mfTraceInit(uid, atqa, sak, wantSaveToEmlFile);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
PrintAndLog("%s(%d):%s", isTag ? "TAG":"RDR", num, sprint_hex(bufPtr, len));
|
PrintAndLog("%s(%d):%s", isTag ? "TAG":"RDR", num, sprint_hex(bufPtr, len));
|
||||||
if (wantLogToFile)
|
if (wantLogToFile)
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include "cmdhf14a.h"
|
#include "cmdhf14a.h"
|
||||||
#include "mifare.h"
|
#include "mifare.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "../common/protocols.h"
|
#include "protocols.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
|
|
||||||
#define MAX_UL_BLOCKS 0x0f
|
#define MAX_UL_BLOCKS 0x0f
|
||||||
|
@ -102,17 +102,20 @@ char *getUlev1CardSizeStr( uint8_t fsize ){
|
||||||
|
|
||||||
static void ul_switch_on_field(void) {
|
static void ul_switch_on_field(void) {
|
||||||
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0}};
|
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0}};
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ul_switch_off_field(void) {
|
void ul_switch_off_field(void) {
|
||||||
UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
|
UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ul_send_cmd_raw( uint8_t *cmd, uint8_t cmdlen, uint8_t *response, uint16_t responseLength ) {
|
static int ul_send_cmd_raw( uint8_t *cmd, uint8_t cmdlen, uint8_t *response, uint16_t responseLength ) {
|
||||||
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_RAW | ISO14A_NO_DISCONNECT | ISO14A_APPEND_CRC, cmdlen, 0}};
|
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_RAW | ISO14A_NO_DISCONNECT | ISO14A_APPEND_CRC, cmdlen, 0}};
|
||||||
memcpy(c.d.asBytes, cmd, cmdlen);
|
memcpy(c.d.asBytes, cmd, cmdlen);
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) return -1;
|
if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) return -1;
|
||||||
|
@ -129,6 +132,7 @@ static int ul_send_cmd_raw_crc( uint8_t *cmd, uint8_t cmdlen, uint8_t *response,
|
||||||
c.arg[0] |= ISO14A_APPEND_CRC;
|
c.arg[0] |= ISO14A_APPEND_CRC;
|
||||||
|
|
||||||
memcpy(c.d.asBytes, cmd, cmdlen);
|
memcpy(c.d.asBytes, cmd, cmdlen);
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) return -1;
|
if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)) return -1;
|
||||||
|
@ -193,6 +197,7 @@ static int ulc_authentication( uint8_t *key, bool switch_off_field ){
|
||||||
|
|
||||||
UsbCommand c = {CMD_MIFAREUC_AUTH, {switch_off_field}};
|
UsbCommand c = {CMD_MIFAREUC_AUTH, {switch_off_field}};
|
||||||
memcpy(c.d.asBytes, key, 16);
|
memcpy(c.d.asBytes, key, 16);
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if ( !WaitForResponseTimeout(CMD_ACK, &resp, 1500) ) return 0;
|
if ( !WaitForResponseTimeout(CMD_ACK, &resp, 1500) ) return 0;
|
||||||
|
@ -209,7 +214,6 @@ static int ulev1_requestAuthentication( uint8_t *pwd, uint8_t *pack, uint16_t pa
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ul_auth_select( iso14a_card_select_t *card, TagTypeUL_t tagtype, bool hasAuthKey, uint8_t *authenticationkey, uint8_t *pack, uint8_t packSize){
|
static int ul_auth_select( iso14a_card_select_t *card, TagTypeUL_t tagtype, bool hasAuthKey, uint8_t *authenticationkey, uint8_t *pack, uint8_t packSize){
|
||||||
|
|
||||||
if ( hasAuthKey && (tagtype & UL_C)) {
|
if ( hasAuthKey && (tagtype & UL_C)) {
|
||||||
//will select card automatically and close connection on error
|
//will select card automatically and close connection on error
|
||||||
if (!ulc_authentication(authenticationkey, false)) {
|
if (!ulc_authentication(authenticationkey, false)) {
|
||||||
|
@ -646,8 +650,6 @@ int CmdHF14AMfUInfo(const char *Cmd){
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char tempStr[50];
|
char tempStr[50];
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
while(param_getchar(Cmd, cmdp) != 0x00)
|
while(param_getchar(Cmd, cmdp) != 0x00)
|
||||||
{
|
{
|
||||||
switch(param_getchar(Cmd, cmdp))
|
switch(param_getchar(Cmd, cmdp))
|
||||||
|
@ -859,8 +861,6 @@ int CmdHF14AMfUWrBl(const char *Cmd){
|
||||||
uint8_t authenticationkey[16] = {0x00};
|
uint8_t authenticationkey[16] = {0x00};
|
||||||
uint8_t *authKeyPtr = authenticationkey;
|
uint8_t *authKeyPtr = authenticationkey;
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
// starting with getting tagtype
|
// starting with getting tagtype
|
||||||
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
||||||
if (tagtype == UL_ERROR) return -1;
|
if (tagtype == UL_ERROR) return -1;
|
||||||
|
@ -960,6 +960,7 @@ int CmdHF14AMfUWrBl(const char *Cmd){
|
||||||
memcpy(c.d.asBytes+4,authKeyPtr,4);
|
memcpy(c.d.asBytes+4,authKeyPtr,4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||||
|
@ -987,8 +988,6 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
||||||
uint8_t authenticationkey[16] = {0x00};
|
uint8_t authenticationkey[16] = {0x00};
|
||||||
uint8_t *authKeyPtr = authenticationkey;
|
uint8_t *authKeyPtr = authenticationkey;
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
// starting with getting tagtype
|
// starting with getting tagtype
|
||||||
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
||||||
if (tagtype == UL_ERROR) return -1;
|
if (tagtype == UL_ERROR) return -1;
|
||||||
|
@ -1054,6 +1053,7 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
||||||
//Validations
|
//Validations
|
||||||
if(errors) return usage_hf_mfu_rdbl();
|
if(errors) return usage_hf_mfu_rdbl();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( blockNo == -1 ) return usage_hf_mfu_rdbl();
|
if ( blockNo == -1 ) return usage_hf_mfu_rdbl();
|
||||||
|
|
||||||
// Swap endianness
|
// Swap endianness
|
||||||
|
@ -1071,13 +1071,16 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
||||||
memcpy(c.d.asBytes,authKeyPtr,4);
|
memcpy(c.d.asBytes,authKeyPtr,4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||||
uint8_t isOK = resp.arg[0] & 0xff;
|
uint8_t isOK = resp.arg[0] & 0xff;
|
||||||
if (isOK) {
|
if (isOK) {
|
||||||
uint8_t *data = resp.d.asBytes;
|
uint8_t *data = resp.d.asBytes;
|
||||||
PrintAndLog("Block: %0d (0x%02X) [ %s]", blockNo, blockNo, sprint_hex(data, 4));
|
PrintAndLog("\nBlock# | Data | Ascii");
|
||||||
|
PrintAndLog("-----------------------------");
|
||||||
|
PrintAndLog("%02d/0x%02X | %s| %.4s\n", blockNo, blockNo, sprint_hex(data, 4), data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PrintAndLog("Failed reading block: (%02x)", isOK);
|
PrintAndLog("Failed reading block: (%02x)", isOK);
|
||||||
|
@ -1185,8 +1188,6 @@ int CmdHF14AMfUDump(const char *Cmd){
|
||||||
uint8_t startPage = 0;
|
uint8_t startPage = 0;
|
||||||
char tempStr[50];
|
char tempStr[50];
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
while(param_getchar(Cmd, cmdp) != 0x00)
|
while(param_getchar(Cmd, cmdp) != 0x00)
|
||||||
{
|
{
|
||||||
switch(param_getchar(Cmd, cmdp))
|
switch(param_getchar(Cmd, cmdp))
|
||||||
|
@ -1264,6 +1265,8 @@ int CmdHF14AMfUDump(const char *Cmd){
|
||||||
|
|
||||||
memcpy(c.d.asBytes, authKeyPtr, dataLen);
|
memcpy(c.d.asBytes, authKeyPtr, dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
if (!WaitForResponseTimeout(CMD_ACK, &resp,1500)) {
|
if (!WaitForResponseTimeout(CMD_ACK, &resp,1500)) {
|
||||||
|
@ -1322,11 +1325,11 @@ int CmdHF14AMfUDump(const char *Cmd){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLog("Block# | Data |lck| Ascii");
|
PrintAndLog("\nBlock# | Data |lck| Ascii");
|
||||||
PrintAndLog("---------------------------------");
|
PrintAndLog("---------------------------------");
|
||||||
for (i = 0; i < Pages; ++i) {
|
for (i = 0; i < Pages; ++i) {
|
||||||
if ( i < 3 ) {
|
if ( i < 3 ) {
|
||||||
PrintAndLog("%02d/0x%02X | %s | |", i, i,sprint_hex(data + i * 4, 4));
|
PrintAndLog("%02d/0x%02X | %s| | ", i+startPage, i+startPage, sprint_hex(data + i * 4, 4));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
switch(i){
|
switch(i){
|
||||||
|
@ -1373,7 +1376,7 @@ int CmdHF14AMfUDump(const char *Cmd){
|
||||||
case 43: tmplockbit = bit2[9]; break; //auth1
|
case 43: tmplockbit = bit2[9]; break; //auth1
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
PrintAndLog("%02d/0x%02X | %s |%d| %.4s",i , i, sprint_hex(data + i * 4, 4), tmplockbit, data+i*4);
|
PrintAndLog("%02d/0x%02X | %s| %d | %.4s", i+startPage, i+startPage, sprint_hex(data + i * 4, 4), tmplockbit, data+i*4);
|
||||||
}
|
}
|
||||||
PrintAndLog("---------------------------------");
|
PrintAndLog("---------------------------------");
|
||||||
|
|
||||||
|
@ -1411,8 +1414,6 @@ int CmdHF14AMfucAuth(const char *Cmd){
|
||||||
|
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
//Change key to user defined one
|
//Change key to user defined one
|
||||||
if (cmdp == 'k' || cmdp == 'K'){
|
if (cmdp == 'k' || cmdp == 'K'){
|
||||||
keyNo = param_get8(Cmd, 1);
|
keyNo = param_get8(Cmd, 1);
|
||||||
|
@ -1552,8 +1553,6 @@ int CmdHF14AMfucSetPwd(const char *Cmd){
|
||||||
|
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
||||||
PrintAndLog("Usage: hf mfu setpwd <password (32 hex symbols)>");
|
PrintAndLog("Usage: hf mfu setpwd <password (32 hex symbols)>");
|
||||||
PrintAndLog(" [password] - (32 hex symbols)");
|
PrintAndLog(" [password] - (32 hex symbols)");
|
||||||
|
@ -1570,6 +1569,7 @@ int CmdHF14AMfucSetPwd(const char *Cmd){
|
||||||
|
|
||||||
UsbCommand c = {CMD_MIFAREUC_SETPWD};
|
UsbCommand c = {CMD_MIFAREUC_SETPWD};
|
||||||
memcpy( c.d.asBytes, pwd, 16);
|
memcpy( c.d.asBytes, pwd, 16);
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
||||||
UsbCommand resp;
|
UsbCommand resp;
|
||||||
|
@ -1600,8 +1600,6 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
||||||
uint8_t uid[7] = {0x00};
|
uint8_t uid[7] = {0x00};
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
char cmdp = param_getchar(Cmd, 0);
|
||||||
|
|
||||||
clearCommandBuffer();
|
|
||||||
|
|
||||||
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
||||||
PrintAndLog("Usage: hf mfu setuid <uid (14 hex symbols)>");
|
PrintAndLog("Usage: hf mfu setuid <uid (14 hex symbols)>");
|
||||||
PrintAndLog(" [uid] - (14 hex symbols)");
|
PrintAndLog(" [uid] - (14 hex symbols)");
|
||||||
|
@ -1620,6 +1618,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
||||||
// read block2.
|
// read block2.
|
||||||
c.cmd = CMD_MIFAREU_READBL;
|
c.cmd = CMD_MIFAREU_READBL;
|
||||||
c.arg[0] = 2;
|
c.arg[0] = 2;
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||||
PrintAndLog("Command execute timeout");
|
PrintAndLog("Command execute timeout");
|
||||||
|
@ -1637,6 +1636,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
||||||
c.d.asBytes[1] = uid[1];
|
c.d.asBytes[1] = uid[1];
|
||||||
c.d.asBytes[2] = uid[2];
|
c.d.asBytes[2] = uid[2];
|
||||||
c.d.asBytes[3] = 0x88 ^ uid[0] ^ uid[1] ^ uid[2];
|
c.d.asBytes[3] = 0x88 ^ uid[0] ^ uid[1] ^ uid[2];
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||||
PrintAndLog("Command execute timeout");
|
PrintAndLog("Command execute timeout");
|
||||||
|
@ -1649,6 +1649,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
||||||
c.d.asBytes[1] = uid[4];
|
c.d.asBytes[1] = uid[4];
|
||||||
c.d.asBytes[2] = uid[5];
|
c.d.asBytes[2] = uid[5];
|
||||||
c.d.asBytes[3] = uid[6];
|
c.d.asBytes[3] = uid[6];
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
||||||
PrintAndLog("Command execute timeout");
|
PrintAndLog("Command execute timeout");
|
||||||
|
@ -1661,6 +1662,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
||||||
c.d.asBytes[1] = oldblock2[1];
|
c.d.asBytes[1] = oldblock2[1];
|
||||||
c.d.asBytes[2] = oldblock2[2];
|
c.d.asBytes[2] = oldblock2[2];
|
||||||
c.d.asBytes[3] = oldblock2[3];
|
c.d.asBytes[3] = oldblock2[3];
|
||||||
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
||||||
PrintAndLog("Command execute timeout");
|
PrintAndLog("Command execute timeout");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue