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) { 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}; uint8_t rcmd[4 + 8] = {(plain?(0x37):(0x33)), blockNum, 0x00, blockCount};
if (!plain && session) 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); int res = intExchangeRAW14aPlus(rcmd, plain?4:sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen);
if(res) if(res)
return res; return res;
if(session && mac) if(session && mac)
CalulateMAC(session, dataout, *dataoutlen, mac); CalulateMAC(session, dataout, *dataoutlen, mac, VerboseMode);
return 0; 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}; uint8_t rcmd[1 + 2 + 16 + 8] = {0xA3, blockNum, 0x00};
memmove(&rcmd[3], data, 16); memmove(&rcmd[3], data, 16);
if (session) 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); int res = intExchangeRAW14aPlus(rcmd, sizeof(rcmd), activateField, leaveSignalON, dataout, maxdataoutlen, dataoutlen);
if(res) if(res)
return res; return res;
if(session && mac) if(session && mac)
CalulateMAC(session, dataout, *dataoutlen, mac); CalulateMAC(session, dataout, *dataoutlen, mac, VerboseMode);
return 0; return 0;
} }
@ -680,7 +680,8 @@ int CmdHFMFPWrbl(const char *cmd) {
uint8_t data[250] = {0}; uint8_t data[250] = {0};
int datalen = 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) { if (res) {
PrintAndLog("Write error: %d", res); PrintAndLog("Write error: %d", res);
return res; return res;
@ -697,7 +698,7 @@ int CmdHFMFPWrbl(const char *cmd) {
} }
if (!memcmp(&data[1], mac, 8)) { 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 card: %s", sprint_hex(&data[1], 8));
PrintAndLog("MAC reader: %s", sprint_hex(mac, 8)); PrintAndLog("MAC reader: %s", sprint_hex(mac, 8));
} else { } 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) { 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}; uint8_t iiv[16] = {0};
if (iv) if (iv)
memcpy(iiv, iv, 16); memcpy(iiv, iv, 16);
// padding nist... // padding nist...
uint8_t data[length + 16] = {0}; uint8_t data[2049] = {0}; // length + 16
memcpy(data, input, length); memcpy(data, input, length);
data[length] = 0x80; data[length] = 0x80;
int datalen = length & 0xfffffff0 + 0x10; int datalen = (length & 0xfffffff0) + 0x10;
// cmac // cmac
aes_context aes; 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) { int aes_cmac8(uint8_t *iv, uint8_t *key, uint8_t *input, uint8_t *mac, int length) {
uint8_t cmac[16] = {0}; uint8_t cmac[16] = {0};
setmem(mac, 0x00, 8); memset(mac, 0x00, 8);
int res = aes_cmac(iv, key, input, cmac, length); int res = aes_cmac(iv, key, input, cmac, length);
if (res) if (res)