mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07:00
ev1/mac and ev1/plain works
This commit is contained in:
parent
0f0ef4435e
commit
8102891491
1 changed files with 12 additions and 14 deletions
|
@ -59,7 +59,6 @@ static void DesfireSecureChannelEncodeD40(DesfireContext *ctx, uint8_t cmd, uint
|
||||||
|
|
||||||
static void DesfireSecureChannelEncodeEV1(DesfireContext *ctx, uint8_t cmd, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, size_t *dstdatalen) {
|
static void DesfireSecureChannelEncodeEV1(DesfireContext *ctx, uint8_t cmd, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, size_t *dstdatalen) {
|
||||||
uint8_t data[1024] = {0};
|
uint8_t data[1024] = {0};
|
||||||
size_t rlen = 0;
|
|
||||||
|
|
||||||
memcpy(dstdata, srcdata, srcdatalen);
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
*dstdatalen = srcdatalen;
|
*dstdatalen = srcdatalen;
|
||||||
|
@ -68,16 +67,14 @@ static void DesfireSecureChannelEncodeEV1(DesfireContext *ctx, uint8_t cmd, uint
|
||||||
case DCMPlain:
|
case DCMPlain:
|
||||||
case DCMMACed:
|
case DCMMACed:
|
||||||
data[0] = cmd;
|
data[0] = cmd;
|
||||||
rlen = padded_data_length(srcdatalen + 1, desfire_get_key_block_length(ctx->keyType));
|
|
||||||
memcpy(&data[1], srcdata, srcdatalen);
|
memcpy(&data[1], srcdata, srcdatalen);
|
||||||
uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
DesfireCryptoCMAC(ctx, data, rlen, cmac);
|
DesfireCryptoCMAC(ctx, data, srcdatalen + 1, 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], cmac, 8);
|
memcpy(&dstdata[srcdatalen], cmac, DesfireGetMACLength(ctx));
|
||||||
*dstdatalen = rlen;
|
*dstdatalen = srcdatalen + DesfireGetMACLength(ctx);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DCMEncrypted:
|
case DCMEncrypted:
|
||||||
|
@ -124,7 +121,6 @@ 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};
|
uint8_t data[1024] = {0};
|
||||||
size_t rlen = 0;
|
|
||||||
|
|
||||||
memcpy(dstdata, srcdata, srcdatalen);
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
*dstdatalen = srcdatalen;
|
*dstdatalen = srcdatalen;
|
||||||
|
@ -132,19 +128,21 @@ static void DesfireSecureChannelDecodeEV1(DesfireContext *ctx, uint8_t *srcdata,
|
||||||
switch (ctx->commMode) {
|
switch (ctx->commMode) {
|
||||||
case DCMPlain:
|
case DCMPlain:
|
||||||
case DCMMACed:
|
case DCMMACed:
|
||||||
memcpy(dstdata, srcdata, srcdatalen - 8);
|
if (srcdatalen < DesfireGetMACLength(ctx))
|
||||||
*dstdatalen = srcdatalen - 8;
|
break;
|
||||||
|
|
||||||
|
memcpy(dstdata, srcdata, srcdatalen - DesfireGetMACLength(ctx));
|
||||||
|
*dstdatalen = srcdatalen - DesfireGetMACLength(ctx);
|
||||||
|
|
||||||
memcpy(data, srcdata, *dstdatalen);
|
memcpy(data, srcdata, *dstdatalen);
|
||||||
data[*dstdatalen] = respcode;
|
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};
|
uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
DesfireCryptoCMAC(ctx, data, rlen, cmac);
|
DesfireCryptoCMAC(ctx, data, *dstdatalen + 1, cmac);
|
||||||
PrintAndLogEx(INFO, "MACp: %s", sprint_hex(&srcdata[*dstdatalen], desfire_get_key_block_length(ctx->keyType)));
|
if (memcmp(&srcdata[*dstdatalen], cmac, DesfireGetMACLength(ctx)) != 0) {
|
||||||
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");
|
PrintAndLogEx(WARNING, "Received MAC is not match with calculated");
|
||||||
|
PrintAndLogEx(INFO, " received MAC: %s", sprint_hex(&srcdata[*dstdatalen], desfire_get_key_block_length(ctx->keyType)));
|
||||||
|
PrintAndLogEx(INFO, " calculated MAC: %s", sprint_hex(cmac, desfire_get_key_block_length(ctx->keyType)));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue