From afbe5deda216e39c111dfa86f97c9c15c20ee729 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 13 Jul 2021 00:59:07 +0300 Subject: [PATCH] commands refactoring --- client/src/mifare/desfirecore.c | 91 +++++++++++++++------------------ 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 2e0654c30..5a8a06745 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -901,60 +901,65 @@ int DesfireAuthenticate(DesfireContext *dctx, DesfireSecureChannel secureChannel return PM3_SUCCESS; } -int DesfireFormatPICC(DesfireContext *dctx) { +static int DesfireCommand(DesfireContext *dctx, uint8_t cmd, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen, int checklength) { + if (resplen) + *resplen = 0; + uint8_t respcode = 0xff; - uint8_t resp[257] = {0}; - size_t resplen = 0; - int res = DesfireExchange(dctx, MFDES_FORMAT_PICC, NULL, 0, &respcode, resp, &resplen); + uint8_t xresp[257] = {0}; + size_t xresplen = 0; + int res = DesfireExchange(dctx, cmd, data, datalen, &respcode, xresp, &xresplen); if (res != PM3_SUCCESS) return res; - if (respcode != MFDES_S_OPERATION_OK || resplen != 0) + if (respcode != MFDES_S_OPERATION_OK) return PM3_EAPDU_FAIL; + if (checklength >= 0 && xresplen != checklength) + return PM3_EAPDU_FAIL; + + if (resplen) + *resplen = xresplen; + if (resp) + memcpy(resp, xresp, xresplen); return PM3_SUCCESS; } +static int DesfireCommandNoData(DesfireContext *dctx, uint8_t cmd) { + return DesfireCommand(dctx, cmd, NULL, 0, NULL, NULL, 0); +} +/* +static int DesfireCommandTxData(DesfireContext *dctx, uint8_t cmd, uint8_t *data, size_t datalen, int checklength) { + return DesfireCommand(dctx, cmd, data, 0, datalen, NULL, checklength); +} +*/ +static int DesfireCommandRxData(DesfireContext *dctx, uint8_t cmd, uint8_t *resp, size_t *resplen, int checklength) { + return DesfireCommand(dctx, cmd, NULL, 0, resp, resplen, checklength); +} + +int DesfireFormatPICC(DesfireContext *dctx) { + return DesfireCommandNoData(dctx, MFDES_FORMAT_PICC); +} + int DesfireGetFreeMem(DesfireContext *dctx, uint32_t *freemem) { *freemem = 0; - uint8_t respcode = 0xff; + uint8_t resp[257] = {0}; - size_t resplen = 0; - int res = DesfireExchange(dctx, MFDES_GET_FREE_MEMORY, NULL, 0, &respcode, resp, &resplen); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK || resplen != 3) - return PM3_EAPDU_FAIL; - *freemem = DesfireAIDByteToUint(resp); - return PM3_SUCCESS; + size_t resplen = 0; + int res = DesfireCommandRxData(dctx, MFDES_GET_FREE_MEMORY, resp, &resplen, 3); + if (res == PM3_SUCCESS) + *freemem = DesfireAIDByteToUint(resp); + return res; } int DesfireGetUID(DesfireContext *dctx, uint8_t *resp, size_t *resplen) { - uint8_t respcode = 0xff; - int res = DesfireExchange(dctx, MFDES_GET_UID, NULL, 0, &respcode, resp, resplen); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK) - return PM3_EAPDU_FAIL; - return PM3_SUCCESS; + return DesfireCommandRxData(dctx, MFDES_GET_UID, resp, resplen, -1); } int DesfireGetAIDList(DesfireContext *dctx, uint8_t *resp, size_t *resplen) { - uint8_t respcode = 0xff; - int res = DesfireExchange(dctx, MFDES_GET_APPLICATION_IDS, NULL, 0, &respcode, resp, resplen); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK) - return PM3_EAPDU_FAIL; - return PM3_SUCCESS; + return DesfireCommandRxData(dctx, MFDES_GET_APPLICATION_IDS, resp, resplen, -1); } int DesfireGetDFList(DesfireContext *dctx, uint8_t *resp, size_t *resplen) { - uint8_t respcode = 0xff; - int res = DesfireExchangeEx(false, dctx, MFDES_GET_DF_NAMES, NULL, 0, &respcode, resp, resplen, true, 24); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK) - return PM3_EAPDU_FAIL; - return PM3_SUCCESS; + return DesfireCommandRxData(dctx, MFDES_GET_DF_NAMES, resp, resplen, -1); } int DesfireCreateApplication(DesfireContext *dctx, uint8_t *appdata, size_t appdatalen) { @@ -984,23 +989,11 @@ int DesfireDeleteApplication(DesfireContext *dctx, uint32_t aid) { } int DesfireGetKeySettings(DesfireContext *dctx, uint8_t *resp, size_t *resplen) { - uint8_t respcode = 0xff; - int res = DesfireExchange(dctx, MFDES_GET_KEY_SETTINGS, NULL, 0, &respcode, resp, resplen); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK) - return PM3_EAPDU_FAIL; - return PM3_SUCCESS; + return DesfireCommandRxData(dctx, MFDES_GET_KEY_SETTINGS, resp, resplen, -1); } int DesfireGetKeyVersion(DesfireContext *dctx, uint8_t *data, size_t len, uint8_t *resp, size_t *resplen) { - uint8_t respcode = 0xff; - int res = DesfireExchange(dctx, MFDES_GET_KEY_VERSION, data, len, &respcode, resp, resplen); - if (res != PM3_SUCCESS) - return res; - if (respcode != MFDES_S_OPERATION_OK) - return PM3_EAPDU_FAIL; - return PM3_SUCCESS; + return DesfireCommandRxData(dctx, MFDES_GET_KEY_VERSION, resp, resplen, -1); } int DesfireChangeKeySettings(DesfireContext *dctx, uint8_t *data, size_t len) {