first draft at having a ATR lookup list available in project

This commit is contained in:
iceman1001 2021-10-10 09:37:39 +02:00
commit dd391cda01
5 changed files with 1743 additions and 0 deletions

View file

@ -238,6 +238,7 @@ set (TARGET_SOURCES
${PM3_ROOT}/client/src/ui/overlays.ui ${PM3_ROOT}/client/src/ui/overlays.ui
${PM3_ROOT}/client/src/ui/image.ui ${PM3_ROOT}/client/src/ui/image.ui
${PM3_ROOT}/client/src/aidsearch.c ${PM3_ROOT}/client/src/aidsearch.c
${PM3_ROOT}/client/src/atrs.c
${PM3_ROOT}/client/src/cmdanalyse.c ${PM3_ROOT}/client/src/cmdanalyse.c
${PM3_ROOT}/client/src/cmdcrc.c ${PM3_ROOT}/client/src/cmdcrc.c
${PM3_ROOT}/client/src/cmddata.c ${PM3_ROOT}/client/src/cmddata.c

View file

@ -490,6 +490,7 @@ POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d && $(TOUCH) $@
SRCS = mifare/aiddesfire.c \ SRCS = mifare/aiddesfire.c \
aidsearch.c \ aidsearch.c \
atrs.c \
cmdanalyse.c \ cmdanalyse.c \
cmdcrc.c \ cmdcrc.c \
cmddata.c \ cmddata.c \

62
client/atr_scrap_eftlab.py Executable file
View file

@ -0,0 +1,62 @@
#!/usr/bin/env python3
# python3 -m pip install pandas, lxml, html5lib
import sys
import pandas as pd
import requests
ATR_URL = 'https://www.eftlab.co.uk/knowledge-base/171-atr-list-full/'
def print_atr(df):
for i in df.index:
a = df['atr'][i];
b = df['desc'][i];
if type(a) is not str or type(b) is not str:
continue
a = a.replace(' ','')
if (len(a) == 0 or len(b) == 0):
continue
b = b.replace('\\', '\\\\')
print(f' {{ "{a}", "{b}" }},')
def main():
r = requests.get(ATR_URL)
r.status_code
list_atr = pd.read_html(r.text, header=0, keep_default_na=False)
df = list_atr[0]
df.columns = ['atr', 'desc']
df = df.astype('string')
print(
"""#ifndef ATRS_H__
#define ATRS_H__
#include <stddef.h>
typedef struct atr_s {
const char *bytes;
const char *desc;
} atr_t;
const char *getAtrInfo(const char *atr_str);
// atr_t array are expected to be NULL terminated
static atr_t AtrTable[] = {""")
print_atr(df)
print(""" {NULL, "no ATR info available"}
};
#endif""")
if __name__ == "__main__":
main()

55
client/src/atrs.c Normal file
View file

@ -0,0 +1,55 @@
//-----------------------------------------------------------------------------
// Copyright (C) Iceman
//
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
// at your option, any later version. See the LICENSE.txt file for the text of
// the license.
//-----------------------------------------------------------------------------
// ATR information lookup
//-----------------------------------------------------------------------------
#include "atrs.h"
#include <ctype.h>
#include <string.h>
#include "commonutil.h" // ARRAYLEN
#include "util.h" // startswith
// get a ATR description based on the atr bytes
// returns description of the best match
const char *getAtrInfo(const char *atr_str) {
for (int i = 0; i < ARRAYLEN(AtrTable); ++i) {
// check for dots in atr table.
// dots indicate those bytes at those positions are optional.
// need a special case for them
if (strstr(AtrTable[i].bytes, "..") != NULL) {
// need to loop
const char *foo = atr_str;
int j = 0;
while (foo++, j++) {
char c = foo[0];
if (c == '.') {
continue;
}
// mismatch, return default message
if (c != AtrTable[i].bytes[j]) {
return AtrTable[ARRAYLEN(AtrTable) - 1].desc;
}
}
return AtrTable[i].desc;
} else {
if (str_startswith(atr_str, AtrTable[i].bytes)) {
return AtrTable[i].desc;
}
}
}
//No match, return default
return AtrTable[ARRAYLEN(AtrTable) - 1].desc;
}

1624
client/src/atrs.h Normal file

File diff suppressed because it is too large Load diff