chg: 'hf iclass chk' - added option E to target elite keys. added option R to interpret dictionary file as raw (diversified keys) instead.

This commit is contained in:
iceman1001 2017-12-16 19:13:10 +01:00
commit 7aaa335ab1

View file

@ -219,10 +219,16 @@ int usage_hf_iclass_loclass(void) {
return 0; return 0;
} }
int usage_hf_iclass_chk(void) { int usage_hf_iclass_chk(void) {
PrintAndLog("Usage: hf iclass chk [h] <f (*.dic)>"); PrintAndLog("Checkkeys loads a dictionary text file with 8byte hex keys to test authenticating against a iClass tag");
PrintAndLog("Usage: hf iclass chk [h|e|r] <f (*.dic)>");
PrintAndLog("Options:"); PrintAndLog("Options:");
PrintAndLog("h Show this help"); PrintAndLog(" h Show this help");
PrintAndLog("f <filename> Dictionary file with default iclass keys"); PrintAndLog(" f <filename> Dictionary file with default iclass keys");
PrintAndLog(" e target Elite / High security key scheme");
PrintAndLog(" r interpret dictionary file as raw (diversified keys)");
PrintAndLog("Samples:");
PrintAndLog(" hf iclass chk f default_iclass_keys.dic");
PrintAndLog(" hf iclass chk f default_iclass_keys.dic e");
return 0; return 0;
} }
@ -1815,37 +1821,59 @@ int CmdHFiClassManageKeys(const char *Cmd) {
int CmdHFiClassCheckKeys(const char *Cmd) { int CmdHFiClassCheckKeys(const char *Cmd) {
char ctmp = 0x00;
ctmp = param_getchar(Cmd, 0);
if (ctmp == 'h' || ctmp == 'H') return usage_hf_iclass_chk();
uint8_t mac[4] = {0x00,0x00,0x00,0x00}; uint8_t mac[4] = {0x00,0x00,0x00,0x00};
uint8_t key[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint8_t key[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t div_key[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint8_t div_key[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// elite key, raw key, standard key // elite key, raw key, standard key
bool elite = false; bool use_elite = false;
bool rawkey = false; bool use_raw = false;
bool found_debit = false; bool found_debit = false;
bool found_credit = false; bool found_credit = false;
bool errors = false;
uint8_t cmdp = 0x00;
FILE * f; FILE * f;
char filename[FILE_PATH_SIZE] = {0}; char filename[FILE_PATH_SIZE] = {0};
uint8_t fileNameLen = 0;
char buf[17]; char buf[17];
uint8_t *keyBlock = NULL, *p; uint8_t *keyBlock = NULL, *p;
int keyitems = 0, keycnt = 0; int keyitems = 0, keycnt = 0;
while (param_getchar(Cmd, cmdp) != 0x00 && !errors) {
// May be a dictionary file switch (param_getchar(Cmd, cmdp)) {
if ( param_getstr(Cmd, 1, filename, sizeof(filename)) >= FILE_PATH_SIZE ) { case 'h':
PrintAndLog("File name too long"); case 'H':
free(keyBlock); return usage_hf_iclass_chk();
return 2; case 'f':
case 'F':
fileNameLen = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));
if (fileNameLen < 1) {
PrintAndLog("No filename found after f");
errors = true;
} }
cmdp += 2;
break;
case 'e':
case 'E':
use_elite = true;
cmdp++;
break;
case 'r':
case 'R':
use_raw = true;
cmdp++;
break;
default:
PrintAndLog("Unknown parameter '%c'\n", param_getchar(Cmd, cmdp));
errors = true;
break;
}
}
if (errors) return usage_hf_iclass_chk();
if ( !(f = fopen( filename , "r")) ) { if ( !(f = fopen( filename , "r")) ) {
PrintAndLog("File: %s: not found or locked.", filename); PrintAndLog("File: %s: not found or locked.", filename);
free(keyBlock);
return 1; return 1;
} }
@ -1898,7 +1926,7 @@ int CmdHFiClassCheckKeys(const char *Cmd) {
// debit key. try twice // debit key. try twice
for (int foo = 0; foo < 2 && !found_debit; foo++) { for (int foo = 0; foo < 2 && !found_debit; foo++) {
if (!select_and_auth(key, mac, div_key, false, elite, rawkey, false)) if (!select_and_auth(key, mac, div_key, false, use_elite, use_raw, false))
continue; continue;
// key found. // key found.
@ -1909,7 +1937,7 @@ int CmdHFiClassCheckKeys(const char *Cmd) {
// credit key. try twice // credit key. try twice
for (int foo = 0; foo < 2 && !found_credit; foo++) { for (int foo = 0; foo < 2 && !found_credit; foo++) {
if (!select_and_auth(key, mac, div_key, true, elite, rawkey, false)) if (!select_and_auth(key, mac, div_key, true, use_elite, use_raw, false))
continue; continue;
// key found // key found