mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
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:
parent
a1ee3617b7
commit
7aaa335ab1
1 changed files with 47 additions and 19 deletions
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue