From 7d48ad19f960c8675b83d6c6d5508f443a801fdd Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 12 Apr 2019 00:38:54 +0200 Subject: [PATCH] Rework Cmd exposed API, use more static and fix [-Wmissing-prototypes], ongoing... --- client/cmdanalyse.c | 32 ++--- client/cmdanalyse.h | 8 -- client/cmdcrc.c | 47 +++---- client/cmdcrc.h | 1 - client/cmdflashmem.c | 24 ++-- client/cmdflashmem.h | 5 - client/cmdlf.c | 30 ++--- client/cmdlfjablotron.c | 66 +++++----- client/cmdlfjablotron.h | 6 +- client/cmdlfkeri.c | 57 ++++---- client/cmdlfkeri.h | 5 +- client/cmdlfnedap.c | 152 +++++++++++----------- client/cmdlfnedap.h | 7 +- client/cmdlfnexwatch.c | 43 +++--- client/cmdlfnexwatch.h | 3 +- client/cmdlfnoralsy.c | 109 ++++++++-------- client/cmdlfnoralsy.h | 6 +- client/cmdlfpac.c | 31 +++-- client/cmdlfpac.h | 3 +- client/cmdlfparadox.c | 79 +++++------ client/cmdlfparadox.h | 6 +- client/cmdlfpcf7931.h | 4 - client/cmdlfpresco.c | 281 ++++++++++++++++++++-------------------- client/cmdlfpresco.h | 8 +- client/cmdlfpyramid.c | 123 +++++++++--------- client/cmdlfpyramid.h | 6 +- client/cmdlfsecurakey.c | 31 +++-- client/cmdlfsecurakey.h | 7 +- client/cmdlft55xx.h | 11 -- client/cmdlfti.c | 5 + client/cmdlfti.h | 5 +- client/cmdlfviking.c | 69 +++++----- client/cmdlfviking.h | 7 +- client/cmdlfvisa2000.c | 31 +++-- client/cmdlfvisa2000.h | 6 +- client/cmdmain.c | 58 ++++----- client/cmdscript.c | 27 ++-- client/cmdscript.h | 2 - client/cmdsmartcard.c | 163 +++++++++++------------ client/cmdsmartcard.h | 5 - client/cmdtrace.c | 165 +++++++++++------------ client/cmdtrace.h | 3 - 42 files changed, 865 insertions(+), 872 deletions(-) diff --git a/client/cmdanalyse.c b/client/cmdanalyse.c index 46e19fb98..b9e4931d1 100644 --- a/client/cmdanalyse.c +++ b/client/cmdanalyse.c @@ -220,7 +220,7 @@ static uint16_t calcBSDchecksum4(uint8_t *bytes, uint8_t len, uint32_t mask) { } // measuring LFSR maximum length -int CmdAnalyseLfsr(const char *Cmd) { +static int CmdAnalyseLfsr(const char *Cmd) { uint16_t start_state = 0; /* Any nonzero start state will work. */ uint16_t lfsr = start_state; @@ -242,7 +242,7 @@ int CmdAnalyseLfsr(const char *Cmd) { } return 0; } -int CmdAnalyseLCR(const char *Cmd) { +static int CmdAnalyseLCR(const char *Cmd) { uint8_t data[50]; char cmdp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) == 0 || cmdp == 'h') return usage_analyse_lcr(); @@ -263,7 +263,7 @@ int CmdAnalyseLCR(const char *Cmd) { PrintAndLogEx(NORMAL, "Target [%02X] requires final LRC XOR byte value: 0x%02X", data[len - 1], finalXor); return 0; } -int CmdAnalyseCRC(const char *Cmd) { +static int CmdAnalyseCRC(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) == 0 || cmdp == 'h') return usage_analyse_crc(); @@ -359,7 +359,7 @@ int CmdAnalyseCRC(const char *Cmd) { free(data); return 0; } -int CmdAnalyseCHKSUM(const char *Cmd) { +static int CmdAnalyseCHKSUM(const char *Cmd) { uint8_t data[50]; uint8_t cmdp = 0; @@ -425,13 +425,13 @@ int CmdAnalyseCHKSUM(const char *Cmd) { return 0; } -int CmdAnalyseDates(const char *Cmd) { +static int CmdAnalyseDates(const char *Cmd) { (void)Cmd; // Cmd is not used so far // look for datestamps in a given array of bytes PrintAndLogEx(NORMAL, "To be implemented. Feel free to contribute!"); return 0; } -int CmdAnalyseTEASelfTest(const char *Cmd) { +static int CmdAnalyseTEASelfTest(const char *Cmd) { uint8_t v[8], v_le[8]; memset(v, 0x00, sizeof(v)); @@ -466,7 +466,7 @@ int CmdAnalyseTEASelfTest(const char *Cmd) { return 0; } -char *pb(uint32_t b) { +static char *pb(uint32_t b) { static char buf1[33] = {0}; static char buf2[33] = {0}; static char *s; @@ -486,7 +486,7 @@ char *pb(uint32_t b) { return s; } -int CmdAnalyseA(const char *Cmd) { +static int CmdAnalyseA(const char *Cmd) { int hexlen = 0; uint8_t cmdp = 0; @@ -852,7 +852,7 @@ int CmdAnalyseA(const char *Cmd) { return 0; } -void generate4bNUID(uint8_t *uid, uint8_t *nuid) { +static void generate4bNUID(uint8_t *uid, uint8_t *nuid) { uint16_t crc; uint8_t b1, b2; @@ -866,7 +866,7 @@ void generate4bNUID(uint8_t *uid, uint8_t *nuid) { nuid[3] = crc & 0xFF; } -int CmdAnalyseNuid(const char *Cmd) { +static int CmdAnalyseNuid(const char *Cmd) { uint8_t nuid[4] = {0}; uint8_t uid[7] = {0}; int len = 0; @@ -916,14 +916,14 @@ static command_t CommandTable[] = { {NULL, NULL, 0, NULL} }; +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return 0; +} + int CmdAnalyse(const char *Cmd) { clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } - -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return 0; -} diff --git a/client/cmdanalyse.h b/client/cmdanalyse.h index 4c5c486e6..20dc58a7e 100644 --- a/client/cmdanalyse.h +++ b/client/cmdanalyse.h @@ -27,12 +27,4 @@ #include "util_posix.h" // msclock int CmdAnalyse(const char *Cmd); -int CmdAnalyseLCR(const char *Cmd); -int CmdAnalyseCHKSUM(const char *Cmd); -int CmdAnalyseDates(const char *Cmd); -int CmdAnalyseCRC(const char *Cmd); -int CmdAnalyseTEASelfTest(const char *Cmd); -int CmdAnalyseLfsr(const char *Cmd); -int CmdAnalyseHid(const char *Cmd); -int CmdAnalyseNuid(const char *Cmd); #endif diff --git a/client/cmdcrc.c b/client/cmdcrc.c index dd14dcb50..7ec34e2cd 100644 --- a/client/cmdcrc.c +++ b/client/cmdcrc.c @@ -39,25 +39,6 @@ static int split(char *str, char *arr[MAX_ARGS]) { return wordCnt; } -int CmdCrc(const char *Cmd) { - char name[] = {"reveng "}; - char Cmd2[100 + 7]; - memcpy(Cmd2, name, 7); - memcpy(Cmd2 + 7, Cmd, 100); - char *argv[MAX_ARGS]; - int argc = split(Cmd2, argv); - - if (argc == 3 && memcmp(argv[1], "-g", 2) == 0) { - CmdrevengSearch(argv[2]); - } else { - reveng_main(argc, argv); - } - for (int i = 0; i < argc; ++i) { - free(argv[i]); - } - return 0; -} - //returns array of model names and the count of models returning // as well as a width array for the width of each model int GetModels(char *Models[], int *count, uint8_t *width) { @@ -364,9 +345,9 @@ int RunModel(char *inModel, char *inHexStr, bool reverse, char endian, char *res pfree(&apoly); return 1; } - +/* //test call to RunModel -int CmdrevengTestC(const char *Cmd) { +static int CmdrevengTestC(const char *Cmd) { int cmdp = 0; char inModel[30] = {0x00}; char inHexStr[30] = {0x00}; @@ -387,7 +368,7 @@ int CmdrevengTestC(const char *Cmd) { PrintAndLogEx(SUCCESS, "result: %s", result); return 1; } - +*/ //returns a calloced string (needs to be freed) static char *SwapEndianStr(const char *inStr, const size_t len, const uint8_t blockSize) { char *tmp = calloc(len + 1, sizeof(char)); @@ -401,7 +382,7 @@ static char *SwapEndianStr(const char *inStr, const size_t len, const uint8_t bl } // takes hex string in and searches for a matching result (hex string must include checksum) -int CmdrevengSearch(const char *Cmd) { +static int CmdrevengSearch(const char *Cmd) { #define NMODELS 106 @@ -486,3 +467,23 @@ int CmdrevengSearch(const char *Cmd) { if (!found) PrintAndLogEx(FAILED, "\nno matches found\n"); return 1; } + +int CmdCrc(const char *Cmd) { + char name[] = {"reveng "}; + char Cmd2[100 + 7]; + memcpy(Cmd2, name, 7); + memcpy(Cmd2 + 7, Cmd, 100); + char *argv[MAX_ARGS]; + int argc = split(Cmd2, argv); + + if (argc == 3 && memcmp(argv[1], "-g", 2) == 0) { + CmdrevengSearch(argv[2]); + } else { + reveng_main(argc, argv); + } + for (int i = 0; i < argc; ++i) { + free(argv[i]); + } + return 0; +} + diff --git a/client/cmdcrc.h b/client/cmdcrc.h index f52727c2c..e45c004f5 100644 --- a/client/cmdcrc.h +++ b/client/cmdcrc.h @@ -30,7 +30,6 @@ int CmdCrc(const char *Cmd); -int CmdrevengSearch(const char *Cmd); int GetModels(char *Models[], int *count, uint8_t *width); int RunModel(char *inModel, char *inHexStr, bool reverse, char endian, char *result); #endif diff --git a/client/cmdflashmem.c b/client/cmdflashmem.c index 2c565d9e9..2f89fc9b4 100644 --- a/client/cmdflashmem.c +++ b/client/cmdflashmem.c @@ -107,7 +107,7 @@ static int usage_flashmem_info(void) { return 0; } -int CmdFlashMemRead(const char *Cmd) { +static int CmdFlashMemRead(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; @@ -146,7 +146,7 @@ int CmdFlashMemRead(const char *Cmd) { return 0; } -int CmdFlashmemSpiBaudrate(const char *Cmd) { +static int CmdFlashmemSpiBaudrate(const char *Cmd) { char ctmp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) < 1 || ctmp == 'h') return usage_flashmem_spibaud(); @@ -158,7 +158,7 @@ int CmdFlashmemSpiBaudrate(const char *Cmd) { return 0; } -int CmdFlashMemLoad(const char *Cmd) { +static int CmdFlashMemLoad(const char *Cmd) { uint32_t start_index = 0; char filename[FILE_PATH_SIZE] = {0}; @@ -301,7 +301,7 @@ int CmdFlashMemLoad(const char *Cmd) { PrintAndLogEx(SUCCESS, "Wrote %u bytes to offset %u", datalen, start_index); return 0; } -int CmdFlashMemSave(const char *Cmd) { +static int CmdFlashMemSave(const char *Cmd) { char filename[FILE_PATH_SIZE] = {0}; uint8_t cmdp = 0; @@ -357,7 +357,7 @@ int CmdFlashMemSave(const char *Cmd) { free(dump); return 0; } -int CmdFlashMemWipe(const char *Cmd) { +static int CmdFlashMemWipe(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; @@ -406,7 +406,7 @@ int CmdFlashMemWipe(const char *Cmd) { return 0; } -int CmdFlashMemInfo(const char *Cmd) { +static int CmdFlashMemInfo(const char *Cmd) { uint8_t sha_hash[20] = {0}; mbedtls_rsa_context rsa; @@ -606,16 +606,16 @@ static command_t CommandTable[] = { {NULL, NULL, 0, NULL} }; +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return 0; +} + int CmdFlashMem(const char *Cmd) { clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return 0; -} - #endif diff --git a/client/cmdflashmem.h b/client/cmdflashmem.h index 1cf06c1bc..c58de661d 100644 --- a/client/cmdflashmem.h +++ b/client/cmdflashmem.h @@ -35,11 +35,6 @@ typedef enum { int CmdFlashMem(const char *Cmd); -int CmdFlashMemRead(const char *Cmd); -int CmdFlashMemLoad(const char *Cmd); -int CmdFlashMemSave(const char *Cmd); -int CmdFlashMemWipe(const char *Cmd); -int CmdFlashMemInfo(const char *Cmd); #endif #endif diff --git a/client/cmdlf.c b/client/cmdlf.c index df189fc2d..f00525bee 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -898,7 +898,7 @@ int CmdLFfind(const char *Cmd) { if (CmdHIDDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("HID Prox ID") " found!"); goto out;} if (CmdAWIDDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("AWID ID") " found!"); goto out;} - if (CmdParadoxDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Paradox ID") " found!"); goto out;} + if (demodParadox()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Paradox ID") " found!"); goto out;} if (CmdEM410xDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("EM410x ID") " found!"); goto out;} if (CmdFdxDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("FDX-B ID") " found!"); goto out;} @@ -906,21 +906,21 @@ int CmdLFfind(const char *Cmd) { if (CmdIdteckDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Idteck ID") " found!"); goto out;} if (CmdIndalaDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Indala ID") " found!"); goto out;} if (CmdIOProxDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("IO Prox ID") " found!"); goto out;} - if (CmdJablotronDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Jablotron ID") " found!"); goto out;} - if (CmdLFNedapDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("NEDAP ID") " found!"); goto out;} - if (CmdNexWatchDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("NexWatch ID") " found!"); goto out;} - if (CmdNoralsyDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Noralsy ID") " found!"); goto out;} - if (CmdKeriDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("KERI ID") " found!"); goto out;} - if (CmdPacDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("PAC/Stanley ID") " found!"); goto out;} + if (demodJablotron()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Jablotron ID") " found!"); goto out;} + if (demodNedap()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("NEDAP ID") " found!"); goto out;} + if (demodNexWatch()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("NexWatch ID") " found!"); goto out;} + if (demodNoralsy()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Noralsy ID") " found!"); goto out;} + if (demodKeri()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("KERI ID") " found!"); goto out;} + if (demodPac()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("PAC/Stanley ID") " found!"); goto out;} - if (CmdPrescoDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Presco ID") " found!"); goto out;} - if (CmdPyramidDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Pyramid ID") " found!"); goto out;} - if (CmdSecurakeyDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Securakey ID") " found!"); goto out;} - if (CmdVikingDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Viking ID") " found!"); goto out;} - if (CmdVisa2kDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Visa2000 ID") " found!"); goto out;} - if (CmdTIDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Texas Instrument ID") " found!"); goto out;} - //if (CmdFermaxDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Fermax ID") " found!"); goto out;} - //if (CmdFlexDemod("")) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Flex ID") " found!"); goto out;} + if (demodPresco()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Presco ID") " found!"); goto out;} + if (demodPyramid()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Pyramid ID") " found!"); goto out;} + if (demodSecurakey()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Securakey ID") " found!"); goto out;} + if (demodViking()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Viking ID") " found!"); goto out;} + if (demodVisa2k()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Visa2000 ID") " found!"); goto out;} + if (demodTI()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Texas Instrument ID") " found!"); goto out;} + //if (demodFermax()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Fermax ID") " found!"); goto out;} + //if (demodFlex()) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Flex ID") " found!"); goto out;} PrintAndLogEx(FAILED, _RED_("No known 125/134 KHz tags found!")); diff --git a/client/cmdlfjablotron.c b/client/cmdlfjablotron.c index 621ff323b..f253e4866 100644 --- a/client/cmdlfjablotron.c +++ b/client/cmdlfjablotron.c @@ -48,37 +48,6 @@ static uint8_t jablontron_chksum(uint8_t *bits) { return chksum; } -int getJablotronBits(uint64_t fullcode, uint8_t *bits) { - //preamp - num_to_bytebits(0xFFFF, 16, bits); - - //fullcode - num_to_bytebits(fullcode, 40, bits + 16); - - //chksum byte - uint8_t chksum = jablontron_chksum(bits); - num_to_bytebits(chksum, 8, bits + 56); - return 1; -} - -// ASK/Diphase fc/64 (inverted Biphase) -// Note: this is not a demod, this is only a detection -// the parameter *bits needs to be demoded before call -// 0xFFFF preamble, 64bits -int detectJablotron(uint8_t *bits, size_t *size) { - if (*size < 64 * 2) return -1; //make sure buffer has enough data - size_t startIdx = 0; - uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; - if (preambleSearch(bits, preamble, sizeof(preamble), size, &startIdx) == 0) - return -2; //preamble not found - if (*size != 64) return -3; // wrong demoded size - - uint8_t checkchksum = jablontron_chksum(bits + startIdx); - uint8_t crc = bytebits_to_byte(bits + startIdx + 56, 8); - if (checkchksum != crc) return -5; - return (int)startIdx; -} - static uint64_t getJablontronCardId(uint64_t rawcode) { uint64_t id = 0; uint8_t bytes[] = {0, 0, 0, 0, 0}; @@ -250,3 +219,38 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +int getJablotronBits(uint64_t fullcode, uint8_t *bits) { + //preamp + num_to_bytebits(0xFFFF, 16, bits); + + //fullcode + num_to_bytebits(fullcode, 40, bits + 16); + + //chksum byte + uint8_t chksum = jablontron_chksum(bits); + num_to_bytebits(chksum, 8, bits + 56); + return 1; +} + +// ASK/Diphase fc/64 (inverted Biphase) +// Note: this is not a demod, this is only a detection +// the parameter *bits needs to be demoded before call +// 0xFFFF preamble, 64bits +int detectJablotron(uint8_t *bits, size_t *size) { + if (*size < 64 * 2) return -1; //make sure buffer has enough data + size_t startIdx = 0; + uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; + if (preambleSearch(bits, preamble, sizeof(preamble), size, &startIdx) == 0) + return -2; //preamble not found + if (*size != 64) return -3; // wrong demoded size + + uint8_t checkchksum = jablontron_chksum(bits + startIdx); + uint8_t crc = bytebits_to_byte(bits + startIdx + 56, 8); + if (checkchksum != crc) return -5; + return (int)startIdx; +} + +int demodJablotron(void) { + return CmdJablotronDemod(""); +} diff --git a/client/cmdlfjablotron.h b/client/cmdlfjablotron.h index c46e6fc31..ae6186496 100644 --- a/client/cmdlfjablotron.h +++ b/client/cmdlfjablotron.h @@ -24,11 +24,7 @@ int CmdLFJablotron(const char *Cmd); -int CmdJablotronDemod(const char *Cmd); -int CmdJablotronRead(const char *Cmd); -int CmdJablotronClone(const char *Cmd); -int CmdJablotronSim(const char *Cmd); - +int demodJablotron(void); int detectJablotron(uint8_t *bits, size_t *size); int getJablotronBits(uint64_t fullcode, uint8_t *bits); diff --git a/client/cmdlfkeri.c b/client/cmdlfkeri.c index e4516e127..a7cd873db 100644 --- a/client/cmdlfkeri.c +++ b/client/cmdlfkeri.c @@ -38,32 +38,7 @@ static int usage_lf_keri_sim(void) { return 0; } -// find KERI preamble in already demoded data -int detectKeri(uint8_t *dest, size_t *size, bool *invert) { - - uint8_t preamble[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; - uint8_t preamble_i[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; - - // sanity check. - if (*size < sizeof(preamble) + 100) return -1; - - size_t startIdx = 0; - - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) { - - // if didn't find preamble try again inverting - if (!preambleSearch(DemodBuffer, preamble_i, sizeof(preamble_i), size, &startIdx)) - return -2; - - *invert ^= 1; - } - - if (*size != 64) return -3; //wrong demoded size - - return (int)startIdx; -} - -int CmdKeriDemod(const char *Cmd) { +static int CmdKeriDemod(const char *Cmd) { (void)Cmd; // Cmd is not used so far if (!PSKDemod("", false)) { @@ -242,3 +217,33 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// find KERI preamble in already demoded data +int detectKeri(uint8_t *dest, size_t *size, bool *invert) { + + uint8_t preamble[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; + uint8_t preamble_i[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; + + // sanity check. + if (*size < sizeof(preamble) + 100) return -1; + + size_t startIdx = 0; + + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) { + + // if didn't find preamble try again inverting + if (!preambleSearch(DemodBuffer, preamble_i, sizeof(preamble_i), size, &startIdx)) + return -2; + + *invert ^= 1; + } + + if (*size != 64) return -3; //wrong demoded size + + return (int)startIdx; +} + +int demodKeri(void) { + return CmdKeriDemod(""); +} + diff --git a/client/cmdlfkeri.h b/client/cmdlfkeri.h index bab4c47b0..78b087834 100644 --- a/client/cmdlfkeri.h +++ b/client/cmdlfkeri.h @@ -23,11 +23,8 @@ #include "lfdemod.h" // preamble test int CmdLFKeri(const char *Cmd); -int CmdKeriRead(const char *Cmd); -int CmdKeriDemod(const char *Cmd); -int CmdKeriClone(const char *Cmd); -int CmdKeriSim(const char *Cmd); +int demodKeri(void); int detectKeri(uint8_t *dest, size_t *size, bool *invert); #endif diff --git a/client/cmdlfnedap.c b/client/cmdlfnedap.c index 9758615f8..18e142be0 100644 --- a/client/cmdlfnedap.c +++ b/client/cmdlfnedap.c @@ -40,80 +40,8 @@ static int usage_lf_nedap_sim(void) { return 0; } -// find nedap preamble in already demoded data -int detectNedap(uint8_t *dest, size_t *size) { - //make sure buffer has data - if (*size < 128) return -3; - - size_t startIdx = 0; - //uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,0,0,0,1}; - uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -4; //preamble not found - return (int) startIdx; -} - -static int GetNedapBits(uint32_t cn, uint8_t *nedapBits) { - - uint8_t pre[128]; - memset(pre, 0x00, sizeof(pre)); - - // preamble 1111 1111 10 = 0xFF8 - num_to_bytebits(0xFF8, 12, pre); - - // fixed tagtype code? 0010 1101 = 0x2D - num_to_bytebits(0x2D, 8, pre + 10); - - // 46 encrypted bits - UNKNOWN ALGO - // -- 16 bits checksum. Should be 4x4 checksum, based on UID and 2 constant values. - // -- 30 bits undocumented? - //num_to_bytebits(cn, 46, pre+18); - - //----from this part, the UID in clear text, with a 1bit ZERO as separator between bytes. - pre[64] = 0; - pre[73] = 0; - pre[82] = 0; - pre[91] = 0; - pre[100] = 0; - pre[109] = 0; - pre[118] = 0; - - // cardnumber (uid) - num_to_bytebits((cn >> 0) & 0xFF, 8, pre + 65); - num_to_bytebits((cn >> 8) & 0xFF, 8, pre + 74); - num_to_bytebits((cn >> 16) & 0xFF, 8, pre + 83); - - // two ? - num_to_bytebits(0, 8, pre + 92); - num_to_bytebits(0, 8, pre + 101); - - // chksum - num_to_bytebits((0 >> 0) & 0xFF, 8, pre + 110); - num_to_bytebits((0 >> 8) & 0xFF, 8, pre + 119); - - - // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) - addParity(pre, pre + 64, 64, 8, 1); - addParity(pre + 64, pre + 64, 64, 8, 1); - - pre[63] = GetParity(DemodBuffer, EVEN, 63); - pre[127] = GetParity(DemodBuffer + 64, EVEN, 63); - - memcpy(nedapBits, pre, 128); - - // 1111111110001011010000010110100011001001000010110101001101011001000110011010010000000000100001110001001000000001000101011100111 - return 1; -} -/* - - UID: 001630 - - i: 4071 - - Checksum2 BE21 -*/ -//GetParity( uint8_t *bits, uint8_t type, int length) - //NEDAP demod - ASK/Biphase (or Diphase), RF/64 with preamble of 1111111110 (always a 128 bit data stream) //print NEDAP Prox ID, encoding, encrypted ID, - int CmdLFNedapDemod(const char *Cmd) { (void)Cmd; // Cmd is not used so far //raw ask demod no start bit finding just get binary from wave @@ -253,7 +181,7 @@ int CmdLFNedapClone(const char *Cmd) { cardnumber = (cn & 0x00FFFFFF); - if ( !GetNedapBits(cardnumber, bits)) { + if ( !getNedapBits(cardnumber, bits)) { PrintAndLogEx(WARNING, "Error with tag bitstream generation."); return 1; } @@ -312,7 +240,7 @@ int CmdLFNedapSim(const char *Cmd) { arg1 = clk << 8 | encoding; arg2 = invert << 8 | separator; - if (!GetNedapBits(cardnumber, bs)) { + if (!getNedapBits(cardnumber, bs)) { PrintAndLogEx(WARNING, "Error with tag bitstream generation."); return 1; } @@ -395,3 +323,79 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// find nedap preamble in already demoded data +int detectNedap(uint8_t *dest, size_t *size) { + //make sure buffer has data + if (*size < 128) return -3; + + size_t startIdx = 0; + //uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,0,0,0,1}; + uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -4; //preamble not found + return (int) startIdx; +} + +int getNedapBits(uint32_t cn, uint8_t *nedapBits) { + + uint8_t pre[128]; + memset(pre, 0x00, sizeof(pre)); + + // preamble 1111 1111 10 = 0xFF8 + num_to_bytebits(0xFF8, 12, pre); + + // fixed tagtype code? 0010 1101 = 0x2D + num_to_bytebits(0x2D, 8, pre + 10); + + // 46 encrypted bits - UNKNOWN ALGO + // -- 16 bits checksum. Should be 4x4 checksum, based on UID and 2 constant values. + // -- 30 bits undocumented? + //num_to_bytebits(cn, 46, pre+18); + + //----from this part, the UID in clear text, with a 1bit ZERO as separator between bytes. + pre[64] = 0; + pre[73] = 0; + pre[82] = 0; + pre[91] = 0; + pre[100] = 0; + pre[109] = 0; + pre[118] = 0; + + // cardnumber (uid) + num_to_bytebits((cn >> 0) & 0xFF, 8, pre + 65); + num_to_bytebits((cn >> 8) & 0xFF, 8, pre + 74); + num_to_bytebits((cn >> 16) & 0xFF, 8, pre + 83); + + // two ? + num_to_bytebits(0, 8, pre + 92); + num_to_bytebits(0, 8, pre + 101); + + // chksum + num_to_bytebits((0 >> 0) & 0xFF, 8, pre + 110); + num_to_bytebits((0 >> 8) & 0xFF, 8, pre + 119); + + + // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) + addParity(pre, pre + 64, 64, 8, 1); + addParity(pre + 64, pre + 64, 64, 8, 1); + + pre[63] = GetParity(DemodBuffer, EVEN, 63); + pre[127] = GetParity(DemodBuffer + 64, EVEN, 63); + + memcpy(nedapBits, pre, 128); + + // 1111111110001011010000010110100011001001000010110101001101011001000110011010010000000000100001110001001000000001000101011100111 + return 1; +} +/* + - UID: 001630 + - i: 4071 + - Checksum2 BE21 +*/ +//GetParity( uint8_t *bits, uint8_t type, int length) + +int demodNedap(void) { + return CmdLFNedapDemod(""); +} + diff --git a/client/cmdlfnedap.h b/client/cmdlfnedap.h index e0cf9e0c0..8ba7c9908 100644 --- a/client/cmdlfnedap.h +++ b/client/cmdlfnedap.h @@ -23,13 +23,10 @@ #include "crc.h" int CmdLFNedap(const char *Cmd); -int CmdLFNedapDemod(const char *Cmd); -int CmdLFNedapRead(const char *Cmd); -//int CmdLFNedapClone(const char *Cmd); -int CmdLFNedapSim(const char *Cmd); -int CmdLFNedapChk(const char *Cmd); +int demodNedap(void); int detectNedap(uint8_t *dest, size_t *size); +int getNedapBits(uint32_t cn, uint8_t *nedapBits); #endif diff --git a/client/cmdlfnexwatch.c b/client/cmdlfnexwatch.c index 6ce78b3f3..a228872ff 100644 --- a/client/cmdlfnexwatch.c +++ b/client/cmdlfnexwatch.c @@ -12,25 +12,6 @@ static int CmdHelp(const char *Cmd); -int detectNexWatch(uint8_t *dest, size_t *size, bool *invert) { - - uint8_t preamble[28] = {0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t preamble_i[28] = {1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - // sanity check. - if (*size < sizeof(preamble) + 100) return -1; - - size_t startIdx = 0; - - if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), size, &startIdx)) { - // if didn't find preamble try again inverting - if (!preambleSearch(DemodBuffer, preamble_i, sizeof(preamble_i), size, &startIdx)) return -4; - *invert ^= 1; - } - - // size tests? - return (int) startIdx; -} - int CmdNexWatchDemod(const char *Cmd) { (void)Cmd; // Cmd is not used so far @@ -111,3 +92,27 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +int detectNexWatch(uint8_t *dest, size_t *size, bool *invert) { + + uint8_t preamble[28] = {0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint8_t preamble_i[28] = {1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + // sanity check. + if (*size < sizeof(preamble) + 100) return -1; + + size_t startIdx = 0; + + if (!preambleSearch(DemodBuffer, preamble, sizeof(preamble), size, &startIdx)) { + // if didn't find preamble try again inverting + if (!preambleSearch(DemodBuffer, preamble_i, sizeof(preamble_i), size, &startIdx)) return -4; + *invert ^= 1; + } + + // size tests? + return (int) startIdx; +} + +int demodNexWatch(void) { + return CmdNexWatchDemod(""); +} + diff --git a/client/cmdlfnexwatch.h b/client/cmdlfnexwatch.h index 7b08c1294..4a70761a4 100644 --- a/client/cmdlfnexwatch.h +++ b/client/cmdlfnexwatch.h @@ -23,8 +23,7 @@ #include "lfdemod.h" int CmdLFNEXWATCH(const char *Cmd); -int CmdNexWatchDemod(const char *Cmd); -int CmdNexWatchRead(const char *Cmd); +int demodNexWatch(void); int detectNexWatch(uint8_t *dest, size_t *size, bool *invert); #endif diff --git a/client/cmdlfnoralsy.c b/client/cmdlfnoralsy.c index 78727e23c..59cc4d70a 100644 --- a/client/cmdlfnoralsy.c +++ b/client/cmdlfnoralsy.c @@ -46,58 +46,6 @@ static uint8_t noralsy_chksum(uint8_t *bits, uint8_t len) { sum ^= bytebits_to_byte(bits + i, 4); return sum & 0x0F ; } -int getnoralsyBits(uint32_t id, uint16_t year, uint8_t *bits) { - //preamp - num_to_bytebits(0xBB0214FF, 32, bits); // --> Have seen 0xBB0214FF / 0xBB0314FF UNKNOWN - - //convert ID into BCD-format - id = DEC2BCD(id); - year = DEC2BCD(year); - year &= 0xFF; - - uint16_t sub1 = (id & 0xFFF0000) >> 16; - uint8_t sub2 = (id & 0x000FF00) >> 8; - uint8_t sub3 = (id & 0x00000FF); - - num_to_bytebits(sub1, 12, bits + 32); - num_to_bytebits(year, 8, bits + 44); - num_to_bytebits(0, 4, bits + 52); // --> UNKNOWN. Flag? - - num_to_bytebits(sub2, 8, bits + 56); - num_to_bytebits(sub3, 8, bits + 64); - - //chksum byte - uint8_t chksum = noralsy_chksum(bits + 32, 40); - num_to_bytebits(chksum, 4, bits + 72); - chksum = noralsy_chksum(bits, 76); - num_to_bytebits(chksum, 4, bits + 76); - return 1; -} - -// by iceman -// find Noralsy preamble in already demoded data -static int detectNoralsy(uint8_t *dest, size_t *size) { - if (*size < 96) return -1; //make sure buffer has data - size_t startIdx = 0; - uint8_t preamble[] = {1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -2; //preamble not found - if (*size != 96) return -3; //wrong demoded size - //return start position - return (int)startIdx; -} -/* -* -* 2520116 | BB0214FF2529900116360000 | 10111011 00000011 00010100 11111111 00100101 00101001 10010000 00000001 00010110 00110110 00000000 00000000 -* aaa*aaaaiiiYY*iiiicc---- **** iiiiiiii iiiiYYYY YYYY**** iiiiiiii iiiiiiii cccccccc -* -* a = fixed value BB0*14FF -* i = printed id, BCD-format -* Y = year -* c = checksum -* * = unknown -* -**/ //see ASKDemod for what args are accepted int CmdNoralsyDemod(const char *Cmd) { @@ -277,3 +225,60 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +int getnoralsyBits(uint32_t id, uint16_t year, uint8_t *bits) { + //preamp + num_to_bytebits(0xBB0214FF, 32, bits); // --> Have seen 0xBB0214FF / 0xBB0314FF UNKNOWN + + //convert ID into BCD-format + id = DEC2BCD(id); + year = DEC2BCD(year); + year &= 0xFF; + + uint16_t sub1 = (id & 0xFFF0000) >> 16; + uint8_t sub2 = (id & 0x000FF00) >> 8; + uint8_t sub3 = (id & 0x00000FF); + + num_to_bytebits(sub1, 12, bits + 32); + num_to_bytebits(year, 8, bits + 44); + num_to_bytebits(0, 4, bits + 52); // --> UNKNOWN. Flag? + + num_to_bytebits(sub2, 8, bits + 56); + num_to_bytebits(sub3, 8, bits + 64); + + //chksum byte + uint8_t chksum = noralsy_chksum(bits + 32, 40); + num_to_bytebits(chksum, 4, bits + 72); + chksum = noralsy_chksum(bits, 76); + num_to_bytebits(chksum, 4, bits + 76); + return 1; +} + +// by iceman +// find Noralsy preamble in already demoded data +int detectNoralsy(uint8_t *dest, size_t *size) { + if (*size < 96) return -1; //make sure buffer has data + size_t startIdx = 0; + uint8_t preamble[] = {1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -2; //preamble not found + if (*size != 96) return -3; //wrong demoded size + //return start position + return (int)startIdx; +} +/* +* +* 2520116 | BB0214FF2529900116360000 | 10111011 00000011 00010100 11111111 00100101 00101001 10010000 00000001 00010110 00110110 00000000 00000000 +* aaa*aaaaiiiYY*iiiicc---- **** iiiiiiii iiiiYYYY YYYY**** iiiiiiii iiiiiiii cccccccc +* +* a = fixed value BB0*14FF +* i = printed id, BCD-format +* Y = year +* c = checksum +* * = unknown +* +**/ + +int demodNoralsy(void) { + return CmdNoralsyDemod(""); +} diff --git a/client/cmdlfnoralsy.h b/client/cmdlfnoralsy.h index 622dfbbf1..b5a5cd914 100644 --- a/client/cmdlfnoralsy.h +++ b/client/cmdlfnoralsy.h @@ -23,11 +23,9 @@ #include "lfdemod.h" // parityTest int CmdLFNoralsy(const char *Cmd); -int CmdNoralsyDemod(const char *Cmd); -int CmdNoralsyRead(const char *Cmd); -int CmdNoralsyClone(const char *Cmd); -int CmdNoralsySim(const char *Cmd); +int demodNoralsy(void); +int detectNoralsy(uint8_t *dest, size_t *size); int getnoralsyBits(uint32_t id, uint16_t year, uint8_t *bits); #endif diff --git a/client/cmdlfpac.c b/client/cmdlfpac.c index 7c7742d95..36abe19b8 100644 --- a/client/cmdlfpac.c +++ b/client/cmdlfpac.c @@ -11,19 +11,6 @@ static int CmdHelp(const char *Cmd); -// by marshmellow -// find PAC preamble in already demoded data -int detectPac(uint8_t *dest, size_t *size) { - if (*size < 128) return -1; //make sure buffer has data - size_t startIdx = 0; - uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -2; //preamble not found - if (*size != 128) return -3; //wrong demoded size - //return start position - return (int)startIdx; -} - //see NRZDemod for what args are accepted int CmdPacDemod(const char *Cmd) { @@ -86,3 +73,21 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// by marshmellow +// find PAC preamble in already demoded data +int detectPac(uint8_t *dest, size_t *size) { + if (*size < 128) return -1; //make sure buffer has data + size_t startIdx = 0; + uint8_t preamble[] = {1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -2; //preamble not found + if (*size != 128) return -3; //wrong demoded size + //return start position + return (int)startIdx; +} + +int demodPac(void) { + return CmdPacDemod(""); +} + diff --git a/client/cmdlfpac.h b/client/cmdlfpac.h index 54b2b3366..f076121cd 100644 --- a/client/cmdlfpac.h +++ b/client/cmdlfpac.h @@ -22,9 +22,8 @@ #include "lfdemod.h" // preamble test int CmdLFPac(const char *Cmd); -int CmdPacRead(const char *Cmd); -int CmdPacDemod(const char *Cmd); +int demodPac(void); int detectPac(uint8_t *dest, size_t *size); #endif diff --git a/client/cmdlfparadox.c b/client/cmdlfparadox.c index ea247ecfa..72a0956fe 100644 --- a/client/cmdlfparadox.c +++ b/client/cmdlfparadox.c @@ -37,43 +37,6 @@ static int usage_lf_paradox_sim(void) { return 0; } -// loop to get raw paradox waveform then FSK demodulate the TAG ID from it -int detectParadox(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx) { - //make sure buffer has data - if (*size < 96 * 50) return -1; - - if (getSignalProperties()->isnoise) return -2; - - // FSK demodulator - *size = fskdemod(dest, *size, 50, 1, 10, 8, waveStartIdx); // paradox fsk2a - - //did we get a good demod? - if (*size < 96) return -3; - - // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1 - size_t startIdx = 0; - uint8_t preamble[] = {0, 0, 0, 0, 1, 1, 1, 1}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -4; //preamble not found - - size_t numStart = startIdx + sizeof(preamble); - // final loop, go over previously decoded FSK data and manchester decode into usable tag ID - for (size_t idx = numStart; (idx - numStart) < *size - sizeof(preamble); idx += 2) { - if (dest[idx] == dest[idx + 1]) - return -5; //not manchester data - - *hi2 = (*hi2 << 1) | (*hi >> 31); - *hi = (*hi << 1) | (*lo >> 31); - //Then, shift in a 0 or one into low - *lo <<= 1; - if (dest[idx] && !dest[idx + 1]) // 1 0 - *lo |= 1; - else // 0 1 - *lo |= 0; - } - return (int)startIdx; -} - //by marshmellow //Paradox Prox demod - FSK2a RF/50 with preamble of 00001111 (then manchester encoded) //print full Paradox Prox ID and some bit format details if found @@ -204,3 +167,45 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// loop to get raw paradox waveform then FSK demodulate the TAG ID from it +int detectParadox(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx) { + //make sure buffer has data + if (*size < 96 * 50) return -1; + + if (getSignalProperties()->isnoise) return -2; + + // FSK demodulator + *size = fskdemod(dest, *size, 50, 1, 10, 8, waveStartIdx); // paradox fsk2a + + //did we get a good demod? + if (*size < 96) return -3; + + // 00001111 bit pattern represent start of frame, 01 pattern represents a 0 and 10 represents a 1 + size_t startIdx = 0; + uint8_t preamble[] = {0, 0, 0, 0, 1, 1, 1, 1}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -4; //preamble not found + + size_t numStart = startIdx + sizeof(preamble); + // final loop, go over previously decoded FSK data and manchester decode into usable tag ID + for (size_t idx = numStart; (idx - numStart) < *size - sizeof(preamble); idx += 2) { + if (dest[idx] == dest[idx + 1]) + return -5; //not manchester data + + *hi2 = (*hi2 << 1) | (*hi >> 31); + *hi = (*hi << 1) | (*lo >> 31); + //Then, shift in a 0 or one into low + *lo <<= 1; + if (dest[idx] && !dest[idx + 1]) // 1 0 + *lo |= 1; + else // 0 1 + *lo |= 0; + } + return (int)startIdx; +} + +int demodParadox(void) { + return CmdParadoxDemod(""); +} + diff --git a/client/cmdlfparadox.h b/client/cmdlfparadox.h index 1b6211716..f7f4a4ffe 100644 --- a/client/cmdlfparadox.h +++ b/client/cmdlfparadox.h @@ -9,11 +9,7 @@ #ifndef CMDLFPARADOX_H__ #define CMDLFPARADOX_H__ int CmdLFParadox(const char *Cmd); -int CmdParadoxDemod(const char *Cmd); -int CmdParadoxRead(const char *Cmd); - -//int CmdParadoxClone(const char *Cmd); -int CmdParadoxSim(const char *Cmd); +int demodParadox(void); int detectParadox(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx); #endif diff --git a/client/cmdlfpcf7931.h b/client/cmdlfpcf7931.h index 6489ebecf..419386956 100644 --- a/client/cmdlfpcf7931.h +++ b/client/cmdlfpcf7931.h @@ -24,8 +24,4 @@ int pcf7931_printConfig(void); int CmdLFPCF7931(const char *Cmd); -int CmdLFPCF7931Read(const char *Cmd); -int CmdLFPCF7931Write(const char *Cmd); -int CmdLFPCF7931Config(const char *Cmd); - #endif diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 77a217bf7..8931b31d7 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -40,6 +40,145 @@ static int usage_lf_presco_sim(void) { return 0; } +//see ASKDemod for what args are accepted +int CmdPrescoDemod(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + bool st = true; + if (!ASKDemod_ext("32 0 0 0 0 a", false, false, 1, &st)) { + PrintAndLogEx(DEBUG, "DEBUG: Error Presco ASKDemod failed"); + return 0; + } + size_t size = DemodBufferLen; + int ans = detectPresco(DemodBuffer, &size); + if (ans < 0) { + if (ans == -1) + PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: too few bits found"); + else if (ans == -2) + PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: preamble not found"); + else if (ans == -3) + PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: Size not correct: %d", size); + else + PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: ans: %d", ans); + return 0; + } + setDemodBuff(DemodBuffer, 128, ans); + setClockGrid(g_DemodClock, g_DemodStartIdx + (ans * g_DemodClock)); + + //got a good demod + uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); + uint32_t raw2 = bytebits_to_byte(DemodBuffer + 32, 32); + uint32_t raw3 = bytebits_to_byte(DemodBuffer + 64, 32); + uint32_t raw4 = bytebits_to_byte(DemodBuffer + 96, 32); + uint32_t cardid = raw4; + PrintAndLogEx(SUCCESS, "Presco Tag Found: Card ID %08X, Raw: %08X%08X%08X%08X", cardid, raw1, raw2, raw3, raw4); + + uint32_t sitecode = 0, usercode = 0, fullcode = 0; + bool Q5 = false; + char cmd[12] = {0}; + sprintf(cmd, "H %08X", cardid); + getWiegandFromPresco(cmd, &sitecode, &usercode, &fullcode, &Q5); + PrintAndLogEx(SUCCESS, "SiteCode %u, UserCode %u, FullCode, %08X", sitecode, usercode, fullcode); + return 1; +} + +//see ASKDemod for what args are accepted +int CmdPrescoRead(const char *Cmd) { + // Presco Number: 123456789 --> Sitecode 30 | usercode 8665 + lf_read(true, 12000); + return CmdPrescoDemod(Cmd); +} + +// takes base 12 ID converts to hex +// Or takes 8 digit hex ID +int CmdPrescoClone(const char *Cmd) { + + bool Q5 = false; + uint32_t sitecode = 0, usercode = 0, fullcode = 0; + uint32_t blocks[5] = {T55x7_MODULATION_MANCHESTER | T55x7_BITRATE_RF_32 | 4 << T55x7_MAXBLOCK_SHIFT | T55x7_ST_TERMINATOR, 0, 0, 0, 0}; + + // get wiegand from printed number. + if (getWiegandFromPresco(Cmd, &sitecode, &usercode, &fullcode, &Q5) == -1) return usage_lf_presco_clone(); + + if (Q5) + blocks[0] = T5555_MODULATION_MANCHESTER | T5555_SET_BITRATE(32) | 4 << T5555_MAXBLOCK_SHIFT | T5555_ST_TERMINATOR; + + if ((sitecode & 0xFF) != sitecode) { + sitecode &= 0xFF; + PrintAndLogEx(INFO, "Facility-Code Truncated to 8-bits (Presco): %u", sitecode); + } + + if ((usercode & 0xFFFF) != usercode) { + usercode &= 0xFFFF; + PrintAndLogEx(INFO, "Card Number Truncated to 16-bits (Presco): %u", usercode); + } + + blocks[1] = 0x10D00000; //preamble + blocks[2] = 0x00000000; + blocks[3] = 0x00000000; + blocks[4] = fullcode; + + PrintAndLogEx(INFO, "Preparing to clone Presco to T55x7 with SiteCode: %u, UserCode: %u, FullCode: %08x", sitecode, usercode, fullcode); + print_blocks(blocks, 5); + + UsbCommand resp; + UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {0, 0, 0}, {{0}}}; + + for (uint8_t i = 0; i < 5; i++) { + c.arg[0] = blocks[i]; + c.arg[1] = i; + clearCommandBuffer(); + SendCommand(&c); + if (!WaitForResponseTimeout(CMD_ACK, &resp, T55XX_WRITE_TIMEOUT)) { + PrintAndLogEx(WARNING, "Error occurred, device did not respond during write operation."); + return -1; + } + } + return 0; +} + +// takes base 12 ID converts to hex +// Or takes 8 digit hex ID +int CmdPrescoSim(const char *Cmd) { + uint32_t sitecode = 0, usercode = 0, fullcode = 0; + bool Q5 = false; + // get wiegand from printed number. + if (getWiegandFromPresco(Cmd, &sitecode, &usercode, &fullcode, &Q5) == -1) return usage_lf_presco_sim(); + + uint8_t clk = 32, encoding = 1, separator = 1, invert = 0; + uint16_t arg1, arg2; + size_t size = 128; + arg1 = clk << 8 | encoding; + arg2 = invert << 8 | separator; + + PrintAndLogEx(SUCCESS, "Simulating Presco - SiteCode: %u, UserCode: %u, FullCode: %08X", sitecode, usercode, fullcode); + + UsbCommand c = {CMD_ASK_SIM_TAG, {arg1, arg2, size}, {{0}}}; + getPrescoBits(fullcode, c.d.asBytes); + clearCommandBuffer(); + SendCommand(&c); + return 0; +} + +static command_t CommandTable[] = { + {"help", CmdHelp, 1, "This help"}, + {"read", CmdPrescoRead, 0, "Attempt to read and Extract tag data"}, + {"clone", CmdPrescoClone, 0, "clone presco tag"}, + {"sim", CmdPrescoSim, 0, "simulate presco tag"}, + {NULL, NULL, 0, NULL} +}; + +int CmdLFPresco(const char *Cmd) { + clearCommandBuffer(); + CmdsParse(CommandTable, Cmd); + return 0; +} + +int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return 0; +} + // find presco preamble 0x10D in already demoded data int detectPresco(uint8_t *dest, size_t *size) { if (*size < 128 * 2) return -1; //make sure buffer has data @@ -53,7 +192,7 @@ int detectPresco(uint8_t *dest, size_t *size) { } // convert base 12 ID to sitecode & usercode & 8 bit other unknown code -int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5) { +int getWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5) { uint8_t val = 0; bool hex = false, errors = false; @@ -116,7 +255,7 @@ int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode } // calc not certain - intended to get bitstream for programming / sim -int GetPrescoBits(uint32_t fullcode, uint8_t *prescoBits) { +int getPrescoBits(uint32_t fullcode, uint8_t *prescoBits) { num_to_bytebits(0x10D00000, 32, prescoBits); num_to_bytebits(0x00000000, 32, prescoBits + 32); num_to_bytebits(0x00000000, 32, prescoBits + 64); @@ -124,141 +263,7 @@ int GetPrescoBits(uint32_t fullcode, uint8_t *prescoBits) { return 1; } -//see ASKDemod for what args are accepted -int CmdPrescoDemod(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - bool st = true; - if (!ASKDemod_ext("32 0 0 0 0 a", false, false, 1, &st)) { - PrintAndLogEx(DEBUG, "DEBUG: Error Presco ASKDemod failed"); - return 0; - } - size_t size = DemodBufferLen; - int ans = detectPresco(DemodBuffer, &size); - if (ans < 0) { - if (ans == -1) - PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: too few bits found"); - else if (ans == -2) - PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: preamble not found"); - else if (ans == -3) - PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: Size not correct: %d", size); - else - PrintAndLogEx(DEBUG, "DEBUG: Error - Presco: ans: %d", ans); - return 0; - } - setDemodBuff(DemodBuffer, 128, ans); - setClockGrid(g_DemodClock, g_DemodStartIdx + (ans * g_DemodClock)); - - //got a good demod - uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); - uint32_t raw2 = bytebits_to_byte(DemodBuffer + 32, 32); - uint32_t raw3 = bytebits_to_byte(DemodBuffer + 64, 32); - uint32_t raw4 = bytebits_to_byte(DemodBuffer + 96, 32); - uint32_t cardid = raw4; - PrintAndLogEx(SUCCESS, "Presco Tag Found: Card ID %08X, Raw: %08X%08X%08X%08X", cardid, raw1, raw2, raw3, raw4); - - uint32_t sitecode = 0, usercode = 0, fullcode = 0; - bool Q5 = false; - char cmd[12] = {0}; - sprintf(cmd, "H %08X", cardid); - GetWiegandFromPresco(cmd, &sitecode, &usercode, &fullcode, &Q5); - PrintAndLogEx(SUCCESS, "SiteCode %u, UserCode %u, FullCode, %08X", sitecode, usercode, fullcode); - return 1; +int demodPresco(void) { + return CmdPrescoDemod(""); } -//see ASKDemod for what args are accepted -int CmdPrescoRead(const char *Cmd) { - // Presco Number: 123456789 --> Sitecode 30 | usercode 8665 - lf_read(true, 12000); - return CmdPrescoDemod(Cmd); -} - -// takes base 12 ID converts to hex -// Or takes 8 digit hex ID -int CmdPrescoClone(const char *Cmd) { - - bool Q5 = false; - uint32_t sitecode = 0, usercode = 0, fullcode = 0; - uint32_t blocks[5] = {T55x7_MODULATION_MANCHESTER | T55x7_BITRATE_RF_32 | 4 << T55x7_MAXBLOCK_SHIFT | T55x7_ST_TERMINATOR, 0, 0, 0, 0}; - - // get wiegand from printed number. - if (GetWiegandFromPresco(Cmd, &sitecode, &usercode, &fullcode, &Q5) == -1) return usage_lf_presco_clone(); - - if (Q5) - blocks[0] = T5555_MODULATION_MANCHESTER | T5555_SET_BITRATE(32) | 4 << T5555_MAXBLOCK_SHIFT | T5555_ST_TERMINATOR; - - if ((sitecode & 0xFF) != sitecode) { - sitecode &= 0xFF; - PrintAndLogEx(INFO, "Facility-Code Truncated to 8-bits (Presco): %u", sitecode); - } - - if ((usercode & 0xFFFF) != usercode) { - usercode &= 0xFFFF; - PrintAndLogEx(INFO, "Card Number Truncated to 16-bits (Presco): %u", usercode); - } - - blocks[1] = 0x10D00000; //preamble - blocks[2] = 0x00000000; - blocks[3] = 0x00000000; - blocks[4] = fullcode; - - PrintAndLogEx(INFO, "Preparing to clone Presco to T55x7 with SiteCode: %u, UserCode: %u, FullCode: %08x", sitecode, usercode, fullcode); - print_blocks(blocks, 5); - - UsbCommand resp; - UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {0, 0, 0}, {{0}}}; - - for (uint8_t i = 0; i < 5; i++) { - c.arg[0] = blocks[i]; - c.arg[1] = i; - clearCommandBuffer(); - SendCommand(&c); - if (!WaitForResponseTimeout(CMD_ACK, &resp, T55XX_WRITE_TIMEOUT)) { - PrintAndLogEx(WARNING, "Error occurred, device did not respond during write operation."); - return -1; - } - } - return 0; -} - -// takes base 12 ID converts to hex -// Or takes 8 digit hex ID -int CmdPrescoSim(const char *Cmd) { - uint32_t sitecode = 0, usercode = 0, fullcode = 0; - bool Q5 = false; - // get wiegand from printed number. - if (GetWiegandFromPresco(Cmd, &sitecode, &usercode, &fullcode, &Q5) == -1) return usage_lf_presco_sim(); - - uint8_t clk = 32, encoding = 1, separator = 1, invert = 0; - uint16_t arg1, arg2; - size_t size = 128; - arg1 = clk << 8 | encoding; - arg2 = invert << 8 | separator; - - PrintAndLogEx(SUCCESS, "Simulating Presco - SiteCode: %u, UserCode: %u, FullCode: %08X", sitecode, usercode, fullcode); - - UsbCommand c = {CMD_ASK_SIM_TAG, {arg1, arg2, size}, {{0}}}; - GetPrescoBits(fullcode, c.d.asBytes); - clearCommandBuffer(); - SendCommand(&c); - return 0; -} - -static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help"}, - {"read", CmdPrescoRead, 0, "Attempt to read and Extract tag data"}, - {"clone", CmdPrescoClone, 0, "clone presco tag"}, - {"sim", CmdPrescoSim, 0, "simulate presco tag"}, - {NULL, NULL, 0, NULL} -}; - -int CmdLFPresco(const char *Cmd) { - clearCommandBuffer(); - CmdsParse(CommandTable, Cmd); - return 0; -} - -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return 0; -} diff --git a/client/cmdlfpresco.h b/client/cmdlfpresco.h index fec6fc620..1f101a13c 100644 --- a/client/cmdlfpresco.h +++ b/client/cmdlfpresco.h @@ -22,13 +22,11 @@ #include "lfdemod.h" // parityTest int CmdLFPresco(const char *Cmd); -int CmdPrescoRead(const char *Cmd); -int CmdPrescoDemod(const char *Cmd); -int CmdPrescoClone(const char *Cmd); -int CmdPrescoSim(const char *Cmd); +int demodPresco(void); int detectPresco(uint8_t *dest, size_t *size); -int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5); +int getPrescoBits(uint32_t fullcode, uint8_t *prescoBits); +int getWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5); #endif diff --git a/client/cmdlfpyramid.c b/client/cmdlfpyramid.c index 03e900bf6..44cbdeded 100644 --- a/client/cmdlfpyramid.c +++ b/client/cmdlfpyramid.c @@ -45,63 +45,6 @@ static int usage_lf_pyramid_sim(void) { return 0; } -// by marshmellow -// FSK Demod then try to locate a Farpointe Data (pyramid) ID -int detectPyramid(uint8_t *dest, size_t *size, int *waveStartIdx) { - //make sure buffer has data - if (*size < 128 * 50) return -1; - - //test samples are not just noise - if (getSignalProperties()->isnoise) return -2; - - // FSK demodulator RF/50 FSK 10,8 - *size = fskdemod(dest, *size, 50, 1, 10, 8, waveStartIdx); // pyramid fsk2 - - //did we get a good demod? - if (*size < 128) return -3; - - size_t startIdx = 0; - uint8_t preamble[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -4; //preamble not found - - // wrong size? (between to preambles) - if (*size != 128) return -5; - - return (int)startIdx; -} - -// Works for 26bits. -static int GetPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) { - - uint8_t pre[128]; - memset(pre, 0x00, sizeof(pre)); - - // format start bit - pre[79] = 1; - - // Get 26 wiegand from FacilityCode, CardNumber - uint8_t wiegand[24]; - memset(wiegand, 0x00, sizeof(wiegand)); - num_to_bytebits(fc, 8, wiegand); - num_to_bytebits(cn, 16, wiegand + 8); - - // add wiegand parity bits (dest, source, len) - wiegand_add_parity(pre + 80, wiegand, 24); - - // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) - addParity(pre + 8, pyramidBits + 8, 102, 8, 1); - - // add checksum - uint8_t csBuff[13]; - for (uint8_t i = 0; i < 13; i++) - csBuff[i] = bytebits_to_byte(pyramidBits + 16 + (i * 8), 8); - - uint32_t crc = CRC8Maxim(csBuff, 13); - num_to_bytebits(crc, 8, pyramidBits + 120); - return 1; -} - //by marshmellow //Pyramid Prox demod - FSK RF/50 with preamble of 0000000000000001 (always a 128 bit data stream) //print full Farpointe Data/Pyramid Prox ID and some bit format details if found @@ -269,7 +212,7 @@ int CmdPyramidClone(const char *Cmd) { facilitycode = (fc & 0x000000FF); cardnumber = (cn & 0x0000FFFF); - if (!GetPyramidBits(facilitycode, cardnumber, bs)) { + if (!getPyramidBits(facilitycode, cardnumber, bs)) { PrintAndLogEx(WARNING, "Error with tag bitstream generation."); return 1; } @@ -327,7 +270,7 @@ int CmdPyramidSim(const char *Cmd) { facilitycode = (fc & 0x000000FF); cardnumber = (cn & 0x0000FFFF); - if (!GetPyramidBits(facilitycode, cardnumber, bs)) { + if (!getPyramidBits(facilitycode, cardnumber, bs)) { PrintAndLogEx(WARNING, "Error with tag bitstream generation."); return 1; } @@ -361,3 +304,65 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// Works for 26bits. +int getPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) { + + uint8_t pre[128]; + memset(pre, 0x00, sizeof(pre)); + + // format start bit + pre[79] = 1; + + // Get 26 wiegand from FacilityCode, CardNumber + uint8_t wiegand[24]; + memset(wiegand, 0x00, sizeof(wiegand)); + num_to_bytebits(fc, 8, wiegand); + num_to_bytebits(cn, 16, wiegand + 8); + + // add wiegand parity bits (dest, source, len) + wiegand_add_parity(pre + 80, wiegand, 24); + + // add paritybits (bitsource, dest, sourcelen, paritylen, parityType (odd, even,) + addParity(pre + 8, pyramidBits + 8, 102, 8, 1); + + // add checksum + uint8_t csBuff[13]; + for (uint8_t i = 0; i < 13; i++) + csBuff[i] = bytebits_to_byte(pyramidBits + 16 + (i * 8), 8); + + uint32_t crc = CRC8Maxim(csBuff, 13); + num_to_bytebits(crc, 8, pyramidBits + 120); + return 1; +} + +int demodPyramid(void) { + return CmdPyramidDemod(""); +} + +// by marshmellow +// FSK Demod then try to locate a Farpointe Data (pyramid) ID +int detectPyramid(uint8_t *dest, size_t *size, int *waveStartIdx) { + //make sure buffer has data + if (*size < 128 * 50) return -1; + + //test samples are not just noise + if (getSignalProperties()->isnoise) return -2; + + // FSK demodulator RF/50 FSK 10,8 + *size = fskdemod(dest, *size, 50, 1, 10, 8, waveStartIdx); // pyramid fsk2 + + //did we get a good demod? + if (*size < 128) return -3; + + size_t startIdx = 0; + uint8_t preamble[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -4; //preamble not found + + // wrong size? (between to preambles) + if (*size != 128) return -5; + + return (int)startIdx; +} + diff --git a/client/cmdlfpyramid.h b/client/cmdlfpyramid.h index bb22310b2..009bec3ce 100644 --- a/client/cmdlfpyramid.h +++ b/client/cmdlfpyramid.h @@ -23,11 +23,9 @@ #include "crc.h" int CmdLFPyramid(const char *Cmd); -int CmdPyramidDemod(const char *Cmd); -int CmdPyramidRead(const char *Cmd); -int CmdPyramidClone(const char *Cmd); -int CmdPyramidSim(const char *Cmd); +int demodPyramid(void); int detectPyramid(uint8_t *dest, size_t *size, int *waveStartIdx); +int getPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits); #endif diff --git a/client/cmdlfsecurakey.c b/client/cmdlfsecurakey.c index a3679daaf..fab8d425b 100644 --- a/client/cmdlfsecurakey.c +++ b/client/cmdlfsecurakey.c @@ -11,19 +11,6 @@ static int CmdHelp(const char *Cmd); -// by marshmellow -// find Securakey preamble in already demoded data -static int detectSecurakey(uint8_t *dest, size_t *size) { - if (*size < 96) return -1; //make sure buffer has data - size_t startIdx = 0; - uint8_t preamble[] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -2; //preamble not found - if (*size != 96) return -3; //wrong demoded size - //return start position - return (int)startIdx; -} - //see ASKDemod for what args are accepted int CmdSecurakeyDemod(const char *Cmd) { (void)Cmd; // Cmd is not used so far @@ -132,3 +119,21 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// by marshmellow +// find Securakey preamble in already demoded data +int detectSecurakey(uint8_t *dest, size_t *size) { + if (*size < 96) return -1; //make sure buffer has data + size_t startIdx = 0; + uint8_t preamble[] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -2; //preamble not found + if (*size != 96) return -3; //wrong demoded size + //return start position + return (int)startIdx; +} + +int demodSecurakey(void) { + return CmdSecurakeyDemod(""); +} + diff --git a/client/cmdlfsecurakey.h b/client/cmdlfsecurakey.h index bdeae02b7..6a84d2046 100644 --- a/client/cmdlfsecurakey.h +++ b/client/cmdlfsecurakey.h @@ -25,10 +25,9 @@ #include "parity.h" // for wiegand parity test int CmdLFSecurakey(const char *Cmd); -//int CmdSecurakeyClone(const char *Cmd); -//int CmdSecurakeySim(const char *Cmd); -int CmdSecurakeyRead(const char *Cmd); -int CmdSecurakeyDemod(const char *Cmd); + +int demodSecurakey(void); +int detectSecurakey(uint8_t *dest, size_t *size); #endif diff --git a/client/cmdlft55xx.h b/client/cmdlft55xx.h index a38b5725f..56fc942fd 100644 --- a/client/cmdlft55xx.h +++ b/client/cmdlft55xx.h @@ -139,17 +139,6 @@ void Set_t55xx_Config(t55xx_conf_block_t conf); int CmdLFT55XX(const char *Cmd); -int CmdT55xxChk(const char *Cmd); -int CmdT55xxBruteForce(const char *Cmd); -int CmdT55xxSetConfig(const char *Cmd); -int CmdT55xxReadBlock(const char *Cmd); -int CmdT55xxWriteBlock(const char *Cmd); -int CmdT55xxReadTrace(const char *Cmd); -int CmdT55xxInfo(const char *Cmd); -int CmdT55xxDetect(const char *Cmd); -int CmdResetRead(const char *Cmd); -int CmdT55xxWipe(const char *Cmd); - char *GetPskCfStr(uint32_t id, bool q5); char *GetBitRateStr(uint32_t id, bool xmode); char *GetSaferStr(uint32_t id); diff --git a/client/cmdlfti.c b/client/cmdlfti.c index 129f8d69b..3c4309266 100644 --- a/client/cmdlfti.c +++ b/client/cmdlfti.c @@ -318,3 +318,8 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +int demodTI(void) { + return CmdTIDemod(""); +} + diff --git a/client/cmdlfti.h b/client/cmdlfti.h index e4bbc3a0d..bb4922f78 100644 --- a/client/cmdlfti.h +++ b/client/cmdlfti.h @@ -13,8 +13,5 @@ int CmdLFTI(const char *Cmd); -int CmdTIDemod(const char *Cmd); -int CmdTIRead(const char *Cmd); -int CmdTIWrite(const char *Cmd); - +int demodTI(void); #endif diff --git a/client/cmdlfviking.c b/client/cmdlfviking.c index df23091ed..48ed3148a 100644 --- a/client/cmdlfviking.c +++ b/client/cmdlfviking.c @@ -37,38 +37,6 @@ static int usage_lf_viking_sim(void) { return 0; } -// calc checksum -static uint64_t getVikingBits(uint32_t id) { - uint8_t checksum = ((id >> 24) & 0xFF) ^ ((id >> 16) & 0xFF) ^ ((id >> 8) & 0xFF) ^ (id & 0xFF) ^ 0xF2 ^ 0xA8; - uint64_t ret = (uint64_t)0xF2 << 56; - ret |= (uint64_t)id << 8; - ret |= checksum; - return ret; -} -// by marshmellow -// find viking preamble 0xF200 in already demoded data -int detectViking(uint8_t *dest, size_t *size) { - //make sure buffer has data - if (*size < 64 * 2) return -2; - size_t startIdx = 0; - uint8_t preamble[] = {1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -4; //preamble not found - - uint32_t checkCalc = bytebits_to_byte(dest + startIdx, 8) ^ - bytebits_to_byte(dest + startIdx + 8, 8) ^ - bytebits_to_byte(dest + startIdx + 16, 8) ^ - bytebits_to_byte(dest + startIdx + 24, 8) ^ - bytebits_to_byte(dest + startIdx + 32, 8) ^ - bytebits_to_byte(dest + startIdx + 40, 8) ^ - bytebits_to_byte(dest + startIdx + 48, 8) ^ - bytebits_to_byte(dest + startIdx + 56, 8); - if (checkCalc != 0xA8) return -5; - if (*size != 64) return -6; - //return start position - return (int)startIdx; -} - //by marshmellow //see ASKDemod for what args are accepted int CmdVikingDemod(const char *Cmd) { @@ -178,3 +146,40 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// calc checksum +uint64_t getVikingBits(uint32_t id) { + uint8_t checksum = ((id >> 24) & 0xFF) ^ ((id >> 16) & 0xFF) ^ ((id >> 8) & 0xFF) ^ (id & 0xFF) ^ 0xF2 ^ 0xA8; + uint64_t ret = (uint64_t)0xF2 << 56; + ret |= (uint64_t)id << 8; + ret |= checksum; + return ret; +} +// by marshmellow +// find viking preamble 0xF200 in already demoded data +int detectViking(uint8_t *dest, size_t *size) { + //make sure buffer has data + if (*size < 64 * 2) return -2; + size_t startIdx = 0; + uint8_t preamble[] = {1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -4; //preamble not found + + uint32_t checkCalc = bytebits_to_byte(dest + startIdx, 8) ^ + bytebits_to_byte(dest + startIdx + 8, 8) ^ + bytebits_to_byte(dest + startIdx + 16, 8) ^ + bytebits_to_byte(dest + startIdx + 24, 8) ^ + bytebits_to_byte(dest + startIdx + 32, 8) ^ + bytebits_to_byte(dest + startIdx + 40, 8) ^ + bytebits_to_byte(dest + startIdx + 48, 8) ^ + bytebits_to_byte(dest + startIdx + 56, 8); + if (checkCalc != 0xA8) return -5; + if (*size != 64) return -6; + //return start position + return (int)startIdx; +} + +int demodViking(void) { + return CmdVikingDemod(""); +} + diff --git a/client/cmdlfviking.h b/client/cmdlfviking.h index 1ee7b6511..2baea6364 100644 --- a/client/cmdlfviking.h +++ b/client/cmdlfviking.h @@ -23,12 +23,9 @@ int CmdLFViking(const char *Cmd); -int CmdVikingDemod(const char *Cmd); -int CmdVikingRead(const char *Cmd); -int CmdVikingClone(const char *Cmd); -int CmdVikingSim(const char *Cmd); - +int demodViking(void); int detectViking(uint8_t *dest, size_t *size); +uint64_t getVikingBits(uint32_t id); #endif diff --git a/client/cmdlfvisa2000.c b/client/cmdlfvisa2000.c index 9dfad9a40..b808a1042 100644 --- a/client/cmdlfvisa2000.c +++ b/client/cmdlfvisa2000.c @@ -69,19 +69,6 @@ static uint8_t visa_parity(uint32_t id) { return par; } -// by iceman -// find Visa2000 preamble in already demoded data -int detectVisa2k(uint8_t *dest, size_t *size) { - if (*size < 96) return -1; //make sure buffer has data - size_t startIdx = 0; - uint8_t preamble[] = {0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0}; - if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) - return -2; //preamble not found - if (*size != 96) return -3; //wrong demoded size - //return start position - return (int)startIdx; -} - /** * * 56495332 00096ebd 00000077 —> tag id 618173 @@ -243,3 +230,21 @@ int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; } + +// by iceman +// find Visa2000 preamble in already demoded data +int detectVisa2k(uint8_t *dest, size_t *size) { + if (*size < 96) return -1; //make sure buffer has data + size_t startIdx = 0; + uint8_t preamble[] = {0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0}; + if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx)) + return -2; //preamble not found + if (*size != 96) return -3; //wrong demoded size + //return start position + return (int)startIdx; +} + +int demodVisa2k(void) { + return CmdVisa2kDemod(""); +} + diff --git a/client/cmdlfvisa2000.h b/client/cmdlfvisa2000.h index 36fef841e..15d626f6c 100644 --- a/client/cmdlfvisa2000.h +++ b/client/cmdlfvisa2000.h @@ -23,12 +23,8 @@ #include "lfdemod.h" // parityTest int CmdLFVisa2k(const char *Cmd); -int CmdVisa2kDemod(const char *Cmd); -int CmdVisa2kRead(const char *Cmd); -int CmdVisa2kClone(const char *Cmd); -int CmdVisa2kSim(const char *Cmd); - int getvisa2kBits(uint64_t fullcode, uint8_t *bits); +int demodVisa2k(void); int detectVisa2k(uint8_t *dest, size_t *size); #endif diff --git a/client/cmdmain.c b/client/cmdmain.c index b3f19af5c..9a1fb7108 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -11,9 +11,28 @@ #include "cmdmain.h" static int CmdHelp(const char *Cmd); -static int CmdQuit(const char *Cmd); -static int CmdRev(const char *Cmd); -static int CmdRem(const char *Cmd); + +static int CmdRem(const char *Cmd) { + char buf[22]; + + memset(buf, 0x00, sizeof(buf)); + struct tm *curTime; + time_t now = time(0); + curTime = gmtime(&now); + strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", curTime); // ISO8601 + PrintAndLogEx(NORMAL, "%s remark: %s", buf, Cmd); + return 0; +} + +static int CmdQuit(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + return 99; +} + +static int CmdRev(const char *Cmd) { + CmdCrc(Cmd); + return 0; +} static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help. Use ' help' for details of a particular command."}, @@ -38,38 +57,12 @@ static command_t CommandTable[] = { {NULL, NULL, 0, NULL} }; -command_t *getTopLevelCommandTable() { - return CommandTable; -} - -int CmdRem(const char *Cmd) { - char buf[22]; - - memset(buf, 0x00, sizeof(buf)); - struct tm *curTime; - time_t now = time(0); - curTime = gmtime(&now); - strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", curTime); // ISO8601 - PrintAndLogEx(NORMAL, "%s remark: %s", buf, Cmd); - return 0; -} - -int CmdHelp(const char *Cmd) { +static int CmdHelp(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdsHelp(CommandTable); return 0; } -int CmdQuit(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - return 99; -} - -int CmdRev(const char *Cmd) { - CmdCrc(Cmd); - return 0; -} - //----------------------------------------------------------------------------- // Entry point into our code: called whenever the user types a command and // then presses Enter, which the full command line that they typed. @@ -77,3 +70,8 @@ int CmdRev(const char *Cmd) { int CommandReceived(char *Cmd) { return CmdsParse(CommandTable, Cmd); } + +command_t *getTopLevelCommandTable() { + return CommandTable; +} + diff --git a/client/cmdscript.c b/client/cmdscript.c index b4e2f4bf2..bcaf581bf 100644 --- a/client/cmdscript.c +++ b/client/cmdscript.c @@ -67,7 +67,7 @@ static bool endsWith(const char *base, const char *str) { * generate a file listing of the script-directory for files * ending with .lua */ -int CmdScriptList(const char *Cmd) { +static int CmdScriptList(const char *Cmd) { (void)Cmd; // Cmd is not used so far char const *exedir = get_my_executable_directory(); @@ -102,7 +102,7 @@ int CmdScriptList(const char *Cmd) { * @param argv * @return */ -int CmdScriptRun(const char *Cmd) { +static int CmdScriptRun(const char *Cmd) { // create new Lua state lua_State *lua_state; lua_state = luaL_newstate(); @@ -173,6 +173,18 @@ static command_t CommandTable[] = { {NULL, NULL, 0, NULL} }; +/** + * Shows some basic help + * @brief CmdHelp + * @param Cmd + * @return + */ +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + PrintAndLogEx(NORMAL, "This is a feature to run Lua-scripts. You can place lua-scripts within the scripts/-folder. "); + return 0; +} + /** * Finds a matching script-file * @brief CmdScript @@ -185,14 +197,3 @@ int CmdScript(const char *Cmd) { return 0; } -/** - * Shows some basic help - * @brief CmdHelp - * @param Cmd - * @return - */ -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - PrintAndLogEx(NORMAL, "This is a feature to run Lua-scripts. You can place lua-scripts within the scripts/-folder. "); - return 0; -} diff --git a/client/cmdscript.h b/client/cmdscript.h index 55d735c0a..866b09e99 100644 --- a/client/cmdscript.h +++ b/client/cmdscript.h @@ -13,6 +13,4 @@ int CmdScript(const char *Cmd); -int CmdScriptList(const char *Cmd); -int CmdScriptRun(const char *Cmd); #endif diff --git a/client/cmdsmartcard.c b/client/cmdsmartcard.c index c0a41d786..a483e424f 100644 --- a/client/cmdsmartcard.c +++ b/client/cmdsmartcard.c @@ -308,37 +308,6 @@ static int PrintATR(uint8_t *atr, size_t atrlen) { return 0; } -bool smart_select(bool silent, smart_card_atr_t *atr) { - if (atr) - memset(atr, 0, sizeof(smart_card_atr_t)); - - UsbCommand c = {CMD_SMART_ATR, {0, 0, 0}, {{0}}}; - clearCommandBuffer(); - SendCommand(&c); - UsbCommand resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { - if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return false; - } - - uint8_t isok = resp.arg[0] & 0xFF; - if (!isok) { - if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); - return false; - } - - smart_card_atr_t card; - memcpy(&card, (smart_card_atr_t *)resp.d.asBytes, sizeof(smart_card_atr_t)); - - if (atr) - memcpy(atr, &card, sizeof(smart_card_atr_t)); - - if (!silent) - PrintAndLogEx(INFO, "ISO7816-3 ATR : %s", sprint_hex(card.atr, card.atr_len)); - - return true; -} - static int smart_wait(uint8_t *data, bool silent) { UsbCommand resp; if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { @@ -420,7 +389,7 @@ static int smart_response(uint8_t *data) { return smart_responseEx(data, false); } -int CmdSmartRaw(const char *Cmd) { +static int CmdSmartRaw(const char *Cmd) { int hexlen = 0; bool active = false; @@ -536,47 +505,7 @@ int CmdSmartRaw(const char *Cmd) { return 0; } -int ExchangeAPDUSC(uint8_t *datain, int datainlen, bool activateCard, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen) { - *dataoutlen = 0; - - if (activateCard) - smart_select(false, NULL); - - PrintAndLogEx(DEBUG, "APDU SC"); - - UsbCommand c = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}, {{0}}}; - if (activateCard) { - c.arg[0] |= SC_SELECT | SC_CONNECT; - } - memcpy(c.d.asBytes, datain, datainlen); - clearCommandBuffer(); - SendCommand(&c); - - int len = smart_responseEx(dataout, true); - - if (len < 0) { - return 1; - } - - // retry - if (len > 1 && dataout[len - 2] == 0x6c && datainlen > 4) { - UsbCommand c2 = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}, {{0}}}; - memcpy(c2.d.asBytes, datain, 5); - - // transfer length via T=0 - c2.d.asBytes[4] = dataout[len - 1]; - - clearCommandBuffer(); - SendCommand(&c2); - - len = smart_responseEx(dataout, true); - } - - *dataoutlen = len; - return 0; -} - -int CmdSmartUpgrade(const char *Cmd) { +static int CmdSmartUpgrade(const char *Cmd) { PrintAndLogEx(WARNING, "WARNING - Sim module firmware upgrade."); PrintAndLogEx(WARNING, "A dangerous command, do wrong and you could brick the sim module"); @@ -763,7 +692,7 @@ int CmdSmartUpgrade(const char *Cmd) { return 0; } -int CmdSmartInfo(const char *Cmd) { +static int CmdSmartInfo(const char *Cmd) { uint8_t cmdp = 0; bool errors = false, silent = false; @@ -838,7 +767,7 @@ int CmdSmartInfo(const char *Cmd) { return 0; } -int CmdSmartReader(const char *Cmd) { +static int CmdSmartReader(const char *Cmd) { uint8_t cmdp = 0; bool errors = false, silent = false; @@ -881,7 +810,7 @@ int CmdSmartReader(const char *Cmd) { return 0; } -int CmdSmartSetClock(const char *Cmd) { +static int CmdSmartSetClock(const char *Cmd) { uint8_t cmdp = 0; bool errors = false; uint8_t clock1 = 0; @@ -937,7 +866,7 @@ int CmdSmartSetClock(const char *Cmd) { return 0; } -int CmdSmartList(const char *Cmd) { +static int CmdSmartList(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdTraceList("7816"); return 0; @@ -1073,7 +1002,7 @@ static void smart_brute_options(bool decodeTLV) { free(buf); } -int CmdSmartBruteforceSFI(const char *Cmd) { +static int CmdSmartBruteforceSFI(const char *Cmd) { uint8_t cmdp = 0; bool errors = false, decodeTLV = false; //, useT0 = false; @@ -1229,14 +1158,86 @@ static command_t CommandTable[] = { {NULL, NULL, 0, NULL} }; +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return 0; +} + int CmdSmartcard(const char *Cmd) { clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); +int ExchangeAPDUSC(uint8_t *datain, int datainlen, bool activateCard, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen) { + *dataoutlen = 0; + + if (activateCard) + smart_select(false, NULL); + + PrintAndLogEx(DEBUG, "APDU SC"); + + UsbCommand c = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}, {{0}}}; + if (activateCard) { + c.arg[0] |= SC_SELECT | SC_CONNECT; + } + memcpy(c.d.asBytes, datain, datainlen); + clearCommandBuffer(); + SendCommand(&c); + + int len = smart_responseEx(dataout, true); + + if (len < 0) { + return 1; + } + + // retry + if (len > 1 && dataout[len - 2] == 0x6c && datainlen > 4) { + UsbCommand c2 = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}, {{0}}}; + memcpy(c2.d.asBytes, datain, 5); + + // transfer length via T=0 + c2.d.asBytes[4] = dataout[len - 1]; + + clearCommandBuffer(); + SendCommand(&c2); + + len = smart_responseEx(dataout, true); + } + + *dataoutlen = len; return 0; } + +bool smart_select(bool silent, smart_card_atr_t *atr) { + if (atr) + memset(atr, 0, sizeof(smart_card_atr_t)); + + UsbCommand c = {CMD_SMART_ATR, {0, 0, 0}, {{0}}}; + clearCommandBuffer(); + SendCommand(&c); + UsbCommand resp; + if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); + return false; + } + + uint8_t isok = resp.arg[0] & 0xFF; + if (!isok) { + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); + return false; + } + + smart_card_atr_t card; + memcpy(&card, (smart_card_atr_t *)resp.d.asBytes, sizeof(smart_card_atr_t)); + + if (atr) + memcpy(atr, &card, sizeof(smart_card_atr_t)); + + if (!silent) + PrintAndLogEx(INFO, "ISO7816-3 ATR : %s", sprint_hex(card.atr, card.atr_len)); + + return true; +} + diff --git a/client/cmdsmartcard.h b/client/cmdsmartcard.h index 54b832608..9032ab265 100644 --- a/client/cmdsmartcard.h +++ b/client/cmdsmartcard.h @@ -29,11 +29,6 @@ int CmdSmartcard(const char *Cmd); -int CmdSmartRaw(const char *Cmd); -int CmdSmartUpgrade(const char *Cmd); -int CmdSmartInfo(const char *Cmd); -int CmdSmartReader(const char *Cmd); - bool smart_select(bool silent, smart_card_atr_t *atr); int ExchangeAPDUSC(uint8_t *datain, int datainlen, bool activateCard, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); diff --git a/client/cmdtrace.c b/client/cmdtrace.c index df12ac420..a84daf646 100644 --- a/client/cmdtrace.c +++ b/client/cmdtrace.c @@ -507,6 +507,89 @@ static int SanityOfflineCheck( bool useTraceBuffer ){ } */ +static int CmdTraceLoad(const char *Cmd) { + + FILE *f = NULL; + char filename[FILE_PATH_SIZE]; + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_load(); + + param_getstr(Cmd, 0, filename, sizeof(filename)); + + if ((f = fopen(filename, "rb")) == NULL) { + PrintAndLogEx(FAILED, "Could not open file %s", filename); + return 0; + } + + // get filesize in order to malloc memory + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + if (fsize < 0) { + PrintAndLogEx(FAILED, "error, when getting filesize"); + fclose(f); + return 3; + } + if (fsize < 4) { + PrintAndLogEx(FAILED, "error, file is too small"); + fclose(f); + return 4; + } + + if (trace) + free(trace); + + trace = calloc(fsize, sizeof(uint8_t)); + if (!trace) { + PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); + fclose(f); + return 2; + } + + size_t bytes_read = fread(trace, 1, fsize, f); + traceLen = bytes_read; + fclose(f); + PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = %d bytes) loaded from file %s", traceLen, filename); + return 0; +} + +static int CmdTraceSave(const char *Cmd) { + + if (traceLen == 0) { + PrintAndLogEx(WARNING, "trace is empty, nothing to save"); + return 0; + } + + char filename[FILE_PATH_SIZE]; + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_save(); + + param_getstr(Cmd, 0, filename, sizeof(filename)); + saveFile(filename, "bin", trace, traceLen); + return 0; +} + +static command_t CommandTable[] = { + {"help", CmdHelp, 1, "This help"}, + {"list", CmdTraceList, 1, "List protocol data in trace buffer"}, + {"load", CmdTraceLoad, 1, "Load trace from file"}, + {"save", CmdTraceSave, 1, "Save trace buffer to file"}, + {NULL, NULL, 0, NULL} +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return 0; +} + +int CmdTrace(const char *Cmd) { + clearCommandBuffer(); + CmdsParse(CommandTable, Cmd); + return 0; +} + int CmdTraceList(const char *Cmd) { clearCommandBuffer(); @@ -644,85 +727,3 @@ int CmdTraceList(const char *Cmd) { return 0; } -int CmdTraceLoad(const char *Cmd) { - - FILE *f = NULL; - char filename[FILE_PATH_SIZE]; - char cmdp = tolower(param_getchar(Cmd, 0)); - if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_load(); - - param_getstr(Cmd, 0, filename, sizeof(filename)); - - if ((f = fopen(filename, "rb")) == NULL) { - PrintAndLogEx(FAILED, "Could not open file %s", filename); - return 0; - } - - // get filesize in order to malloc memory - fseek(f, 0, SEEK_END); - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); - - if (fsize < 0) { - PrintAndLogEx(FAILED, "error, when getting filesize"); - fclose(f); - return 3; - } - if (fsize < 4) { - PrintAndLogEx(FAILED, "error, file is too small"); - fclose(f); - return 4; - } - - if (trace) - free(trace); - - trace = calloc(fsize, sizeof(uint8_t)); - if (!trace) { - PrintAndLogEx(FAILED, "Cannot allocate memory for trace"); - fclose(f); - return 2; - } - - size_t bytes_read = fread(trace, 1, fsize, f); - traceLen = bytes_read; - fclose(f); - PrintAndLogEx(SUCCESS, "Recorded Activity (TraceLen = %d bytes) loaded from file %s", traceLen, filename); - return 0; -} - -int CmdTraceSave(const char *Cmd) { - - if (traceLen == 0) { - PrintAndLogEx(WARNING, "trace is empty, nothing to save"); - return 0; - } - - char filename[FILE_PATH_SIZE]; - char cmdp = tolower(param_getchar(Cmd, 0)); - if (strlen(Cmd) < 1 || cmdp == 'h') return usage_trace_save(); - - param_getstr(Cmd, 0, filename, sizeof(filename)); - saveFile(filename, "bin", trace, traceLen); - return 0; -} - -static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help"}, - {"list", CmdTraceList, 1, "List protocol data in trace buffer"}, - {"load", CmdTraceLoad, 1, "Load trace from file"}, - {"save", CmdTraceSave, 1, "Save trace buffer to file"}, - {NULL, NULL, 0, NULL} -}; - -int CmdTrace(const char *Cmd) { - clearCommandBuffer(); - CmdsParse(CommandTable, Cmd); - return 0; -} - -int CmdHelp(const char *Cmd) { - (void)Cmd; // Cmd is not used so far - CmdsHelp(CommandTable); - return 0; -} diff --git a/client/cmdtrace.h b/client/cmdtrace.h index 64e62cdd0..2f0125664 100644 --- a/client/cmdtrace.h +++ b/client/cmdtrace.h @@ -28,9 +28,6 @@ #include "loclass/fileutils.h" // for saveFile int CmdTrace(const char *Cmd); - int CmdTraceList(const char *Cmd); -int CmdTraceLoad(const char *Cmd); -int CmdTraceSave(const char *Cmd); #endif