@@ -1465,7 +1465,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo,
1465
1465
LEDsoff ();
1466
1466
1467
1467
uint64_t ui64Key = bytes_to_num (key , 6 );
1468
- uint16_t len ;
1468
+ uint16_t len , dist1 = 160 , dist2 = 320 ;
1469
1469
uint8_t uid [10 ] = { 0x00 };
1470
1470
uint32_t cuid = 0 , nt1 = 0 , nt2 = 0 , nt3 = 0 ;
1471
1471
uint32_t target_nt [2 ] = {0x00 }, target_ks [2 ] = {0x00 };
@@ -1491,6 +1491,30 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo,
1491
1491
// Main loop - get crypted nonces for target sector
1492
1492
for (uint8_t rtr = 0 ; rtr < 2 ; rtr ++ ) {
1493
1493
1494
+ // distance measurement
1495
+ if (mifare_classic_halt (pcs )) {
1496
+ continue ;
1497
+ }
1498
+
1499
+ if (iso14443a_select_card (uid , NULL , & cuid , true, 0 , true) == false) {
1500
+ continue ;
1501
+ };
1502
+
1503
+ if (mifare_classic_authex (pcs , cuid , blockNo , keyType , ui64Key , AUTH_FIRST , & nt1 , NULL )) {
1504
+ continue ;
1505
+ };
1506
+
1507
+ if (mifare_classic_authex (pcs , cuid , blockNo , keyType , ui64Key , AUTH_NESTED , & nt2 , NULL )) {
1508
+ continue ;
1509
+ };
1510
+
1511
+ if (mifare_classic_authex (pcs , cuid , blockNo , keyType , ui64Key , AUTH_NESTED , & nt3 , NULL )) {
1512
+ continue ;
1513
+ };
1514
+
1515
+ dist1 = nonce_distance (nt1 , nt2 );
1516
+ dist2 = nonce_distance (nt1 , nt3 );
1517
+
1494
1518
if (mifare_classic_halt (pcs )) {
1495
1519
continue ;
1496
1520
}
@@ -1509,8 +1533,8 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo,
1509
1533
target_nt [0 ] = prng_successor (nt1 , 161 );
1510
1534
target_nt [1 ] = prng_successor (nt1 , 321 );
1511
1535
} else {
1512
- target_nt [0 ] = prng_successor (nt1 , 160 );
1513
- target_nt [1 ] = prng_successor (nt1 , 320 );
1536
+ target_nt [0 ] = prng_successor (nt1 , dist1 );
1537
+ target_nt [1 ] = prng_successor (nt1 , dist2 );
1514
1538
}
1515
1539
1516
1540
len = mifare_sendcmd_short (pcs , AUTH_NESTED , MIFARE_AUTH_KEYA + (targetKeyType & 0xF ), targetBlockNo , receivedAnswer , sizeof (receivedAnswer ), par , NULL );
@@ -1534,7 +1558,7 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo,
1534
1558
continue ;
1535
1559
};
1536
1560
1537
- if (mifare_classic_authex (pcs , cuid , blockNo , keyType , ui64Key , AUTH_NESTED , & nt2 , NULL )) {
1561
+ if (mifare_classic_authex (pcs , cuid , blockNo , keyType , ui64Key , AUTH_NESTED , NULL , NULL )) {
1538
1562
continue ;
1539
1563
};
1540
1564
@@ -1544,12 +1568,6 @@ void MifareStaticNested(uint8_t blockNo, uint8_t keyType, uint8_t targetBlockNo,
1544
1568
};
1545
1569
1546
1570
nt3 = bytes_to_num (receivedAnswer , 4 );
1547
- // fix for cards with distance 0
1548
- if (nt1 == nt2 ) {
1549
- target_nt [0 ] = nt1 ;
1550
- target_nt [1 ] = nt1 ;
1551
- target_ks [0 ] = nt3 ^ target_nt [0 ];
1552
- }
1553
1571
target_ks [1 ] = nt3 ^ target_nt [1 ];
1554
1572
1555
1573
isOK = PM3_SUCCESS ;
0 commit comments