mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-22 06:13:51 -07:00
mac des/ev1 calculated
This commit is contained in:
parent
5f0f6b8032
commit
fffef000ea
2 changed files with 23 additions and 3 deletions
|
@ -184,7 +184,8 @@ static void DesfireCMACGenerateSubkeys(DesfireContext *ctx, uint8_t *sk1, uint8_
|
||||||
memset(ivect, 0, kbs);
|
memset(ivect, 0, kbs);
|
||||||
|
|
||||||
//mifare_cypher_blocks_chained(NULL, key, ivect, l, kbs, MCD_SEND, MCO_ENCYPHER);
|
//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;
|
bool txor = false;
|
||||||
|
|
||||||
|
@ -218,6 +219,8 @@ void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *data, size_t len, uint8_t *
|
||||||
DesfireCMACGenerateSubkeys(ctx, sk1, sk2);
|
DesfireCMACGenerateSubkeys(ctx, sk1, sk2);
|
||||||
|
|
||||||
memcpy(buffer, data, len);
|
memcpy(buffer, data, len);
|
||||||
|
PrintAndLogEx(INFO, "sk1: %s", sprint_hex(sk1, 8));
|
||||||
|
PrintAndLogEx(INFO, "sk2: %s", sprint_hex(sk2, 8));
|
||||||
|
|
||||||
if ((!len) || (len % kbs)) {
|
if ((!len) || (len % kbs)) {
|
||||||
buffer[len++] = 0x80;
|
buffer[len++] = 0x80;
|
||||||
|
|
|
@ -70,11 +70,13 @@ static void DesfireSecureChannelEncodeEV1(DesfireContext *ctx, uint8_t cmd, uint
|
||||||
data[0] = cmd;
|
data[0] = cmd;
|
||||||
rlen = padded_data_length(srcdatalen + 1, desfire_get_key_block_length(ctx->keyType));
|
rlen = padded_data_length(srcdatalen + 1, desfire_get_key_block_length(ctx->keyType));
|
||||||
memcpy(&data[1], srcdata, srcdatalen);
|
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);
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
if (srcdatalen != 0 && ctx->commMode == DCMMACed) {
|
if (srcdatalen != 0 && ctx->commMode == DCMMACed) {
|
||||||
memcpy(&dstdata[srcdatalen], ctx->IV, 4);
|
memcpy(&dstdata[srcdatalen], cmac, 8);
|
||||||
*dstdatalen = rlen;
|
*dstdatalen = rlen;
|
||||||
}
|
}
|
||||||
break;
|
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) {
|
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);
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
*dstdatalen = srcdatalen;
|
*dstdatalen = srcdatalen;
|
||||||
|
|
||||||
|
@ -129,6 +134,18 @@ static void DesfireSecureChannelDecodeEV1(DesfireContext *ctx, uint8_t *srcdata,
|
||||||
case DCMMACed:
|
case DCMMACed:
|
||||||
memcpy(dstdata, srcdata, srcdatalen - 8);
|
memcpy(dstdata, srcdata, srcdatalen - 8);
|
||||||
*dstdatalen = 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;
|
break;
|
||||||
case DCMEncrypted:
|
case DCMEncrypted:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue