read multiple keys from command line (Thanks to Frank Morgner) (Fixes Issue 63)

This commit is contained in:
Romuald Conty 2011-05-18 14:56:21 +00:00
parent 658d77ec0d
commit 2ff463b5c1

View file

@ -70,11 +70,11 @@ int main(int argc, char * const argv[]) {
bool skip = false; bool skip = false;
// Next default key specified as option (-k) // Next default key specified as option (-k)
byte_t * defKey = NULL; byte_t * defKeys = NULL, *p;
size_t defKeys_len = 0;
// Array with default Mifare Classic keys // Array with default Mifare Classic keys
byte_t defaultKeys[][6] = { byte_t defaultKeys[][6] = {
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // User defined key slot
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // Default key (first key used by program if no user defined key) {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, // Default key (first key used by program if no user defined key)
{0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // NFCForum MAD key {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5}, // NFCForum MAD key
{0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // NFCForum content key {0xd3, 0xf7, 0xd3, 0xf7, 0xd3, 0xf7}, // NFCForum content key
@ -128,16 +128,17 @@ int main(int argc, char * const argv[]) {
// fprintf(stdout, "Tolerance number: %d\n", probes); // fprintf(stdout, "Tolerance number: %d\n", probes);
break; break;
case 'k': case 'k':
// Add this key to the default keys list // Add this key to the default keys
if ((defKey = calloc(6, sizeof(byte_t))) == NULL) { p = realloc(defKeys, defKeys_len + 6);
ERR ("Cannot allocate memory for defKey"); if (!p) {
ERR ("Cannot allocate memory for defKeys");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} else {
bzero(defKey, 6);
num_to_bytes(strtoll(optarg, NULL, 16), 6, defKey);
memcpy(defaultKeys[0], defKey, 6);
} }
fprintf(stdout, "The custom key 0x%012llx has been added to the default keys\n", bytes_to_num(defKey, 6)); defKeys = p;
memset(defKeys+defKeys_len, 0, 6);
num_to_bytes(strtoll(optarg, NULL, 16), 6, defKeys+defKeys_len);
fprintf(stdout, "The custom key 0x%012llx has been added to the default keys\n", bytes_to_num(defKeys+defKeys_len, 6));
defKeys_len = defKeys_len + 6;
break; break;
case 'O': case 'O':
@ -252,9 +253,16 @@ int main(int argc, char * const argv[]) {
memcpy(mp.mpa.abtUid, t.nt.nti.nai.abtUid, sizeof(mp.mpa.abtUid)); memcpy(mp.mpa.abtUid, t.nt.nti.nai.abtUid, sizeof(mp.mpa.abtUid));
// Iterate over all keys (n = number of keys) // Iterate over all keys (n = number of keys)
n = sizeof(defaultKeys)/sizeof(defaultKeys[0]); n = sizeof(defaultKeys)/sizeof(defaultKeys[0]);
for (key = 0; key < n; key++) { size_t defKey_bytes_todo = defKeys_len;
if (key == 0 && defKey == NULL) ++key; // Custom key not provided, try another key key = 0;
memcpy(mp.mpa.abtKey, defaultKeys[key], sizeof(mp.mpa.abtKey)); while (key < n) {
if (defKey_bytes_todo > 0) {
memcpy(mp.mpa.abtKey, defKeys + defKeys_len - defKey_bytes_todo, sizeof(mp.mpa.abtKey));
defKey_bytes_todo -= sizeof(mp.mpa.abtKey);
} else {
memcpy(mp.mpa.abtKey, defaultKeys[key], sizeof(mp.mpa.abtKey));
key++;
}
fprintf(stdout, "[Key: %012llx] -> ", bytes_to_num(mp.mpa.abtKey, 6)); fprintf(stdout, "[Key: %012llx] -> ", bytes_to_num(mp.mpa.abtKey, 6));
fprintf(stdout, "["); fprintf(stdout, "[");
i = 0; // Sector counter i = 0; // Sector counter
@ -534,7 +542,7 @@ void mf_init(mftag *t, mfreader *r) {
// Connect to the first NFC device // Connect to the first NFC device
r->pdi = nfc_connect(NULL); r->pdi = nfc_connect(NULL);
if (!r->pdi) { if (!r->pdi) {
ERR ("Unable to connect to NFC device\n"); printf ("No NFC device found.\n");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
} }