mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 22:03:42 -07:00
CHG: removed some debug statements, added another. Change the crapto1.c, lets see if the special attack works better now against chinese clones.
This commit is contained in:
parent
823ad2e186
commit
31cf804877
2 changed files with 14 additions and 19 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* crapto1.c
|
1/* crapto1.c
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
|
@ -383,7 +383,7 @@ uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb)
|
||||||
/** nonce_distance
|
/** nonce_distance
|
||||||
* x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y
|
* x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y
|
||||||
*/
|
*/
|
||||||
static uint16_t *dist;
|
static uint16_t *dist = 0;
|
||||||
int nonce_distance(uint32_t from, uint32_t to)
|
int nonce_distance(uint32_t from, uint32_t to)
|
||||||
{
|
{
|
||||||
uint16_t x, i;
|
uint16_t x, i;
|
||||||
|
@ -391,7 +391,7 @@ int nonce_distance(uint32_t from, uint32_t to)
|
||||||
dist = malloc(2 << 16);
|
dist = malloc(2 << 16);
|
||||||
if(!dist)
|
if(!dist)
|
||||||
return -1;
|
return -1;
|
||||||
for (x = 1, i = 1; i; ++i) {
|
for (x = i = 1; i; ++i) {
|
||||||
dist[(x & 0xff) << 8 | x >> 8] = i;
|
dist[(x & 0xff) << 8 | x >> 8] = i;
|
||||||
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15;
|
||||||
}
|
}
|
||||||
|
@ -468,21 +468,18 @@ static struct Crypto1State* check_pfx_parity(uint32_t prefix, uint32_t rresp, ui
|
||||||
return sl + good;
|
return sl + good;
|
||||||
}
|
}
|
||||||
static struct Crypto1State* check_pfx_parity_ex(uint32_t prefix, uint32_t odd, uint32_t even, struct Crypto1State* sl) {
|
static struct Crypto1State* check_pfx_parity_ex(uint32_t prefix, uint32_t odd, uint32_t even, struct Crypto1State* sl) {
|
||||||
struct Crypto1State s;
|
|
||||||
uint32_t c = 0;
|
uint32_t c = 0;
|
||||||
|
|
||||||
s.odd = odd ^ fastfwd[1][c];
|
sl.odd = odd ^ fastfwd[1][c];
|
||||||
s.even = even ^ fastfwd[0][c];
|
sl.even = even ^ fastfwd[0][c];
|
||||||
|
|
||||||
lfsr_rollback_bit(&s, 0, 0);
|
lfsr_rollback_bit(&sl, 0, 0);
|
||||||
lfsr_rollback_bit(&s, 0, 0);
|
lfsr_rollback_bit(&sl, 0, 0);
|
||||||
lfsr_rollback_bit(&s, 0, 0);
|
lfsr_rollback_bit(&sl, 0, 0);
|
||||||
|
lfsr_rollback_word(&sl, 0, 0);
|
||||||
|
lfsr_rollback_word(&sl, prefix | c << 5, 1);
|
||||||
|
|
||||||
lfsr_rollback_word(&s, 0, 0);
|
|
||||||
lfsr_rollback_word(&s, prefix | c << 5, 1);
|
|
||||||
|
|
||||||
sl->odd = s.odd;
|
|
||||||
sl->even = s.even;
|
|
||||||
return ++sl;
|
return ++sl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,6 @@ int nonce2key_ex(uint8_t blockno, uint8_t keytype, uint32_t uid, uint32_t nt, ui
|
||||||
*(state_s + i) = key_recovered;
|
*(state_s + i) = key_recovered;
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLog("zero");
|
|
||||||
if(!state)
|
if(!state)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -115,7 +114,6 @@ int nonce2key_ex(uint8_t blockno, uint8_t keytype, uint32_t uid, uint32_t nt, ui
|
||||||
p1 = p3 = last_keylist;
|
p1 = p3 = last_keylist;
|
||||||
p2 = state_s;
|
p2 = state_s;
|
||||||
|
|
||||||
PrintAndLog("one");
|
|
||||||
while ( *p1 != -1 && *p2 != -1 ) {
|
while ( *p1 != -1 && *p2 != -1 ) {
|
||||||
if (compar_int(p1, p2) == 0) {
|
if (compar_int(p1, p2) == 0) {
|
||||||
printf("p1:%"llx" p2:%"llx" p3:%"llx" key:%012"llx"\n",(uint64_t)(p1-last_keylist),(uint64_t)(p2-state_s),(uint64_t)(p3-last_keylist),*p1);
|
printf("p1:%"llx" p2:%"llx" p3:%"llx" key:%012"llx"\n",(uint64_t)(p1-last_keylist),(uint64_t)(p2-state_s),(uint64_t)(p3-last_keylist),*p1);
|
||||||
|
@ -127,9 +125,11 @@ int nonce2key_ex(uint8_t blockno, uint8_t keytype, uint32_t uid, uint32_t nt, ui
|
||||||
while (compar_int(p1, p2) == 1) ++p2;
|
while (compar_int(p1, p2) == 1) ++p2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
key_count = p3 - last_keylist;;
|
key_count = p3 - last_keylist;
|
||||||
|
PrintAndLog("one A");
|
||||||
} else {
|
} else {
|
||||||
key_count = 0;
|
key_count = 0;
|
||||||
|
PrintAndLog("one B");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("key_count:%d\n", key_count);
|
printf("key_count:%d\n", key_count);
|
||||||
|
@ -137,7 +137,6 @@ int nonce2key_ex(uint8_t blockno, uint8_t keytype, uint32_t uid, uint32_t nt, ui
|
||||||
// The list may still contain several key candidates. Test each of them with mfCheckKeys
|
// The list may still contain several key candidates. Test each of them with mfCheckKeys
|
||||||
uint8_t keyBlock[6] = {0,0,0,0,0,0};
|
uint8_t keyBlock[6] = {0,0,0,0,0,0};
|
||||||
uint64_t key64;
|
uint64_t key64;
|
||||||
PrintAndLog("two");
|
|
||||||
for (i = 0; i < key_count; i++) {
|
for (i = 0; i < key_count; i++) {
|
||||||
key64 = *(last_keylist + i);
|
key64 = *(last_keylist + i);
|
||||||
num_to_bytes(key64, 6, keyBlock);
|
num_to_bytes(key64, 6, keyBlock);
|
||||||
|
@ -151,7 +150,6 @@ int nonce2key_ex(uint8_t blockno, uint8_t keytype, uint32_t uid, uint32_t nt, ui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
free(last_keylist);
|
free(last_keylist);
|
||||||
last_keylist = state_s;
|
last_keylist = state_s;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue