From fffef000eac4aa733d77a4ef04e4ad35a212c20d Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 6 Jul 2021 16:46:05 +0300 Subject: [PATCH] mac des/ev1 calculated --- client/src/mifare/desfirecrypto.c | 5 ++++- client/src/mifare/desfiresecurechan.c | 21 +++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/client/src/mifare/desfirecrypto.c b/client/src/mifare/desfirecrypto.c index e0a886b62..98a095b0c 100644 --- a/client/src/mifare/desfirecrypto.c +++ b/client/src/mifare/desfirecrypto.c @@ -184,7 +184,8 @@ static void DesfireCMACGenerateSubkeys(DesfireContext *ctx, uint8_t *sk1, uint8_ memset(ivect, 0, kbs); //mifare_cypher_blocks_chained(NULL, key, ivect, l, kbs, MCD_SEND, MCO_ENCYPHER); - DesfireCryptoEncDec(ctx, true, l, kbs, NULL, true); + DesfireCryptoEncDec(ctx, true, l, kbs, l, true); +//PrintAndLogEx(INFO, "i: %s", sprint_hex(l, kbs)); bool txor = false; @@ -218,6 +219,8 @@ void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *data, size_t len, uint8_t * DesfireCMACGenerateSubkeys(ctx, sk1, sk2); memcpy(buffer, data, len); +PrintAndLogEx(INFO, "sk1: %s", sprint_hex(sk1, 8)); +PrintAndLogEx(INFO, "sk2: %s", sprint_hex(sk2, 8)); if ((!len) || (len % kbs)) { buffer[len++] = 0x80; diff --git a/client/src/mifare/desfiresecurechan.c b/client/src/mifare/desfiresecurechan.c index 51f2af365..c1924c2fd 100644 --- a/client/src/mifare/desfiresecurechan.c +++ b/client/src/mifare/desfiresecurechan.c @@ -70,11 +70,13 @@ static void DesfireSecureChannelEncodeEV1(DesfireContext *ctx, uint8_t cmd, uint data[0] = cmd; rlen = padded_data_length(srcdatalen + 1, desfire_get_key_block_length(ctx->keyType)); memcpy(&data[1], srcdata, srcdatalen); - DesfireCryptoEncDec(ctx, true, data, rlen, NULL, true); + uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0}; + DesfireCryptoCMAC(ctx, data, rlen, cmac); +PrintAndLogEx(INFO, "MAC: %s", sprint_hex(cmac, desfire_get_key_block_length(ctx->keyType))); memcpy(dstdata, srcdata, srcdatalen); if (srcdatalen != 0 && ctx->commMode == DCMMACed) { - memcpy(&dstdata[srcdatalen], ctx->IV, 4); + memcpy(&dstdata[srcdatalen], cmac, 8); *dstdatalen = rlen; } break; @@ -121,6 +123,9 @@ static void DesfireSecureChannelDecodeD40(DesfireContext *ctx, uint8_t *srcdata, } static void DesfireSecureChannelDecodeEV1(DesfireContext *ctx, uint8_t *srcdata, size_t srcdatalen, uint8_t respcode, uint8_t *dstdata, size_t *dstdatalen) { + uint8_t data[1024] = {0}; + size_t rlen = 0; + memcpy(dstdata, srcdata, srcdatalen); *dstdatalen = srcdatalen; @@ -129,6 +134,18 @@ static void DesfireSecureChannelDecodeEV1(DesfireContext *ctx, uint8_t *srcdata, case DCMMACed: memcpy(dstdata, srcdata, srcdatalen - 8); *dstdatalen = srcdatalen - 8; + + memcpy(data, srcdata, *dstdatalen); + data[*dstdatalen] = respcode; + rlen = padded_data_length(*dstdatalen + 1, desfire_get_key_block_length(ctx->keyType)); + + uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0}; + DesfireCryptoCMAC(ctx, data, rlen, cmac); +PrintAndLogEx(INFO, "MACp: %s", sprint_hex(&srcdata[*dstdatalen], desfire_get_key_block_length(ctx->keyType))); +PrintAndLogEx(INFO, "MACc: %s", sprint_hex(cmac, desfire_get_key_block_length(ctx->keyType))); + if (memcmp(&srcdata[*dstdatalen], cmac, desfire_get_key_block_length(ctx->keyType)) != 0) { + PrintAndLogEx(WARNING, "Received MAC is not match with calculated"); + } break; case DCMEncrypted: