#include "common.h"
#include "util.h"
#include "cmdmain.h"
-#include "loclass/des.h"
+#include "polarssl/des.h"
#include "loclass/cipherutils.h"
#include "loclass/cipher.h"
#include "loclass/ikeys.h"
int HFiClassReader(const char *Cmd, bool loop, bool verbose) {
bool tagFound = false;
- UsbCommand c = {CMD_READER_ICLASS, {FLAG_ICLASS_READER_CSN|
- FLAG_ICLASS_READER_CONF|FLAG_ICLASS_READER_AA}};
+ UsbCommand c = {CMD_READER_ICLASS, {FLAG_ICLASS_READER_CSN |
+ FLAG_ICLASS_READER_CC | FLAG_ICLASS_READER_CONF | FLAG_ICLASS_READER_AA |
+ FLAG_ICLASS_READER_ONLY_ONCE | FLAG_ICLASS_READER_ONE_TRY } };
// loop in client not device - else on windows have a communication error
- c.arg[0] |= FLAG_ICLASS_READER_ONLY_ONCE | FLAG_ICLASS_READER_ONE_TRY;
UsbCommand resp;
while(!ukbhit()){
SendCommand(&c);
uint8_t readStatus = resp.arg[0] & 0xff;
uint8_t *data = resp.d.asBytes;
- if (verbose)
- PrintAndLog("Readstatus:%02x", readStatus);
- if( readStatus == 0){
- //Aborted
+ // no tag found or button pressed
+ if( (readStatus == 0 && !loop) || readStatus == 0xFF) {
+ // abort
if (verbose) PrintAndLog("Quitting...");
return 0;
}
- if( readStatus & FLAG_ICLASS_READER_CSN){
+
+ if( readStatus & FLAG_ICLASS_READER_CSN) {
PrintAndLog(" CSN: %s",sprint_hex(data,8));
tagFound = true;
}
- if( readStatus & FLAG_ICLASS_READER_CC) PrintAndLog(" CC: %s",sprint_hex(data+16,8));
- if( readStatus & FLAG_ICLASS_READER_CONF){
+ if( readStatus & FLAG_ICLASS_READER_CC) {
+ PrintAndLog(" CC: %s",sprint_hex(data+16,8));
+ }
+ if( readStatus & FLAG_ICLASS_READER_CONF) {
printIclassDumpInfo(data);
}
- //TODO add iclass read block 05 and test iclass type..
if (readStatus & FLAG_ICLASS_READER_AA) {
bool legacy = true;
- PrintAndLog(" AppIA: %s",sprint_hex(data+8*4,8));
+ PrintAndLog(" AppIA: %s",sprint_hex(data+8*5,8));
for (int i = 0; i<8; i++) {
- if (data[8*4+i] != 0xFF) {
+ if (data[8*5+i] != 0xFF) {
legacy = false;
}
}
SendCommand(&c);
if (!WaitForResponseTimeout(CMD_ACK, &resp, 4500)) {
PrintAndLog("Command execute timeout");
- ul_switch_off_field();
+ DropField();
return 0;
}
uint8_t readStatus = resp.arg[0] & 0xff;
if(readStatus == 0){
PrintAndLog("No tag found...");
- ul_switch_off_field();
+ DropField();
return 0;
}
if( readStatus & (FLAG_ICLASS_READER_CSN|FLAG_ICLASS_READER_CONF|FLAG_ICLASS_READER_CC)){
// large memory - not able to dump pages currently
if (numblks > maxBlk) numblks = maxBlk;
}
- ul_switch_off_field();
+ DropField();
// authenticate debit key and get div_key - later store in dump block 3
if (!select_and_auth(KEY, MAC, div_key, use_credit_key, elite, rawkey, false)){
//try twice - for some reason it sometimes fails the first time...
if (!select_and_auth(KEY, MAC, div_key, use_credit_key, elite, rawkey, false)){
- ul_switch_off_field();
+ DropField();
return 0;
}
}
SendCommand(&w);
if (!WaitForResponseTimeout(CMD_ACK, &resp, 4500)) {
PrintAndLog("Command execute time-out 1");
- ul_switch_off_field();
+ DropField();
return 1;
}
uint32_t blocksRead = resp.arg[1];
uint8_t isOK = resp.arg[0] & 0xff;
if (!isOK && !blocksRead) {
PrintAndLog("Read Block Failed");
- ul_switch_off_field();
+ DropField();
return 0;
}
uint32_t startindex = resp.arg[2];
// try AA2
if (have_credit_key) {
//turn off hf field before authenticating with different key
- ul_switch_off_field();
+ DropField();
memset(MAC,0,4);
// AA2 authenticate credit key and git c_div_key - later store in dump block 4
if (!select_and_auth(CreditKEY, MAC, c_div_key, true, false, false, false)){
//try twice - for some reason it sometimes fails the first time...
if (!select_and_auth(CreditKEY, MAC, c_div_key, true, false, false, false)){
- ul_switch_off_field();
+ DropField();
return 0;
}
}
SendCommand(&w);
if (!WaitForResponseTimeout(CMD_ACK, &resp, 4500)) {
PrintAndLog("Command execute timeout 2");
- ul_switch_off_field();
+ DropField();
return 0;
}
uint8_t isOK = resp.arg[0] & 0xff;
blocksRead = resp.arg[1];
if (!isOK && !blocksRead) {
PrintAndLog("Read Block Failed 2");
- ul_switch_off_field();
+ DropField();
return 0;
}
gotBytes += blocksRead*8;
} else { //field is still on - turn it off...
- ul_switch_off_field();
+ DropField();
}
}
if (cmdp < 6) return usage_hf_iclass_writeblock();
int ans = WriteBlock(blockno, bldata, KEY, use_credit_key, elite, rawkey, true);
- ul_switch_off_field();
+ DropField();
return ans;
}
{"loclass", CmdHFiClass_loclass, 1, "[options..] Use loclass to perform bruteforce of reader attack dump"},
{"managekeys", CmdHFiClassManageKeys, 1, "[options..] Manage the keys to use with iClass"},
{"readblk", CmdHFiClass_ReadBlock, 0, "[options..] Authenticate and Read iClass block"},
- {"reader", CmdHFiClassReader, 0, " Read an iClass tag"},
+ {"reader", CmdHFiClassReader, 0, " Look for iClass tags until a key or the pm3 button is pressed"},
{"readtagfile", CmdHFiClassReadTagFile, 1, "[options..] Display Content from tagfile"},
{"replay", CmdHFiClassReader_Replay, 0, "<mac> Read an iClass tag via Reply Attack"},
{"sim", CmdHFiClassSim, 0, "[options..] Simulate iClass tag"},