mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
Implemented VB6 rng for iclass chk elite key search
Implemented VB6 rng for iclass chk elite key search based on @bettse implementation on Flipper Zero Picopass app
This commit is contained in:
parent
665b4a5a93
commit
fbacd60e41
2 changed files with 33 additions and 10 deletions
|
@ -10,7 +10,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
|
||||||
- Added `pm3_tears_for_fears.py` - a ISO14443b tear off script by Pierre Granier
|
- Added `pm3_tears_for_fears.py` - a ISO14443b tear off script by Pierre Granier
|
||||||
- Added new t55xx password (002BCFCF) sniffed from cheap cloner (@davidbeauchamp)
|
- Added new t55xx password (002BCFCF) sniffed from cheap cloner (@davidbeauchamp)
|
||||||
- Fixed 'hf 14b sim' - now works (@michi-jung)
|
- Fixed 'hf 14b sim' - now works (@michi-jung)
|
||||||
- Added VB6 Rng for iclass elite keys lookup by porting @bettse work in the Flipper Zero Picopass App (@antiklesys)
|
- Added VB6 Rng for iclass elite keys `hf iclass lookup` and `hf iclass chk` functions by porting @bettse work in the Flipper Zero Picopass App (@antiklesys)
|
||||||
|
|
||||||
## [Aurora.4.18589][2024-05-28]
|
## [Aurora.4.18589][2024-05-28]
|
||||||
- Fixed the pm3 regressiontests for Hitag2Crack (@iceman1001)
|
- Fixed the pm3 regressiontests for Hitag2Crack (@iceman1001)
|
||||||
|
|
|
@ -3581,26 +3581,33 @@ static int CmdHFiClassCheckKeys(const char *Cmd) {
|
||||||
CLIParserInit(&ctx, "hf iclass chk",
|
CLIParserInit(&ctx, "hf iclass chk",
|
||||||
"Checkkeys loads a dictionary text file with 8byte hex keys to test authenticating against a iClass tag",
|
"Checkkeys loads a dictionary text file with 8byte hex keys to test authenticating against a iClass tag",
|
||||||
"hf iclass chk -f iclass_default_keys.dic\n"
|
"hf iclass chk -f iclass_default_keys.dic\n"
|
||||||
"hf iclass chk -f iclass_elite_keys.dic --elite");
|
"hf iclass chk -f iclass_elite_keys.dic --elite\n"
|
||||||
|
"hf iclass chk --vb6kdf\n");
|
||||||
|
|
||||||
void *argtable[] = {
|
void *argtable[] = {
|
||||||
arg_param_begin,
|
arg_param_begin,
|
||||||
arg_str1("f", "file", "<fn>", "Dictionary file with default iclass keys"),
|
arg_str0("f", "file", "<fn>", "Dictionary file with default iclass keys"),
|
||||||
arg_lit0(NULL, "credit", "key is assumed to be the credit key"),
|
arg_lit0(NULL, "credit", "key is assumed to be the credit key"),
|
||||||
arg_lit0(NULL, "elite", "elite computations applied to key"),
|
arg_lit0(NULL, "elite", "elite computations applied to key"),
|
||||||
arg_lit0(NULL, "raw", "no computations applied to key (raw)"),
|
arg_lit0(NULL, "raw", "no computations applied to key (raw)"),
|
||||||
arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"),
|
arg_lit0(NULL, "shallow", "use shallow (ASK) reader modulation instead of OOK"),
|
||||||
|
arg_lit0(NULL, "vb6kdf", "use the VB6 elite KDF instead of a file"),
|
||||||
arg_param_end
|
arg_param_end
|
||||||
};
|
};
|
||||||
CLIExecWithReturn(ctx, Cmd, argtable, false);
|
CLIExecWithReturn(ctx, Cmd, argtable, false);
|
||||||
|
|
||||||
int fnlen = 0;
|
int fnlen = 0;
|
||||||
char filename[FILE_PATH_SIZE] = {0};
|
char filename[FILE_PATH_SIZE] = {0};
|
||||||
CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen);
|
bool use_vb6kdf = arg_get_lit(ctx, 6);
|
||||||
|
|
||||||
bool use_credit_key = arg_get_lit(ctx, 2);
|
|
||||||
bool use_elite = arg_get_lit(ctx, 3);
|
bool use_elite = arg_get_lit(ctx, 3);
|
||||||
bool use_raw = arg_get_lit(ctx, 4);
|
bool use_raw = arg_get_lit(ctx, 4);
|
||||||
|
if(use_vb6kdf){
|
||||||
|
use_elite = true;
|
||||||
|
}else{
|
||||||
|
CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool use_credit_key = arg_get_lit(ctx, 2);
|
||||||
bool shallow_mod = arg_get_lit(ctx, 5);
|
bool shallow_mod = arg_get_lit(ctx, 5);
|
||||||
|
|
||||||
CLIParserFree(ctx);
|
CLIParserFree(ctx);
|
||||||
|
@ -3613,10 +3620,26 @@ static int CmdHFiClassCheckKeys(const char *Cmd) {
|
||||||
// load keys
|
// load keys
|
||||||
uint8_t *keyBlock = NULL;
|
uint8_t *keyBlock = NULL;
|
||||||
uint32_t keycount = 0;
|
uint32_t keycount = 0;
|
||||||
int res = loadFileDICTIONARY_safe(filename, (void **)&keyBlock, 8, &keycount);
|
|
||||||
if (res != PM3_SUCCESS || keycount == 0) {
|
if (!use_vb6kdf) {
|
||||||
free(keyBlock);
|
// Load keys
|
||||||
return res;
|
int res = loadFileDICTIONARY_safe(filename, (void **)&keyBlock, 8, &keycount);
|
||||||
|
if (res != PM3_SUCCESS || keycount == 0) {
|
||||||
|
free(keyBlock);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Generate 5000 keys using VB6 KDF
|
||||||
|
keycount = 5000;
|
||||||
|
keyBlock = malloc(keycount * 8);
|
||||||
|
if (!keyBlock) {
|
||||||
|
return PM3_EMALLOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
picopass_elite_reset();
|
||||||
|
for (uint32_t i = 0; i < keycount; i++) {
|
||||||
|
picopass_elite_nextKey(keyBlock + (i * 8));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// limit size of keys that can be held in memory
|
// limit size of keys that can be held in memory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue