mac des/ev1 calculated

This commit is contained in:
merlokk 2021-07-06 16:46:05 +03:00
commit fffef000ea
2 changed files with 23 additions and 3 deletions

View file

@ -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;

View file

@ -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;
@ -130,6 +135,18 @@ static void DesfireSecureChannelDecodeEV1(DesfireContext *ctx, uint8_t *srcdata,
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:
break;