logic fixes. works

This commit is contained in:
merlokk 2018-10-24 23:55:09 +03:00
commit dea1b37104
2 changed files with 12 additions and 11 deletions

View file

@ -88,30 +88,30 @@ int MFPCommitPerso(bool activateField, bool leaveSignalON, uint8_t *dataout, int
int MFPReadBlock(mf4Session *session, bool plain, uint8_t blockNum, uint8_t blockCount, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) {
uint8_t rcmd[4 + 8] = {(plain?(0x37):(0x33)), blockNum, 0x00, blockCount};
if (!plain && session)
CalulateMAC(session, rcmd, 4, &rcmd[4]);
CalulateMAC(session, rcmd, 4, &rcmd[4], VerboseMode);
int res = intExchangeRAW14aPlus(rcmd, plain?4:sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen);
if(res)
return res;
if(session && mac)
CalulateMAC(session, dataout, *dataoutlen, mac);
CalulateMAC(session, dataout, *dataoutlen, mac, VerboseMode);
return 0;
}
int MFPWriteBlock(mf4Session *session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen) {
int MFPWriteBlock(mf4Session *session, uint8_t blockNum, uint8_t *data, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen, uint8_t *mac) {
uint8_t rcmd[1 + 2 + 16 + 8] = {0xA3, blockNum, 0x00};
memmove(&rcmd[3], data, 16);
if (session)
CalulateMAC(session, rcmd, 19, &rcmd[19]);
CalulateMAC(session, rcmd, 19, &rcmd[19], VerboseMode);
int res = intExchangeRAW14aPlus(rcmd, sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen);
if(res)
return res;
if(session && mac)
CalulateMAC(session, dataout, *dataoutlen, mac);
CalulateMAC(session, dataout, *dataoutlen, mac, VerboseMode);
return 0;
}
@ -680,7 +680,8 @@ int CmdHFMFPWrbl(const char *cmd) {
uint8_t data[250] = {0};
int datalen = 0;
res = MFPWriteBlock(&session, blockNum & 0xff, datain, false, false, data, sizeof(data), &datalen);
uint8_t mac[8] = {0};
res = MFPWriteBlock(&session, blockNum & 0xff, datain, false, false, data, sizeof(data), &datalen, mac);
if (res) {
PrintAndLog("Write error: %d", res);
return res;
@ -697,7 +698,7 @@ int CmdHFMFPWrbl(const char *cmd) {
}
if (!memcmp(&data[1], mac, 8)) {
PrintAndLog("WARNING: mac on block %d not equal...", n);
PrintAndLog("WARNING: mac not equal...");
PrintAndLog("MAC card: %s", sprint_hex(&data[1], 8));
PrintAndLog("MAC reader: %s", sprint_hex(mac, 8));
} else {

View file

@ -44,16 +44,16 @@ int aes_decode(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *output, int l
}
int aes_cmac(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *mac, int length) {
setmem(mac, 0x00, 16);
memset(mac, 0x00, 16);
uint8_t iiv[16] = {0};
if (iv)
memcpy(iiv, iv, 16);
// padding nist...
uint8_t data[length + 16] = {0};
uint8_t data[2049] = {0}; // length + 16
memcpy(data, input, length);
data[length] = 0x80;
int datalen = length & 0xfffffff0 + 0x10;
int datalen = (length & 0xfffffff0) + 0x10;
// cmac
aes_context aes;
@ -66,7 +66,7 @@ int aes_cmac(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *mac, int length
int aes_cmac8(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *mac, int length) {
uint8_t cmac[16] = {0};
setmem(mac, 0x00, 8);
memset(mac, 0x00, 8);
int res = aes_cmac(iv, key, input, cmac, length);
if (res)