projects
/
proxmark3-svn
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Better Linux compilation compability
[proxmark3-svn]
/
armsrc
/
mifarecmd.c
diff --git
a/armsrc/mifarecmd.c
b/armsrc/mifarecmd.c
index 939c90028796ef823e0e0c3d5acfbd841cf4f48f..a3d6609db3413a136b6d5415e3296e103f90a28a 100644
(file)
--- a/
armsrc/mifarecmd.c
+++ b/
armsrc/mifarecmd.c
@@
-44,10
+44,10
@@
void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
- // clear trace
\r
- clear_trace();
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
@@
-95,9
+95,11
@@
void MifareUC_Auth(uint8_t arg0, uint8_t *keybytes){
bool turnOffField = (arg0 == 1);
\r
\r
LED_A_ON(); LED_B_OFF(); LED_C_OFF();
\r
bool turnOffField = (arg0 == 1);
\r
\r
LED_A_ON(); LED_B_OFF(); LED_C_OFF();
\r
- clear_trace();
\r
+
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");
\r
OnError(0);
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card");
\r
OnError(0);
\r
@@
-129,9
+131,10
@@
void MifareUReadBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)
\r
LEDsoff();
\r
LED_A_ON();
\r
\r
LEDsoff();
\r
LED_A_ON();
\r
- clear_trace();
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
int len = iso14443a_select_card(NULL, NULL, NULL);
\r
if(!len) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%02X)",len);
\r
int len = iso14443a_select_card(NULL, NULL, NULL);
\r
if(!len) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%02X)",len);
\r
@@
-199,11
+202,10
@@
void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
- // clear trace
\r
- clear_trace();
\r
-
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
@@
-252,6
+254,10
@@
void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
// datain = KEY bytes
\r
void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
\r
{
\r
// datain = KEY bytes
\r
void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
\r
{
\r
+ LEDsoff();
\r
+ LED_A_ON();
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
+
\r
// free eventually allocated BigBuf memory
\r
BigBuf_free();
\r
clear_trace();
\r
// free eventually allocated BigBuf memory
\r
BigBuf_free();
\r
clear_trace();
\r
@@
-269,10
+275,6
@@
void MifareUReadCard(uint8_t arg0, uint16_t arg1, uint8_t arg2, uint8_t *datain)
return;
\r
}
\r
\r
return;
\r
}
\r
\r
- LEDsoff();
\r
- LED_A_ON();
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
-
\r
int len = iso14443a_select_card(NULL, NULL, NULL);
\r
if (!len) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%d)",len);
\r
int len = iso14443a_select_card(NULL, NULL, NULL);
\r
if (!len) {
\r
if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Can't select card (RC:%d)",len);
\r
@@
-366,11
+368,10
@@
void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
struct Crypto1State *pcs;
\r
pcs = &mpcs;
\r
\r
- // clear trace
\r
- clear_trace();
\r
-
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
@@
-472,9
+473,10
@@
void MifareUWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t *datain)
\r
LEDsoff();
\r
LED_A_ON();
\r
\r
LEDsoff();
\r
LED_A_ON();
\r
- clear_trace();
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
\r
OnError(0);
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
\r
OnError(0);
\r
@@
-530,9
+532,10
@@
void MifareUSetPwd(uint8_t arg0, uint8_t *datain){
memcpy(pwd, datain, 16);
\r
\r
LED_A_ON(); LED_B_OFF(); LED_C_OFF();
\r
memcpy(pwd, datain, 16);
\r
\r
LED_A_ON(); LED_B_OFF(); LED_C_OFF();
\r
- clear_trace();
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
+ clear_trace();
\r
+
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
\r
OnError(0);
\r
if(!iso14443a_select_card(NULL, NULL, NULL)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Can't select card");
\r
OnError(0);
\r
@@
-632,19
+635,20
@@
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
uint32_t auth1_time, auth2_time;
\r
static uint16_t delta_time;
\r
\r
uint32_t auth1_time, auth2_time;
\r
static uint16_t delta_time;
\r
\r
- // free eventually allocated BigBuf memory
\r
- BigBuf_free();
\r
- // clear trace
\r
- clear_trace();
\r
- set_tracing(false);
\r
-
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
-
\r
LED_A_ON();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_C_OFF();
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
\r
+ // free eventually allocated BigBuf memory
\r
+ BigBuf_free();
\r
\r
\r
+ if (calibrate) clear_trace();
\r
+ set_tracing(true);
\r
+
\r
// statistics on nonce distance
\r
// statistics on nonce distance
\r
+ int16_t isOK = 0;
\r
+ #define NESTED_MAX_TRIES 12
\r
+ uint16_t unsuccessfull_tries = 0;
\r
if (calibrate) { // for first call only. Otherwise reuse previous calibration
\r
LED_B_ON();
\r
WDT_HIT();
\r
if (calibrate) { // for first call only. Otherwise reuse previous calibration
\r
LED_B_ON();
\r
WDT_HIT();
\r
@@
-655,6
+659,12
@@
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
\r
for (rtr = 0; rtr < 17; rtr++) {
\r
\r
\r
for (rtr = 0; rtr < 17; rtr++) {
\r
\r
+ // Test if the action was cancelled
\r
+ if(BUTTON_PRESS()) {
\r
+ isOK = -2;
\r
+ break;
\r
+ }
\r
+
\r
// prepare next select. No need to power down the card.
\r
if(mifare_classic_halt(pcs, cuid)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Nested: Halt error");
\r
// prepare next select. No need to power down the card.
\r
if(mifare_classic_halt(pcs, cuid)) {
\r
if (MF_DBGLEVEL >= 1) Dbprintf("Nested: Halt error");
\r
@@
-702,14
+712,17
@@
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
delta_time = auth2_time - auth1_time + 32; // allow some slack for proper timing
\r
}
\r
if (MF_DBGLEVEL >= 3) Dbprintf("Nested: calibrating... ntdist=%d", i);
\r
delta_time = auth2_time - auth1_time + 32; // allow some slack for proper timing
\r
}
\r
if (MF_DBGLEVEL >= 3) Dbprintf("Nested: calibrating... ntdist=%d", i);
\r
+ } else {
\r
+ unsuccessfull_tries++;
\r
+ if (unsuccessfull_tries > NESTED_MAX_TRIES) { // card isn't vulnerable to nested attack (random numbers are not predictable)
\r
+ isOK = -3;
\r
+ }
\r
}
\r
}
\r
}
\r
}
\r
-
\r
- if (rtr <= 1) return;
\r
\r
davg = (davg + (rtr - 1)/2) / (rtr - 1);
\r
\r
\r
davg = (davg + (rtr - 1)/2) / (rtr - 1);
\r
\r
- if (MF_DBGLEVEL >= 3) Dbprintf("
min=%d max=%d avg=%d, delta_time=%d"
, dmin, dmax, davg, delta_time);
\r
+ if (MF_DBGLEVEL >= 3) Dbprintf("
rtr=%d isOK=%d min=%d max=%d avg=%d, delta_time=%d", rtr, isOK
, dmin, dmax, davg, delta_time);
\r
\r
dmin = davg - 2;
\r
dmax = davg + 2;
\r
\r
dmin = davg - 2;
\r
dmax = davg + 2;
\r
@@
-722,7
+735,7
@@
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
LED_C_ON();
\r
\r
// get crypted nonces for target sector
\r
LED_C_ON();
\r
\r
// get crypted nonces for target sector
\r
- for(i=0; i < 2; i++) { // look for exactly two different nonces
\r
+ for(i=0; i < 2
&& !isOK
; i++) { // look for exactly two different nonces
\r
\r
target_nt[i] = 0;
\r
while(target_nt[i] == 0) { // continue until we have an unambiguous nonce
\r
\r
target_nt[i] = 0;
\r
while(target_nt[i] == 0) { // continue until we have an unambiguous nonce
\r
@@
-800,25
+813,25
@@
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t calibrate, uint8_t *dat
memcpy(buf+16, &target_ks[1], 4);
\r
\r
LED_B_ON();
\r
memcpy(buf+16, &target_ks[1], 4);
\r
\r
LED_B_ON();
\r
- cmd_send(CMD_ACK,
0, 2
, targetBlockNo + (targetKeyType * 0x100), buf, sizeof(buf));
\r
+ cmd_send(CMD_ACK,
isOK, 0
, targetBlockNo + (targetKeyType * 0x100), buf, sizeof(buf));
\r
LED_B_OFF();
\r
\r
if (MF_DBGLEVEL >= 3) DbpString("NESTED FINISHED");
\r
\r
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
\r
LEDsoff();
\r
LED_B_OFF();
\r
\r
if (MF_DBGLEVEL >= 3) DbpString("NESTED FINISHED");
\r
\r
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
\r
LEDsoff();
\r
- set_tracing(TRUE);
\r
}
\r
\r
//-----------------------------------------------------------------------------
\r
// MIFARE check keys. key count up to 85.
\r
//
\r
//-----------------------------------------------------------------------------
\r
}
\r
\r
//-----------------------------------------------------------------------------
\r
// MIFARE check keys. key count up to 85.
\r
//
\r
//-----------------------------------------------------------------------------
\r
-void MifareChkKeys(uint
8
_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
\r
+void MifareChkKeys(uint
16
_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
\r
{
\r
// params
\r
{
\r
// params
\r
- uint8_t blockNo = arg0;
\r
- uint8_t keyType = arg1;
\r
+ uint8_t blockNo = arg0 & 0xff;
\r
+ uint8_t keyType = (arg0 >> 8) & 0xff;
\r
+ bool clearTrace = arg1;
\r
uint8_t keyCount = arg2;
\r
uint64_t ui64Key = 0;
\r
\r
uint8_t keyCount = arg2;
\r
uint64_t ui64Key = 0;
\r
\r
@@
-835,15
+848,13
@@
void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain)
int OLD_MF_DBGLEVEL = MF_DBGLEVEL;
\r
MF_DBGLEVEL = MF_DBG_NONE;
\r
\r
int OLD_MF_DBGLEVEL = MF_DBGLEVEL;
\r
MF_DBGLEVEL = MF_DBG_NONE;
\r
\r
- // clear trace
\r
- clear_trace();
\r
- set_tracing(TRUE);
\r
-
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
-
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
+
\r
+ if (clearTrace) clear_trace();
\r
+ set_tracing(TRUE);
\r
\r
for (i = 0; i < keyCount; i++) {
\r
if(mifare_classic_halt(pcs, cuid)) {
\r
\r
for (i = 0; i < keyCount; i++) {
\r
if(mifare_classic_halt(pcs, cuid)) {
\r
@@
-890,16
+901,23
@@
void MifareSetDbgLvl(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
//-----------------------------------------------------------------------------
\r
// Work with emulator memory
\r
//
\r
//-----------------------------------------------------------------------------
\r
// Work with emulator memory
\r
//
\r
+// Note: we call FpgaDownloadAndGo(FPGA_BITSTREAM_HF) here although FPGA is not
\r
+// involved in dealing with emulator memory. But if it is called later, it might
\r
+// destroy the Emulator Memory.
\r
//-----------------------------------------------------------------------------
\r
//-----------------------------------------------------------------------------
\r
+
\r
void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
void MifareEMemClr(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
\r
emlClearMem();
\r
}
\r
\r
void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
emlClearMem();
\r
}
\r
\r
void MifareEMemSet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
\r
emlSetMem(datain, arg0, arg1); // data, block num, blocks count
\r
}
\r
\r
void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
emlSetMem(datain, arg0, arg1); // data, block num, blocks count
\r
}
\r
\r
void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain){
\r
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
\r
byte_t buf[USB_CMD_DATA_SIZE];
\r
emlGetMem(buf, arg0, arg1); // data, block num, blocks count (max 4)
\r
\r
byte_t buf[USB_CMD_DATA_SIZE];
\r
emlGetMem(buf, arg0, arg1); // data, block num, blocks count (max 4)
\r
\r
@@
-926,15
+944,13
@@
void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
byte_t dataoutbuf2[16];
\r
uint8_t uid[10];
\r
\r
byte_t dataoutbuf2[16];
\r
uint8_t uid[10];
\r
\r
- // clear trace
\r
- clear_trace();
\r
- set_tracing(false);
\r
-
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
-
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
+
\r
+ clear_trace();
\r
+ set_tracing(false);
\r
\r
bool isOK = true;
\r
\r
\r
bool isOK = true;
\r
\r
@@
-1028,10
+1044,10
@@
void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
\r
clear_trace();
\r
set_tracing(TRUE);
\r
\r
clear_trace();
\r
set_tracing(TRUE);
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
}
\r
\r
while (true) {
\r
}
\r
\r
while (true) {
\r
@@
-1127,6
+1143,7
@@
void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
// bit 2 - need HALT after sequence
\r
// bit 3 - need init FPGA and field before sequence
\r
// bit 4 - need reset FPGA and LED
\r
// bit 2 - need HALT after sequence
\r
// bit 3 - need init FPGA and field before sequence
\r
// bit 4 - need reset FPGA and LED
\r
+ // bit 5 - need to set datain instead of issuing USB reply (called via ARM for StandAloneMode14a)
\r
uint8_t workFlags = arg0;
\r
uint8_t blockNo = arg2;
\r
\r
uint8_t workFlags = arg0;
\r
uint8_t blockNo = arg2;
\r
\r
@@
-1146,10
+1163,10
@@
void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
LED_A_ON();
\r
LED_B_OFF();
\r
LED_C_OFF();
\r
-
\r
+ iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
+
\r
clear_trace();
\r
set_tracing(TRUE);
\r
clear_trace();
\r
set_tracing(TRUE);
\r
- iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
}
\r
\r
while (true) {
\r
}
\r
\r
while (true) {
\r
@@
-1186,7
+1203,12
@@
void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datai
}
\r
\r
LED_B_ON();
\r
}
\r
\r
LED_B_ON();
\r
- cmd_send(CMD_ACK,isOK,0,0,data,18);
\r
+ if (workFlags & 0x20) {
\r
+ if (isOK)
\r
+ memcpy(datain, data, 18);
\r
+ }
\r
+ else
\r
+ cmd_send(CMD_ACK,isOK,0,0,data,18);
\r
LED_B_OFF();
\r
\r
if ((workFlags & 0x10) || (!isOK)) {
\r
LED_B_OFF();
\r
\r
if ((workFlags & 0x10) || (!isOK)) {
\r
@@
-1224,7
+1246,7
@@
void MifareCIdent(){
cmd_send(CMD_ACK,isOK,0,0,0,0);
\r
}
\r
\r
cmd_send(CMD_ACK,isOK,0,0,0,0);
\r
}
\r
\r
-
//
\r
+//
\r
// DESFIRE
\r
//
\r
\r
// DESFIRE
\r
//
\r
\r
@@
-1234,8
+1256,8
@@
void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain){
uint8_t uid[10] = {0x00};
\r
uint32_t cuid;
\r
\r
uint8_t uid[10] = {0x00};
\r
uint32_t cuid;
\r
\r
- clear_trace();
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
\r
+ clear_trace();
\r
\r
int len = iso14443a_select_card(uid, NULL, &cuid);
\r
if(!len) {
\r
\r
int len = iso14443a_select_card(uid, NULL, &cuid);
\r
if(!len) {
\r
Impressum
,
Datenschutz