mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-22 14:23:50 -07:00
lrp maced tx works
This commit is contained in:
parent
8bd14245c6
commit
4ae1912772
1 changed files with 39 additions and 0 deletions
|
@ -381,6 +381,43 @@ static void DesfireSecureChannelEncodeEV2(DesfireContext *ctx, uint8_t cmd, uint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DesfireSecureChannelEncodeLRP(DesfireContext *ctx, uint8_t cmd, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, size_t *dstdatalen) {
|
||||||
|
uint8_t data[1050] = {0};
|
||||||
|
size_t rlen = 0;
|
||||||
|
|
||||||
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
|
*dstdatalen = srcdatalen;
|
||||||
|
|
||||||
|
uint8_t hdrlen = DesfireGetCmdHeaderLen(cmd);
|
||||||
|
|
||||||
|
if (ctx->commMode == DCMMACed) {
|
||||||
|
uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
|
DesfireLRPCalcCMAC(ctx, cmd, srcdata, srcdatalen, cmac);
|
||||||
|
|
||||||
|
memcpy(&dstdata[srcdatalen], cmac, DesfireGetMACLength(ctx));
|
||||||
|
*dstdatalen = srcdatalen + DesfireGetMACLength(ctx);
|
||||||
|
} else if (ctx->commMode == DCMEncrypted || ctx->commMode == DCMEncryptedWithPadding || ctx->commMode == DCMEncryptedPlain) {
|
||||||
|
memcpy(dstdata, srcdata, hdrlen);
|
||||||
|
|
||||||
|
if (srcdatalen > hdrlen) {
|
||||||
|
rlen = padded_data_length(srcdatalen + 1 - hdrlen, desfire_get_key_block_length(ctx->keyType));
|
||||||
|
memcpy(data, &srcdata[hdrlen], srcdatalen - hdrlen);
|
||||||
|
data[srcdatalen - hdrlen] = 0x80; // padding
|
||||||
|
|
||||||
|
DesfireEV2FillIV(ctx, true, NULL); // fill IV to ctx
|
||||||
|
DesfireCryptoEncDec(ctx, DCOSessionKeyEnc, data, rlen, &dstdata[hdrlen], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t cmac[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
|
DesfireLRPCalcCMAC(ctx, cmd, dstdata, hdrlen + rlen, cmac);
|
||||||
|
|
||||||
|
memcpy(&dstdata[hdrlen + rlen], cmac, DesfireGetMACLength(ctx));
|
||||||
|
|
||||||
|
*dstdatalen = hdrlen + rlen + DesfireGetMACLength(ctx);
|
||||||
|
ctx->commMode = DCMEncrypted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DesfireSecureChannelEncode(DesfireContext *ctx, uint8_t cmd, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, size_t *dstdatalen) {
|
void DesfireSecureChannelEncode(DesfireContext *ctx, uint8_t cmd, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, size_t *dstdatalen) {
|
||||||
ctx->lastCommand = cmd;
|
ctx->lastCommand = cmd;
|
||||||
ctx->lastRequestZeroLen = (srcdatalen <= DesfireGetCmdHeaderLen(cmd));
|
ctx->lastRequestZeroLen = (srcdatalen <= DesfireGetCmdHeaderLen(cmd));
|
||||||
|
@ -396,6 +433,8 @@ void DesfireSecureChannelEncode(DesfireContext *ctx, uint8_t cmd, uint8_t *srcda
|
||||||
DesfireSecureChannelEncodeEV2(ctx, cmd, srcdata, srcdatalen, dstdata, dstdatalen);
|
DesfireSecureChannelEncodeEV2(ctx, cmd, srcdata, srcdatalen, dstdata, dstdatalen);
|
||||||
break;
|
break;
|
||||||
case DACLRP:
|
case DACLRP:
|
||||||
|
DesfireSecureChannelEncodeLRP(ctx, cmd, srcdata, srcdatalen, dstdata, dstdatalen);
|
||||||
|
break;
|
||||||
case DACNone:
|
case DACNone:
|
||||||
memcpy(dstdata, srcdata, srcdatalen);
|
memcpy(dstdata, srcdata, srcdatalen);
|
||||||
*dstdatalen = srcdatalen;
|
*dstdatalen = srcdatalen;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue