]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - tools/nonce2key/nonce2key.c
2 #define __STDC_FORMAT_MACROS
6 typedef unsigned char byte_t
;
8 int main(const int argc
, const char* argv
[]) {
9 struct Crypto1State
*state
;
10 uint32_t pos
, uid
, nt
, nr
, rr
, nr_diff
, ks1
, ks2
;
11 byte_t bt
, i
, ks3x
[8], par
[8][8];
12 uint64_t key
, key_recovered
;
18 printf("\nsyntax: %s <uid> <nt> <par> <ks>\n\n",argv
[0]);
21 sscanf(argv
[1],"%08x", &uid
);
22 sscanf(argv
[2],"%08x", &nt
);
23 sscanf(argv
[3],"%016" SCNx64
,&par_info
);
24 sscanf(argv
[4],"%016" SCNx64
,&ks_info
);
26 // Reset the last three significant bits of the reader nonce
29 printf("\nuid(%08x) nt(%08x) par(%016" PRIx64
") ks(%016" PRIx64
")\n\n", uid
, nt
, par_info
, ks_info
);
31 for ( pos
= 0; pos
< 8; pos
++ ) {
32 ks3x
[7-pos
] = (ks_info
>> (pos
*8)) & 0x0f;
33 bt
= (par_info
>> (pos
*8)) & 0xff;
35 for ( i
= 0; i
< 8; i
++) {
36 par
[7-pos
][i
] = (bt
>> i
) & 0x01;
40 printf("|diff|{nr} |ks3|ks3^5|parity |\n");
41 printf("+----+--------+---+-----+---------------+\n");
43 for ( i
= 0; i
< 8; i
++) {
44 nr_diff
= nr
| i
<< 5;
45 printf("| %02x |%08x| %01x | %01x |", i
<< 5, nr_diff
, ks3x
[i
], ks3x
[i
]^5);
47 for ( pos
= 0; pos
< 7; pos
++)
48 printf("%01x,", par
[i
][pos
]);
49 printf("%01x|\n", par
[i
][7]);
51 printf("+----+--------+---+-----+---------------+\n");
55 state
= lfsr_common_prefix(nr
,rr
,ks3x
,par
);
56 lfsr_rollback_word(state
,uid
^nt
,0);
57 crypto1_get_lfsr(state
,&key_recovered
);
58 printf("\nkey recovered: %012" PRIx64
"\n\n", key_recovered
);
59 crypto1_destroy(state
);
62 if ( t1
> 0 ) printf("Time in nonce2key: %.0f ticks \n", (float)t1
);