diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index ee0f3e190..8285ec0f3 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -1255,6 +1255,7 @@ static int CmdHF14ADesInfo(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); CLIParserFree(ctx); + SetAPDULogging(false); DropField(); mfdes_info_res_t info; diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 0c146e4a0..ee34f4cfe 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -2510,7 +2510,7 @@ int DesfireChangeKey(DesfireContext *dctx, bool change_master_key, uint8_t newke iso14443a_crc(nkeybuf, nkeylen, &cdata[cdatalen]); cdatalen += 2; } - } else { + } else if (dctx->secureChannel == DACEV1) { // EV1 Checksum must cover : [] desfire_crc32_append(pckcdata, cdatalen + 2); cdatalen += 4; @@ -2518,12 +2518,19 @@ int DesfireChangeKey(DesfireContext *dctx, bool change_master_key, uint8_t newke desfire_crc32(nkeybuf, nkeylen, &cdata[cdatalen]); cdatalen += 4; } + } else if (dctx->secureChannel == DACEV2) { + // EV2 : [] + if (newkeynum != dctx->keyNum) { + desfire_crc32(nkeybuf, nkeylen, &cdata[cdatalen]); + cdatalen += 4; + } } - + // send command uint8_t resp[257] = {0}; size_t resplen = 0; - int res = DesfireChangeKeyCmd(dctx, &pckcdata[1], cdatalen, resp, &resplen); + PrintAndLogEx(SUCCESS, "Change key [%d] %s", cdatalen + 1, sprint_hex(&pckcdata[1], cdatalen + 1)); + int res = DesfireChangeKeyCmd(dctx, &pckcdata[1], cdatalen + 1, resp, &resplen); // check response if (res == 0 && resplen > 0) diff --git a/client/src/mifare/desfiresecurechan.c b/client/src/mifare/desfiresecurechan.c index 2d91b0ecc..75ddec228 100644 --- a/client/src/mifare/desfiresecurechan.c +++ b/client/src/mifare/desfiresecurechan.c @@ -311,7 +311,7 @@ static void DesfireSecureChannelEncodeEV2(DesfireContext *ctx, uint8_t cmd, uint memcpy(&dstdata[srcdatalen], cmac, DesfireGetMACLength(ctx)); *dstdatalen = srcdatalen + DesfireGetMACLength(ctx); - } else if (ctx->commMode == DCMEncrypted || ctx->commMode == DCMEncryptedWithPadding) { + } else if (ctx->commMode == DCMEncrypted || ctx->commMode == DCMEncryptedWithPadding || ctx->commMode == DCMEncryptedPlain) { memcpy(dstdata, srcdata, hdrlen); if (srcdatalen > hdrlen) { @@ -330,11 +330,6 @@ static void DesfireSecureChannelEncodeEV2(DesfireContext *ctx, uint8_t cmd, uint *dstdatalen = hdrlen + rlen + DesfireGetMACLength(ctx); ctx->commMode = DCMEncrypted; - } else if (ctx->commMode == DCMEncryptedPlain) { - if (srcdatalen <= hdrlen) - return; - - // TODO !!! } }