mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-10 15:32:41 -07:00
combine all auth data to single struct and fill it
This commit is contained in:
parent
fb30f5a101
commit
aadc6bf1e1
3 changed files with 45 additions and 16 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue