combine all auth data to single struct and fill it

This commit is contained in:
Oleg Moiseenko 2018-02-10 19:03:29 +02:00
parent fb30f5a101
commit aadc6bf1e1
3 changed files with 45 additions and 16 deletions

View file

@ -543,6 +543,7 @@ int CmdHFList(const char *Cmd)
PrintAndLog(" Start | End | Src | Data (! denotes parity error) | CRC | Annotation |"); PrintAndLog(" Start | End | Src | Data (! denotes parity error) | CRC | Annotation |");
PrintAndLog("------------|------------|-----|-----------------------------------------------------------------|-----|--------------------|"); PrintAndLog("------------|------------|-----|-----------------------------------------------------------------|-----|--------------------|");
ClearAuthData();
while(tracepos < traceLen) while(tracepos < traceLen)
{ {
tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes); tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes);

View file

@ -28,11 +28,19 @@ enum MifareAuthSeq {
masNt, masNt,
masNrAr, masNrAr,
masAt, masAt,
masFirstData,
masData, masData,
masDataNested, masDataNested,
masError, masError,
}; };
static enum MifareAuthSeq MifareAuthState; static enum MifareAuthSeq MifareAuthState;
static TAuthData AuthData;
void ClearAuthData() {
AuthData.uid = 0;
AuthData.nt = 0;
AuthData.first_auth = false;
}
/** /**
* @brief iso14443A_CRC_check Checks CRC in command or response * @brief iso14443A_CRC_check Checks CRC in command or response
@ -63,6 +71,7 @@ uint8_t mifare_CRC_check(bool isResponse, uint8_t* data, uint8_t len)
{ {
switch(MifareAuthState) { switch(MifareAuthState) {
case masNone: case masNone:
case masFirstData:
case masData: case masData:
case masDataNested: case masDataNested:
case masError: case masError:
@ -172,22 +181,27 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
} }
void annotateMifare(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize, bool isResponse) { void annotateMifare(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize, bool isResponse) {
// uint32_t uid; // UID // get UID
static uint32_t nt; // tag challenge if (MifareAuthState == masNone) {
// uint32_t nt_enc; // encrypted tag challenge if (cmdsize == 7 && cmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT && cmd[1] == 0x70) {
// uint8_t nt_enc_par; // encrypted tag challenge parity ClearAuthData();
static uint32_t nr_enc; // encrypted reader challenge AuthData.uid = bytes_to_num(&cmd[2], 4);
static uint32_t ar_enc; // encrypted reader response }
// uint8_t ar_enc_par; // encrypted reader response parity if (cmdsize == 7 && cmd[0] == ISO14443A_CMD_ANTICOLL_OR_SELECT_2 && cmd[1] == 0x70) {
static uint32_t at_enc; // encrypted tag response ClearAuthData();
// uint8_t at_enc_par; // encrypted tag response parity AuthData.uid = bytes_to_num(&cmd[2], 4);
}
}
switch(MifareAuthState) { switch(MifareAuthState) {
case masNt: case masNt:
if (cmdsize == 4 && isResponse) { if (cmdsize == 4 && isResponse) {
snprintf(exp,size,"AUTH: nt %s", (nt) ? "(enc)" : ""); snprintf(exp,size,"AUTH: nt %s", (AuthData.first_auth) ? "" : "(enc)");
MifareAuthState = masNrAr; MifareAuthState = masNrAr;
nt = bytes_to_num(cmd, cmdsize); if (AuthData.first_auth)
AuthData.nt = bytes_to_num(cmd, cmdsize);
else
AuthData.nt_enc = bytes_to_num(cmd, cmdsize);
return; return;
} else { } else {
MifareAuthState = masError; MifareAuthState = masError;
@ -197,8 +211,8 @@ void annotateMifare(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize, bool
if (cmdsize == 8 && !isResponse) { if (cmdsize == 8 && !isResponse) {
snprintf(exp,size,"AUTH: nr ar (enc)"); snprintf(exp,size,"AUTH: nr ar (enc)");
MifareAuthState = masAt; MifareAuthState = masAt;
nr_enc = bytes_to_num(cmd, cmdsize); AuthData.nr_enc = bytes_to_num(cmd, cmdsize);
ar_enc = bytes_to_num(&cmd[3], cmdsize); AuthData.ar_enc = bytes_to_num(&cmd[3], cmdsize);
return; return;
} else { } else {
MifareAuthState = masError; MifareAuthState = masError;
@ -207,8 +221,8 @@ void annotateMifare(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize, bool
case masAt: case masAt:
if (cmdsize == 4 && isResponse) { if (cmdsize == 4 && isResponse) {
snprintf(exp,size,"AUTH: at (enc)"); snprintf(exp,size,"AUTH: at (enc)");
MifareAuthState = masData; MifareAuthState = masFirstData;
at_enc = bytes_to_num(cmd, cmdsize); AuthData.at_enc = bytes_to_num(cmd, cmdsize);
return; return;
} else { } else {
MifareAuthState = masError; MifareAuthState = masError;

View file

@ -14,6 +14,20 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
typedef struct {
uint32_t uid; // UID
uint32_t nt; // tag challenge
uint32_t nt_enc; // encrypted tag challenge
uint8_t nt_enc_par; // encrypted tag challenge parity
uint32_t nr_enc; // encrypted reader challenge
uint32_t ar_enc; // encrypted reader response
uint8_t ar_enc_par; // encrypted reader response parity
uint32_t at_enc; // encrypted tag response
uint8_t at_enc_par; // encrypted tag response parity
bool first_auth; // is first authentication
} TAuthData;
extern void ClearAuthData();
extern uint8_t iso14443A_CRC_check(bool isResponse, uint8_t* data, uint8_t len); extern uint8_t iso14443A_CRC_check(bool isResponse, uint8_t* data, uint8_t len);
extern uint8_t mifare_CRC_check(bool isResponse, uint8_t* data, uint8_t len); extern uint8_t mifare_CRC_check(bool isResponse, uint8_t* data, uint8_t len);
extern void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize); extern void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize);