mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-12-28 19:31:19 +08: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:
|
||||
MifareWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||
break;
|
||||
case CMD_MIFAREU_WRITEBL_COMPAT:
|
||||
MifareUWriteBlock(c->arg[0], c->d.asBytes);
|
||||
break;
|
||||
//case CMD_MIFAREU_WRITEBL_COMPAT:
|
||||
//MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
|
||||
//break;
|
||||
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;
|
||||
case CMD_MIFARE_NESTED:
|
||||
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 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);
|
||||
void MifareUWriteBlock_Special(uint8_t arg0, uint8_t arg1, uint8_t *datain);
|
||||
//void MifareUWriteBlockCompat(uint8_t arg0,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 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);
|
||||
|
|
|
@ -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++){
|
||||
if ((i*4) + 4 > CARD_MEMORY_SIZE) {
|
||||
if ((i*4) + 4 >= CARD_MEMORY_SIZE) {
|
||||
Dbprintf("Data exceeds buffer!!");
|
||||
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);
|
||||
|
||||
countblocks *= 4;
|
||||
|
||||
cmd_send(CMD_ACK, 1, countblocks, BigBuf_max_traceLen(), 0, 0);
|
||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||
LEDsoff();
|
||||
|
||||
BigBuf_free();
|
||||
}
|
||||
|
||||
|
@ -411,7 +411,8 @@ void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
|
|||
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;
|
||||
byte_t blockdata[16] = {0x00};
|
||||
|
@ -431,7 +432,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
|||
return;
|
||||
};
|
||||
|
||||
if(mifare_ultra_writeblock(blockNo, blockdata)) {
|
||||
if(mifare_ultra_writeblock_compat(blockNo, blockdata)) {
|
||||
if (MF_DBGLEVEL >= 1) Dbprintf("Write block error");
|
||||
OnError(0);
|
||||
return; };
|
||||
|
@ -448,6 +449,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
|||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||
LEDsoff();
|
||||
}
|
||||
*/
|
||||
|
||||
// Arg0 : Block to write to.
|
||||
// Arg1 : 0 = use no authentication.
|
||||
|
@ -455,7 +457,7 @@ void MifareUWriteBlock(uint8_t arg0, uint8_t *datain)
|
|||
// 2 = use 0x1B authentication.
|
||||
// datain : 4 first bytes is data to be written.
|
||||
// : 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;
|
||||
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");
|
||||
OnError(0);
|
||||
return;
|
||||
|
@ -537,7 +539,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
|||
blockdata[1] = pwd[6];
|
||||
blockdata[2] = pwd[5];
|
||||
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");
|
||||
OnError(44);
|
||||
return;
|
||||
|
@ -547,7 +549,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
|||
blockdata[1] = pwd[2];
|
||||
blockdata[2] = pwd[1];
|
||||
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");
|
||||
OnError(45);
|
||||
return;
|
||||
|
@ -557,7 +559,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
|||
blockdata[1] = pwd[14];
|
||||
blockdata[2] = pwd[13];
|
||||
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");
|
||||
OnError(46);
|
||||
return;
|
||||
|
@ -567,7 +569,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
|
|||
blockdata[1] = pwd[10];
|
||||
blockdata[2] = pwd[9];
|
||||
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");
|
||||
OnError(47);
|
||||
return;
|
||||
|
|
|
@ -65,31 +65,30 @@ uint8_t mf_crypto1_encrypt4bit(struct Crypto1State *pcs, uint8_t data) {
|
|||
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)
|
||||
{
|
||||
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[1] = data[0];
|
||||
dcmd[2] = data[1];
|
||||
dcmd[3] = data[2];
|
||||
dcmd[4] = data[3];
|
||||
dcmd[5] = data[4];
|
||||
AppendCrc14443a(dcmd, 6);
|
||||
ReaderTransmit(dcmd, sizeof(dcmd), NULL);
|
||||
memcpy(dcmd+1,data,data_size);
|
||||
AppendCrc14443a(dcmd, data_size+1);
|
||||
ReaderTransmit(dcmd, sizeof(dcmd), timing);
|
||||
int len = ReaderReceive(answer, answer_parity);
|
||||
if(!len) {
|
||||
if (MF_DBGLEVEL >= 1) Dbprintf("Authentication failed. Card timeout.");
|
||||
return 2;
|
||||
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("%02X Cmd failed. Card timeout.", cmd);
|
||||
len = ReaderReceive(answer,answer_parity);
|
||||
//return 0;
|
||||
}
|
||||
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)
|
||||
{
|
||||
uint8_t dcmd[19];
|
||||
|
@ -131,7 +130,9 @@ int mifare_sendcmd_short_mfuev1auth(struct Crypto1State *pcs, uint8_t crypted, u
|
|||
}
|
||||
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)
|
||||
{
|
||||
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};
|
||||
memcpy(key, keybytes, 4);
|
||||
|
||||
Dbprintf("EV1 Auth : %02x%02x%02x%02x", key[0], key[1], key[2], key[3]);
|
||||
len = mifare_sendcmd_short_mfuev1auth(NULL, 0, 0x1B, key, resp, respPar, NULL);
|
||||
if (MF_DBGLEVEL >= MF_DBG_EXTENDED)
|
||||
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 (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x %u", resp[0], len);
|
||||
return 0;
|
||||
|
@ -380,8 +384,8 @@ int mifare_ultra_auth(uint8_t *keybytes){
|
|||
|
||||
// encrypt out, in, length, key, iv
|
||||
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 (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", resp[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 receivedAnswerPar[MAX_PARITY_SIZE];
|
||||
|
||||
|
||||
len = mifare_sendcmd_short(NULL, 1, 0x30, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
||||
if (len == 1) {
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
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 receivedAnswerPar[MAX_PARITY_SIZE];
|
||||
|
||||
// command MIFARE_CLASSIC_WRITEBLOCK
|
||||
len = mifare_sendcmd_short(NULL, true, 0xA0, blockNo, receivedAnswer, receivedAnswerPar, NULL);
|
||||
|
||||
if ((len != 1) || (receivedAnswer[0] != 0x0A)) { // 0x0a - ACK
|
||||
|
@ -524,20 +529,21 @@ int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData)
|
|||
}
|
||||
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;
|
||||
uint8_t d_block[8] = {0x00};
|
||||
uint8_t d_block[5] = {0x00};
|
||||
uint8_t receivedAnswer[MAX_MIFARE_FRAME_SIZE];
|
||||
uint8_t receivedAnswerPar[MAX_MIFARE_PARITY_SIZE];
|
||||
|
||||
// command MIFARE_CLASSIC_WRITEBLOCK
|
||||
d_block[0]= blockNo;
|
||||
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 (MF_DBGLEVEL >= MF_DBG_ERROR)
|
||||
|
|
|
@ -54,22 +54,24 @@ extern int MF_DBGLEVEL;
|
|||
|
||||
//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_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_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(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_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);
|
||||
|
||||
// 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_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_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_ultra_auth(uint8_t *key);
|
||||
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_special_writeblock(uint8_t blockNo, uint8_t *blockData);
|
||||
int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid);
|
||||
int mifare_ultra_halt();
|
||||
|
||||
// desfire
|
||||
|
|
|
@ -1952,6 +1952,7 @@ int CmdHF14AMfSniff(const char *Cmd){
|
|||
}
|
||||
if (wantDecrypt)
|
||||
mfTraceInit(uid, atqa, sak, wantSaveToEmlFile);
|
||||
|
||||
} else {
|
||||
PrintAndLog("%s(%d):%s", isTag ? "TAG":"RDR", num, sprint_hex(bufPtr, len));
|
||||
if (wantLogToFile)
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include "cmdhf14a.h"
|
||||
#include "mifare.h"
|
||||
#include "util.h"
|
||||
#include "../common/protocols.h"
|
||||
#include "protocols.h"
|
||||
#include "data.h"
|
||||
|
||||
#define MAX_UL_BLOCKS 0x0f
|
||||
|
@ -102,17 +102,20 @@ char *getUlev1CardSizeStr( uint8_t fsize ){
|
|||
|
||||
static void ul_switch_on_field(void) {
|
||||
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT | ISO14A_NO_DISCONNECT, 0, 0}};
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
}
|
||||
|
||||
void ul_switch_off_field(void) {
|
||||
UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
}
|
||||
|
||||
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}};
|
||||
memcpy(c.d.asBytes, cmd, cmdlen);
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
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;
|
||||
|
||||
memcpy(c.d.asBytes, cmd, cmdlen);
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
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}};
|
||||
memcpy(c.d.asBytes, key, 16);
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
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){
|
||||
|
||||
if ( hasAuthKey && (tagtype & UL_C)) {
|
||||
//will select card automatically and close connection on error
|
||||
if (!ulc_authentication(authenticationkey, false)) {
|
||||
|
@ -646,8 +650,6 @@ int CmdHF14AMfUInfo(const char *Cmd){
|
|||
int len = 0;
|
||||
char tempStr[50];
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
while(param_getchar(Cmd, cmdp) != 0x00)
|
||||
{
|
||||
switch(param_getchar(Cmd, cmdp))
|
||||
|
@ -859,8 +861,6 @@ int CmdHF14AMfUWrBl(const char *Cmd){
|
|||
uint8_t authenticationkey[16] = {0x00};
|
||||
uint8_t *authKeyPtr = authenticationkey;
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
// starting with getting tagtype
|
||||
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
||||
if (tagtype == UL_ERROR) return -1;
|
||||
|
@ -960,6 +960,7 @@ int CmdHF14AMfUWrBl(const char *Cmd){
|
|||
memcpy(c.d.asBytes+4,authKeyPtr,4);
|
||||
}
|
||||
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||
|
@ -987,8 +988,6 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
|||
uint8_t authenticationkey[16] = {0x00};
|
||||
uint8_t *authKeyPtr = authenticationkey;
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
// starting with getting tagtype
|
||||
TagTypeUL_t tagtype = GetHF14AMfU_Type();
|
||||
if (tagtype == UL_ERROR) return -1;
|
||||
|
@ -1054,6 +1053,7 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
|||
//Validations
|
||||
if(errors) return usage_hf_mfu_rdbl();
|
||||
}
|
||||
|
||||
if ( blockNo == -1 ) return usage_hf_mfu_rdbl();
|
||||
|
||||
// Swap endianness
|
||||
|
@ -1071,13 +1071,16 @@ int CmdHF14AMfURdBl(const char *Cmd){
|
|||
memcpy(c.d.asBytes,authKeyPtr,4);
|
||||
}
|
||||
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||
uint8_t isOK = resp.arg[0] & 0xff;
|
||||
if (isOK) {
|
||||
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 {
|
||||
PrintAndLog("Failed reading block: (%02x)", isOK);
|
||||
|
@ -1185,8 +1188,6 @@ int CmdHF14AMfUDump(const char *Cmd){
|
|||
uint8_t startPage = 0;
|
||||
char tempStr[50];
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
while(param_getchar(Cmd, cmdp) != 0x00)
|
||||
{
|
||||
switch(param_getchar(Cmd, cmdp))
|
||||
|
@ -1264,6 +1265,8 @@ int CmdHF14AMfUDump(const char *Cmd){
|
|||
|
||||
memcpy(c.d.asBytes, authKeyPtr, dataLen);
|
||||
}
|
||||
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
UsbCommand resp;
|
||||
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("---------------------------------");
|
||||
for (i = 0; i < Pages; ++i) {
|
||||
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;
|
||||
}
|
||||
switch(i){
|
||||
|
@ -1373,7 +1376,7 @@ int CmdHF14AMfUDump(const char *Cmd){
|
|||
case 43: tmplockbit = bit2[9]; break; //auth1
|
||||
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("---------------------------------");
|
||||
|
||||
|
@ -1411,8 +1414,6 @@ int CmdHF14AMfucAuth(const char *Cmd){
|
|||
|
||||
char cmdp = param_getchar(Cmd, 0);
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
//Change key to user defined one
|
||||
if (cmdp == 'k' || cmdp == 'K'){
|
||||
keyNo = param_get8(Cmd, 1);
|
||||
|
@ -1552,8 +1553,6 @@ int CmdHF14AMfucSetPwd(const char *Cmd){
|
|||
|
||||
char cmdp = param_getchar(Cmd, 0);
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
||||
PrintAndLog("Usage: hf mfu setpwd <password (32 hex symbols)>");
|
||||
PrintAndLog(" [password] - (32 hex symbols)");
|
||||
|
@ -1570,6 +1569,7 @@ int CmdHF14AMfucSetPwd(const char *Cmd){
|
|||
|
||||
UsbCommand c = {CMD_MIFAREUC_SETPWD};
|
||||
memcpy( c.d.asBytes, pwd, 16);
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
|
||||
UsbCommand resp;
|
||||
|
@ -1600,8 +1600,6 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
|||
uint8_t uid[7] = {0x00};
|
||||
char cmdp = param_getchar(Cmd, 0);
|
||||
|
||||
clearCommandBuffer();
|
||||
|
||||
if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') {
|
||||
PrintAndLog("Usage: hf mfu setuid <uid (14 hex symbols)>");
|
||||
PrintAndLog(" [uid] - (14 hex symbols)");
|
||||
|
@ -1620,6 +1618,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
|||
// read block2.
|
||||
c.cmd = CMD_MIFAREU_READBL;
|
||||
c.arg[0] = 2;
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||
PrintAndLog("Command execute timeout");
|
||||
|
@ -1637,6 +1636,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
|||
c.d.asBytes[1] = uid[1];
|
||||
c.d.asBytes[2] = uid[2];
|
||||
c.d.asBytes[3] = 0x88 ^ uid[0] ^ uid[1] ^ uid[2];
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
|
||||
PrintAndLog("Command execute timeout");
|
||||
|
@ -1649,6 +1649,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
|||
c.d.asBytes[1] = uid[4];
|
||||
c.d.asBytes[2] = uid[5];
|
||||
c.d.asBytes[3] = uid[6];
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
||||
PrintAndLog("Command execute timeout");
|
||||
|
@ -1661,6 +1662,7 @@ int CmdHF14AMfucSetUid(const char *Cmd){
|
|||
c.d.asBytes[1] = oldblock2[1];
|
||||
c.d.asBytes[2] = oldblock2[2];
|
||||
c.d.asBytes[3] = oldblock2[3];
|
||||
clearCommandBuffer();
|
||||
SendCommand(&c);
|
||||
if (!WaitForResponseTimeout(CMD_ACK,&resp,1500) ) {
|
||||
PrintAndLog("Command execute timeout");
|
||||
|
|
Loading…
Reference in a new issue