mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-24 23:25:40 -07:00
DesfireCheckAuthCommands
This commit is contained in:
parent
a36ec29383
commit
7d6ff9f773
3 changed files with 72 additions and 3 deletions
|
@ -6227,6 +6227,10 @@ static int CmdHF14ADesLsApp(const char *Cmd) {
|
||||||
uint8_t buf[250] = {0};
|
uint8_t buf[250] = {0};
|
||||||
size_t buflen = 0;
|
size_t buflen = 0;
|
||||||
|
|
||||||
|
uint32_t freemem = 0;
|
||||||
|
DesfireGetFreeMem(&dctx, &freemem);
|
||||||
|
|
||||||
|
|
||||||
res = DesfireGetAIDList(&dctx, buf, &buflen);
|
res = DesfireGetAIDList(&dctx, buf, &buflen);
|
||||||
if (res != PM3_SUCCESS) {
|
if (res != PM3_SUCCESS) {
|
||||||
PrintAndLogEx(ERR, "Desfire GetAIDList command " _RED_("error") ". Result: %d", res);
|
PrintAndLogEx(ERR, "Desfire GetAIDList command " _RED_("error") ". Result: %d", res);
|
||||||
|
@ -6254,11 +6258,24 @@ static int CmdHF14ADesLsApp(const char *Cmd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AuthCommandsChk authCmdCheck0 = {0};
|
||||||
|
DesfireCheckAuthCommands(0x000000, 0, &authCmdCheck0);
|
||||||
|
if (appcount > 0) {
|
||||||
|
for (int i = 0; i < appcount; i++) {
|
||||||
|
DesfireCheckAuthCommands(AppList[i].appNum, 0, &AppList[i].authCmdCheck);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PrintAndLogEx(INFO, "-------------- " _CYAN_("Alications list") " --------------");
|
PrintAndLogEx(INFO, "-------------- " _CYAN_("Alications list") " --------------");
|
||||||
PrintAndLogEx(INFO, "Applications count: " _GREEN_("%zu"), appcount);
|
PrintAndLogEx(INFO, "Applications count: " _GREEN_("%zu") " free memory " _GREEN_("%d"), appcount, freemem);
|
||||||
|
PrintAndLogEx(INFO, "PICC level auth commands: " NOLF);
|
||||||
|
DesfireCheckAuthCommandsPrint(&authCmdCheck0);
|
||||||
|
|
||||||
if (appcount > 0) {
|
if (appcount > 0) {
|
||||||
for (int i = 0; i < appcount; i++) {
|
for (int i = 0; i < appcount; i++) {
|
||||||
PrintAndLogEx(INFO, "App num: 0x%02x iso id: 0x%04x name: %s", AppList[i].appNum, AppList[i].appISONum, AppList[i].appDFName);
|
PrintAndLogEx(INFO, "App num: 0x%02x iso id: 0x%04x name: %s", AppList[i].appNum, AppList[i].appISONum, AppList[i].appDFName);
|
||||||
|
PrintAndLogEx(INFO, "Auth commands: " NOLF);
|
||||||
|
DesfireCheckAuthCommandsPrint(&AppList[i].authCmdCheck);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1350,6 +1350,47 @@ int DesfireAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel
|
||||||
return 100;
|
return 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool DesfireCheckAuthCmd(uint32_t appAID, uint8_t keyNum, uint8_t authcmd) {
|
||||||
|
size_t recv_len = 0;
|
||||||
|
uint8_t respcode = 0;
|
||||||
|
uint8_t recv_data[256] = {0};
|
||||||
|
|
||||||
|
DesfireContext dctx = {0};
|
||||||
|
dctx.keyNum = keyNum;
|
||||||
|
dctx.commMode = DCMPlain;
|
||||||
|
dctx.cmdSet = DCCNative;
|
||||||
|
|
||||||
|
// if cant select - return false
|
||||||
|
int res = DesfireSelectAIDHex(&dctx, appAID, false, 0);
|
||||||
|
if (res != PM3_SUCCESS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint8_t data[] = {keyNum, 0x00};
|
||||||
|
res = DesfireExchangeEx(false, &dctx, authcmd, data, (authcmd == MFDES_AUTHENTICATE_EV2F) ? 2 : 1, &respcode, recv_data, &recv_len, false, 0);
|
||||||
|
DropField();
|
||||||
|
return (res == PM3_SUCCESS && respcode == 0xaf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesfireCheckAuthCommands(uint32_t appAID, uint8_t keyNum, AuthCommandsChk *authCmdCheck) {
|
||||||
|
memset(authCmdCheck, 0, sizeof(AuthCommandsChk));
|
||||||
|
|
||||||
|
authCmdCheck->auth = DesfireCheckAuthCmd(appAID, keyNum, MFDES_AUTHENTICATE);
|
||||||
|
authCmdCheck->authISO = DesfireCheckAuthCmd(appAID, keyNum, MFDES_AUTHENTICATE_ISO);
|
||||||
|
authCmdCheck->authAES = DesfireCheckAuthCmd(appAID, keyNum, MFDES_AUTHENTICATE_AES);
|
||||||
|
authCmdCheck->authEV2 = DesfireCheckAuthCmd(appAID, keyNum, MFDES_AUTHENTICATE_EV2F);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesfireCheckAuthCommandsPrint(AuthCommandsChk *authCmdCheck) {
|
||||||
|
PrintAndLogEx(NORMAL, "auth:%s auth iso: %s auth aes: %s auth ev2: %s auth iso native: %s",
|
||||||
|
authCmdCheck->auth ? _GREEN_("YES") : _RED_("NO"),
|
||||||
|
authCmdCheck->authISO ? _GREEN_("YES") : _RED_("NO"),
|
||||||
|
authCmdCheck->authAES ? _GREEN_("YES") : _RED_("NO"),
|
||||||
|
authCmdCheck->authEV2 ? _GREEN_("YES") : _RED_("NO"),
|
||||||
|
authCmdCheck->authISONative ? _GREEN_("YES") : _RED_("NO")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static int DesfireCommandEx(DesfireContext *dctx, uint8_t cmd, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen, int checklength, size_t splitbysize) {
|
static int DesfireCommandEx(DesfireContext *dctx, uint8_t cmd, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen, int checklength, size_t splitbysize) {
|
||||||
if (resplen)
|
if (resplen)
|
||||||
*resplen = 0;
|
*resplen = 0;
|
||||||
|
|
|
@ -85,10 +85,19 @@ typedef struct {
|
||||||
|
|
||||||
typedef FileListElmS FileListS[32];
|
typedef FileListElmS FileListS[32];
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool auth;
|
||||||
|
bool authISO;
|
||||||
|
bool authAES;
|
||||||
|
bool authEV2;
|
||||||
|
bool authISONative;
|
||||||
|
} AuthCommandsChk;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t appNum;
|
uint32_t appNum;
|
||||||
uint16_t appISONum;
|
uint16_t appISONum;
|
||||||
char appDFName[16];
|
char appDFName[16];
|
||||||
|
AuthCommandsChk authCmdCheck;
|
||||||
} AppListElmS;
|
} AppListElmS;
|
||||||
typedef AppListElmS AppListS[64];
|
typedef AppListElmS AppListS[64];
|
||||||
|
|
||||||
|
@ -126,6 +135,8 @@ const char *DesfireAuthErrorToStr(int error);
|
||||||
int DesfireSelectAndAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool verbose);
|
int DesfireSelectAndAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool verbose);
|
||||||
int DesfireSelectAndAuthenticateEx(DesfireContext *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool noauth, bool verbose);
|
int DesfireSelectAndAuthenticateEx(DesfireContext *dctx, DesfireSecureChannel secureChannel, uint32_t aid, bool noauth, bool verbose);
|
||||||
int DesfireAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel, bool verbose);
|
int DesfireAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel, bool verbose);
|
||||||
|
void DesfireCheckAuthCommands(uint32_t appAID, uint8_t keyNum, AuthCommandsChk *authCmdCheck);
|
||||||
|
void DesfireCheckAuthCommandsPrint(AuthCommandsChk *authCmdCheck);
|
||||||
|
|
||||||
int DesfireFormatPICC(DesfireContext *dctx);
|
int DesfireFormatPICC(DesfireContext *dctx);
|
||||||
int DesfireGetFreeMem(DesfireContext *dctx, uint32_t *freemem);
|
int DesfireGetFreeMem(DesfireContext *dctx, uint32_t *freemem);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue