From ded87056d41b6e1a13be76436cf0a6f33888bbf8 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Fri, 24 Jun 2022 22:26:10 +0300 Subject: [PATCH 01/24] `hf texkom` command --- client/CMakeLists.txt | 1 + client/Makefile | 1 + client/src/cmdhf.c | 2 ++ client/src/cmdhftexkom.c | 69 ++++++++++++++++++++++++++++++++++++++++ client/src/cmdhftexkom.h | 27 ++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 client/src/cmdhftexkom.c create mode 100644 client/src/cmdhftexkom.h diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index b86335c66..750c83c6b 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -294,6 +294,7 @@ set (TARGET_SOURCES ${PM3_ROOT}/client/src/cmdhfst25ta.c ${PM3_ROOT}/client/src/cmdhfthinfilm.c ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhftexkom.c ${PM3_ROOT}/client/src/cmdhfwaveshare.c ${PM3_ROOT}/client/src/cmdhw.c ${PM3_ROOT}/client/src/cmdlf.c diff --git a/client/Makefile b/client/Makefile index e2dd1a224..d4893b341 100644 --- a/client/Makefile +++ b/client/Makefile @@ -576,6 +576,7 @@ SRCS = mifare/aiddesfire.c \ cmdhfst25ta.c \ cmdhfthinfilm.c \ cmdhftopaz.c \ + cmdhftexkom.c \ cmdhfwaveshare.c \ cmdhw.c \ cmdlf.c \ diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index ccb697966..9ed214eac 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -47,6 +47,7 @@ #include "cmdhfseos.h" // SEOS #include "cmdhfst25ta.h" // ST25TA #include "cmdhfwaveshare.h" // Waveshare +#include "cmdhftexkom.h" // Texkom #include "cmdtrace.h" // trace list #include "ui.h" #include "proxgui.h" @@ -435,6 +436,7 @@ static command_t CommandTable[] = { {"st25ta", CmdHFST25TA, AlwaysAvailable, "{ ST25TA RFIDs... }"}, {"thinfilm", CmdHFThinfilm, AlwaysAvailable, "{ Thinfilm RFIDs... }"}, {"topaz", CmdHFTopaz, AlwaysAvailable, "{ TOPAZ (NFC Type 1) RFIDs... }"}, + {"texkom", CmdHFTexkom, AlwaysAvailable, "{ Texkom RFIDs... }"}, {"waveshare", CmdHFWaveshare, AlwaysAvailable, "{ Waveshare NFC ePaper... }"}, {"-----------", CmdHelp, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c new file mode 100644 index 000000000..54a1e47c7 --- /dev/null +++ b/client/src/cmdhftexkom.c @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// High frequency proximity cards from TEXCOM commands +//----------------------------------------------------------------------------- + +#include "cmdhftexkom.h" + +#include +#include +#include +#include "cliparser.h" +#include "cmdparser.h" // command_t +#include "comms.h" +#include "ui.h" +#include "cmdhf14a.h" + +static int CmdHFTexkomReader(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf texkom reader", + "Read a texkom tag", + "hf texkom reader"); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + +// uint8_t param = 0; +// SendCommandNG(CMD_HF_TEXKOM_READER, (uint8_t *)¶m, sizeof(uint8_t)); + + return PM3_SUCCESS; +} + + +static int CmdHelp(const char *Cmd); + +static command_t CommandTable[] = { + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"reader", CmdHFTexkomReader, IfPm3Iso14443a, "Act like a Texkom reader"}, + //{"sim", CmdHFTexkomSim, IfPm3Iso14443a, "Simulate a Texkom tag"}, + //{"write", CmdHFTexkomWrite, IfPm3Iso14443a, "Write a Texkom tag"}, + {NULL, NULL, 0, NULL} +}; + +static int CmdHelp(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + CmdsHelp(CommandTable); + return PM3_SUCCESS; +} + +int CmdHFTexkom(const char *Cmd) { + clearCommandBuffer(); + return CmdsParse(CommandTable, Cmd); +} diff --git a/client/src/cmdhftexkom.h b/client/src/cmdhftexkom.h new file mode 100644 index 000000000..9f4a3b32f --- /dev/null +++ b/client/src/cmdhftexkom.h @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// High frequency proximity cards from TEXCOM commands +//----------------------------------------------------------------------------- + +#ifndef CMDHFTEXCOM_H__ +#define CMDHFTEXCOM_H__ + +#include "common.h" +#include "pm3_cmd.h" + +int CmdHFTexkom(const char *Cmd); + +#endif \ No newline at end of file From 541c060a5d5834af53b861545f685272f8be9d8b Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 25 Jun 2022 00:36:42 +0300 Subject: [PATCH 02/24] hf read adc low level command --- armsrc/Makefile | 2 ++ armsrc/appmain.c | 10 ++++++++++ armsrc/hfops.c | 41 ++++++++++++++++++++++++++++++++++++++++ armsrc/hfops.h | 27 ++++++++++++++++++++++++++ client/src/cmdhftexkom.c | 4 ++-- common_arm/Makefile.hal | 3 +++ include/pm3_cmd.h | 1 + 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 armsrc/hfops.c create mode 100644 armsrc/hfops.h diff --git a/armsrc/Makefile b/armsrc/Makefile index 413570565..5505119b7 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -35,6 +35,7 @@ APP_CFLAGS = $(PLATFORM_DEFS) \ -ffunction-sections -fdata-sections SRC_LF = lfops.c lfsampling.c pcf7931.c lfdemod.c lfadc.c +SRC_HF = hfops.c SRC_ISO15693 = iso15693.c iso15693tools.c SRC_ISO14443a = iso14443a.c mifareutil.c mifarecmd.c epa.c mifaresim.c #UNUSED: mifaresniff.c @@ -132,6 +133,7 @@ THUMBSRC = start.c \ $(SRC_EM4x50) \ $(SRC_EM4x70) \ $(SRC_SPIFFS) \ + $(SRC_HF) \ $(SRC_ISO14443a) \ $(SRC_ISO14443b) \ $(SRC_CRAPTO1) \ diff --git a/armsrc/appmain.c b/armsrc/appmain.c index afcdc04ac..c28357108 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -33,6 +33,7 @@ #include "legicrf.h" #include "BigBuf.h" #include "iclass_cmd.h" +#include "hfops.h" #include "iso14443a.h" #include "iso14443b.h" #include "iso15693.h" @@ -1384,6 +1385,15 @@ static void PacketReceived(PacketCommandNG *packet) { } #endif +#ifdef WITH_GENERAL_HF + case CMD_HF_ACQ_RAW_ADC: { + uint32_t samplesCount = 0; + memcpy(&samplesCount, packet->data.asBytes, 4); + HfReadADC(samplesCount); + break; + } +#endif + #ifdef WITH_ISO14443a case CMD_HF_ISO14443A_PRINT_CONFIG: { printHf14aConfig(); diff --git a/armsrc/hfops.c b/armsrc/hfops.c new file mode 100644 index 000000000..180cca409 --- /dev/null +++ b/armsrc/hfops.c @@ -0,0 +1,41 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// HF general operations +//----------------------------------------------------------------------------- + +#include "hfops.h" + +#include "proxmark3_arm.h" +#include "cmd.h" +#include "BigBuf.h" +#include "fpgaloader.h" +#include "ticks.h" +#include "dbprint.h" +#include "util.h" +#include "commonutil.h" + + +int HfReadADC(uint32_t samplesCount) { + + + + + DbpString("HfReadADC " _GREEN_("success")); + + return 0; +} + + diff --git a/armsrc/hfops.h b/armsrc/hfops.h new file mode 100644 index 000000000..76ed4b8bc --- /dev/null +++ b/armsrc/hfops.h @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------- +// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// See LICENSE.txt for the text of the license. +//----------------------------------------------------------------------------- +// HF general operations +//----------------------------------------------------------------------------- + +#ifndef HFOPS_H +#define HFOPS_H + +#include "common.h" + +int HfReadADC(uint32_t samplesCount); + + +#endif \ No newline at end of file diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 54a1e47c7..51758af3e 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -40,8 +40,8 @@ static int CmdHFTexkomReader(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); CLIParserFree(ctx); -// uint8_t param = 0; -// SendCommandNG(CMD_HF_TEXKOM_READER, (uint8_t *)¶m, sizeof(uint8_t)); + uint32_t samplesCount = 40000; + SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t)); return PM3_SUCCESS; } diff --git a/common_arm/Makefile.hal b/common_arm/Makefile.hal index 62b99020d..68417eb60 100644 --- a/common_arm/Makefile.hal +++ b/common_arm/Makefile.hal @@ -143,6 +143,9 @@ ifneq ($(SKIP_ZX8211),1) endif # common HF support +ifneq ($(SKIP_HF),1) + PLATFORM_DEFS += -DWITH_GENERAL_HF +endif ifneq ($(SKIP_ISO15693),1) PLATFORM_DEFS += -DWITH_ISO15693 endif diff --git a/include/pm3_cmd.h b/include/pm3_cmd.h index c900eb952..e53132309 100644 --- a/include/pm3_cmd.h +++ b/include/pm3_cmd.h @@ -511,6 +511,7 @@ typedef struct { // For the 13.56 MHz tags #define CMD_HF_ISO15693_ACQ_RAW_ADC 0x0300 +#define CMD_HF_ACQ_RAW_ADC 0x0301 #define CMD_HF_SRI_READ 0x0303 #define CMD_HF_ISO14443B_COMMAND 0x0305 #define CMD_HF_ISO15693_READER 0x0310 From e3a50e0e1ef7903edb5a10da044e12195b186323 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 25 Jun 2022 14:56:24 +0300 Subject: [PATCH 03/24] configuring fpga and dma --- armsrc/appmain.c | 2 +- armsrc/hfops.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++- armsrc/hfops.h | 2 +- 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index c28357108..5254368ae 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -1389,7 +1389,7 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_HF_ACQ_RAW_ADC: { uint32_t samplesCount = 0; memcpy(&samplesCount, packet->data.asBytes, 4); - HfReadADC(samplesCount); + HfReadADC(samplesCount, true); break; } #endif diff --git a/armsrc/hfops.c b/armsrc/hfops.c index 180cca409..a1bc7b80d 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -28,11 +28,87 @@ #include "commonutil.h" -int HfReadADC(uint32_t samplesCount) { +int HfReadADC(uint32_t samplesCount, bool ledcontrol) { + if (ledcontrol) LEDsoff(); + + BigBuf_Clear_ext(false); + + // And put the FPGA in the appropriate mode + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); + + // Setup and start DMA. + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); + + // The DMA buffer, used to stream samples from the FPGA + dmabuf16_t *dma = get_dma16(); + + // Setup and start DMA. + if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { + if (g_dbglevel > DBG_ERROR) Dbprintf("FpgaSetupSscDma failed. Exiting"); + + FpgaDisableSscDma(); + FpgaSetupSsc(FPGA_MAJOR_MODE_OFF); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + return PM3_EINIT; + } + + if (ledcontrol) LED_A_ON(); + + uint32_t samples = 0; + //uint32_t dma_start_time = 0; + uint16_t *upTo = dma->buf; + + for (;;) { + if (BUTTON_PRESS()) { + break; + } + + volatile uint16_t behindBy = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behindBy == 0) + continue; + + samples++; + if (samples == 1) { + // DMA has transferred the very first data + //dma_start_time = GetCountSspClk() & 0xfffffff0; + } + + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. + upTo = dma->buf; // start reading the circular buffer from the beginning + + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { + + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); + } + } + } + + FpgaDisableSscDma(); + FpgaDisableTracing(); + + FpgaSetupSsc(FPGA_MAJOR_MODE_OFF); + // Turn the field off + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + + reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, NULL, 0); + if (ledcontrol) LEDsoff(); + DbpString("HfReadADC " _GREEN_("success")); return 0; diff --git a/armsrc/hfops.h b/armsrc/hfops.h index 76ed4b8bc..2a804ccf1 100644 --- a/armsrc/hfops.h +++ b/armsrc/hfops.h @@ -21,7 +21,7 @@ #include "common.h" -int HfReadADC(uint32_t samplesCount); +int HfReadADC(uint32_t samplesCount, bool ledcontrol); #endif \ No newline at end of file From 0392cfaa9b63cc6b2c8275138344217db9ebe3f1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:23:04 +0300 Subject: [PATCH 04/24] read response --- client/src/cmdhftexkom.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 51758af3e..e20be5af3 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -41,8 +41,15 @@ static int CmdHFTexkomReader(const char *Cmd) { CLIParserFree(ctx); uint32_t samplesCount = 40000; + clearCommandBuffer(); SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t)); + PacketResponseNG resp; + if (!WaitForResponseTimeout(CMD_HF_ACQ_RAW_ADC, &resp, 2500)) { + PrintAndLogEx(WARNING, "(hf texkom reader) command execution time out"); + return PM3_ETIMEOUT; + } + return PM3_SUCCESS; } From f007db6661e99f8803d6c46e4068fde20cb08c3f Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 25 Jun 2022 15:42:11 +0300 Subject: [PATCH 05/24] fill samples - get samples --- armsrc/hfops.c | 10 ++++++++-- client/src/cmdhftexkom.c | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index a1bc7b80d..8bf588369 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -26,6 +26,7 @@ #include "dbprint.h" #include "util.h" #include "commonutil.h" +#include "lfsampling.h" int HfReadADC(uint32_t samplesCount, bool ledcontrol) { @@ -58,6 +59,9 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { //uint32_t dma_start_time = 0; uint16_t *upTo = dma->buf; + uint32_t sbs = samplesCount; + initSampleBuffer(&sbs); + for (;;) { if (BUTTON_PRESS()) { break; @@ -95,8 +99,10 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { } + logSample(50, 1, 8, false); - + if (getSampleCounter() >= samplesCount) + break; } FpgaDisableSscDma(); @@ -109,7 +115,7 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, NULL, 0); if (ledcontrol) LEDsoff(); - DbpString("HfReadADC " _GREEN_("success")); + Dbprintf("-- samples: %d", getSampleCounter()); return 0; } diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index e20be5af3..b015c7fb7 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -26,6 +26,7 @@ #include "comms.h" #include "ui.h" #include "cmdhf14a.h" +#include "cmddata.h" static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; @@ -50,6 +51,8 @@ static int CmdHFTexkomReader(const char *Cmd) { return PM3_ETIMEOUT; } + getSamples(samplesCount, true); + return PM3_SUCCESS; } From 5784999002eb79eeb9b7a612c01e50a96f81cea8 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 25 Jun 2022 16:11:59 +0300 Subject: [PATCH 06/24] first look at the data --- armsrc/hfops.c | 25 +++++++++---------------- client/src/cmdhftexkom.c | 4 +++- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index 8bf588369..a43897764 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -55,8 +55,6 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { if (ledcontrol) LED_A_ON(); - uint32_t samples = 0; - //uint32_t dma_start_time = 0; uint16_t *upTo = dma->buf; uint32_t sbs = samplesCount; @@ -71,11 +69,13 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { if (behindBy == 0) continue; - samples++; - if (samples == 1) { - // DMA has transferred the very first data - //dma_start_time = GetCountSspClk() & 0xfffffff0; - } + uint16_t sample = *upTo; + logSample(sample & 0xff, 1, 8, false); + logSample((sample >> 8) & 0xff, 1, 8, false); + upTo++; + + if (getSampleCounter() >= samplesCount) + break; if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. upTo = dma->buf; // start reading the circular buffer from the beginning @@ -97,12 +97,6 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { WDT_HIT(); } } - - - logSample(50, 1, 8, false); - - if (getSampleCounter() >= samplesCount) - break; } FpgaDisableSscDma(); @@ -112,11 +106,10 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { // Turn the field off FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, NULL, 0); + uint32_t scnt = getSampleCounter(); + reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, (uint8_t*)&scnt, 4); if (ledcontrol) LEDsoff(); - Dbprintf("-- samples: %d", getSampleCounter()); - return 0; } diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index b015c7fb7..e03dfb910 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -51,7 +51,9 @@ static int CmdHFTexkomReader(const char *Cmd) { return PM3_ETIMEOUT; } - getSamples(samplesCount, true); + uint32_t size = (resp.data.asDwords[0]); + if (size > 0) + getSamples(samplesCount, true); return PM3_SUCCESS; } From eeb7ac981c4c090179d89d62f2a19da6766f4a7f Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sun, 26 Jun 2022 11:29:34 +0300 Subject: [PATCH 07/24] additional init --- armsrc/hfops.c | 51 +++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index a43897764..d4d5c1e51 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -18,6 +18,7 @@ #include "hfops.h" +#include #include "proxmark3_arm.h" #include "cmd.h" #include "BigBuf.h" @@ -33,15 +34,19 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { if (ledcontrol) LEDsoff(); BigBuf_Clear_ext(false); + // connect Demodulated Signal to ADC: + SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // And put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); // Setup and start DMA. FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); // The DMA buffer, used to stream samples from the FPGA dmabuf16_t *dma = get_dma16(); + memset((uint8_t *) dma->buf, 0, DMA_BUFFER_SIZE); // Setup and start DMA. if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { @@ -69,33 +74,41 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { if (behindBy == 0) continue; - uint16_t sample = *upTo; - logSample(sample & 0xff, 1, 8, false); - logSample((sample >> 8) & 0xff, 1, 8, false); - upTo++; + // FPGA side: + // corr_i_out <= {2'b00, corr_amplitude[13:8]}; + // corr_q_out <= corr_amplitude[7:0]; + // ci = upTo >> 8, cq = upTo + volatile uint16_t sample = *upTo++; + //if (sample & 0xc000) { + // Dbprintf("sample!!!! %d \r\n", getSampleCounter()); + // break; + //} + + logSample((sample >> 6) & 0xff, 1, 8, false); if (getSampleCounter() >= samplesCount) break; if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. upTo = dma->buf; // start reading the circular buffer from the beginning + } - // DMA Counter Register had reached 0, already rotated. - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { - // primary buffer was stopped - if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { - AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; - AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; - } - // secondary buffer sets as primary, secondary buffer was stopped - if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; - AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; - } - - WDT_HIT(); + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + Dbprintf("blew\r\n"); } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); } } From 9813f8556749abb32785ab7b15270885dd73c73d Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 00:30:49 +0300 Subject: [PATCH 08/24] read directly without dma --- armsrc/hfops.c | 80 ++++++++++++++------------------------------------ armsrc/hfops.h | 1 - 2 files changed, 22 insertions(+), 59 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index d4d5c1e51..37759d616 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -29,7 +29,6 @@ #include "commonutil.h" #include "lfsampling.h" - int HfReadADC(uint32_t samplesCount, bool ledcontrol) { if (ledcontrol) LEDsoff(); @@ -39,80 +38,45 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // And put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_2SUBCARRIERS_424_484_KHZ | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_212_KHZ | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); - // Setup and start DMA. + // Setup FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); - // The DMA buffer, used to stream samples from the FPGA - dmabuf16_t *dma = get_dma16(); - memset((uint8_t *) dma->buf, 0, DMA_BUFFER_SIZE); - - // Setup and start DMA. - if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { - if (g_dbglevel > DBG_ERROR) Dbprintf("FpgaSetupSscDma failed. Exiting"); - - FpgaDisableSscDma(); - FpgaSetupSsc(FPGA_MAJOR_MODE_OFF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - return PM3_EINIT; - } - if (ledcontrol) LED_A_ON(); - uint16_t *upTo = dma->buf; - uint32_t sbs = samplesCount; initSampleBuffer(&sbs); + uint32_t wdtcntr = 0; for (;;) { if (BUTTON_PRESS()) { break; } - volatile uint16_t behindBy = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); - if (behindBy == 0) + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + volatile uint16_t sample = AT91C_BASE_SSC->SSC_RHR; + + // FPGA side: + // corr_i_out <= {2'b00, corr_amplitude[13:8]}; + // corr_q_out <= corr_amplitude[7:0]; + if (sample > 0x1fff) + sample = 0xff; + else + sample = sample >> 5; + logSample(sample & 0xff, 1, 8, false); + if (getSampleCounter() >= samplesCount) + break; + + if (wdtcntr++ > 512) { + WDT_HIT(); + wdtcntr = 0; + } + } else { continue; - - // FPGA side: - // corr_i_out <= {2'b00, corr_amplitude[13:8]}; - // corr_q_out <= corr_amplitude[7:0]; - // ci = upTo >> 8, cq = upTo - volatile uint16_t sample = *upTo++; - //if (sample & 0xc000) { - // Dbprintf("sample!!!! %d \r\n", getSampleCounter()); - // break; - //} - - logSample((sample >> 6) & 0xff, 1, 8, false); - - if (getSampleCounter() >= samplesCount) - break; - - if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. - upTo = dma->buf; // start reading the circular buffer from the beginning - } - - // DMA Counter Register had reached 0, already rotated. - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { - - // primary buffer was stopped - if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { - AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; - AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; - Dbprintf("blew\r\n"); - } - // secondary buffer sets as primary, secondary buffer was stopped - if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; - AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; - } - - WDT_HIT(); } } - FpgaDisableSscDma(); FpgaDisableTracing(); FpgaSetupSsc(FPGA_MAJOR_MODE_OFF); diff --git a/armsrc/hfops.h b/armsrc/hfops.h index 2a804ccf1..489c99bc6 100644 --- a/armsrc/hfops.h +++ b/armsrc/hfops.h @@ -23,5 +23,4 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol); - #endif \ No newline at end of file From 2248eadc7f1f883a7c6cdb055a257f5a76d1288f Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 00:31:15 +0300 Subject: [PATCH 09/24] locate start of the sequence and level --- client/src/cmdhftexkom.c | 71 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index e03dfb910..a2d8e39a8 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -27,6 +27,48 @@ #include "ui.h" #include "cmdhf14a.h" #include "cmddata.h" +#include "graph.h" + +#define TEXKOM_NOISE_THRESHOLD (10) + +inline uint32_t GetGraphBuffer(uint32_t indx) { + if (g_GraphBuffer[indx] < -128) + return 0; + else + return g_GraphBuffer[indx] + 128; +} + +static uint32_t TexkomSearchStart(uint32_t indx, uint8_t threshold) { + // one bit length = 27, minimal noise = 60 + uint32_t lownoisectr = 0; + for (uint32_t i = indx; i < g_GraphTraceLen; i++) { + if (lownoisectr > 60) { + if (GetGraphBuffer(i) > threshold) + return i; + } else { + if (GetGraphBuffer(i) > threshold) + lownoisectr = 0; + else + lownoisectr++; + } + } + + return 0; +} + +static uint32_t TexkomSearchMax(uint32_t indx, uint32_t len) { + uint32_t res = 0; + + for (uint32_t i = 0; i < len; i++) { + if (i + indx > g_GraphTraceLen) + break; + + if (GetGraphBuffer(indx + i) > res) + res = GetGraphBuffer(indx + i); + } + + return res; +} static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; @@ -41,7 +83,7 @@ static int CmdHFTexkomReader(const char *Cmd) { CLIExecWithReturn(ctx, Cmd, argtable, true); CLIParserFree(ctx); - uint32_t samplesCount = 40000; + uint32_t samplesCount = 12000; clearCommandBuffer(); SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t)); @@ -52,8 +94,31 @@ static int CmdHFTexkomReader(const char *Cmd) { } uint32_t size = (resp.data.asDwords[0]); - if (size > 0) - getSamples(samplesCount, true); + if (size > 0) { + if (getSamples(samplesCount, true) != PM3_SUCCESS) { + PrintAndLogEx(ERR, "Get samples error"); + return PM3_EFAILED; + }; + } + + uint32_t sindx = 0; + while (sindx < samplesCount - 5) { + sindx = TexkomSearchStart(sindx, TEXKOM_NOISE_THRESHOLD); + if (sindx == 0 || sindx > samplesCount - 5) + break; + + uint32_t maxlvl = TexkomSearchMax(sindx, 1760); + if (maxlvl < TEXKOM_NOISE_THRESHOLD) { + sindx += 1700; + continue; + } + PrintAndLogEx(WARNING, "--- indx: %d, max: %d", sindx, maxlvl); + + + + } + + PrintAndLogEx(WARNING, "Texkom card is not found"); return PM3_SUCCESS; } From a58c5b57ba165001ef2731d5674c980c7cdde89c Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 01:03:13 +0300 Subject: [PATCH 10/24] calculate signal periods --- client/src/cmdhftexkom.c | 66 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index a2d8e39a8..97f2894d2 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -38,7 +38,7 @@ inline uint32_t GetGraphBuffer(uint32_t indx) { return g_GraphBuffer[indx] + 128; } -static uint32_t TexkomSearchStart(uint32_t indx, uint8_t threshold) { +static uint32_t TexkomSearchStart(uint32_t indx, uint32_t threshold) { // one bit length = 27, minimal noise = 60 uint32_t lownoisectr = 0; for (uint32_t i = indx; i < g_GraphTraceLen; i++) { @@ -56,6 +56,26 @@ static uint32_t TexkomSearchStart(uint32_t indx, uint8_t threshold) { return 0; } +static uint32_t TexkomSearchLength(uint32_t indx, uint32_t threshold) { + // one bit length = 27, minimal noise = 60 + uint32_t lownoisectr = 0; + uint32_t datalen = 0; + for (uint32_t i = indx; i < g_GraphTraceLen; i++) { + if (lownoisectr > 60) { + break; + } else { + if (GetGraphBuffer(i) > threshold) { + lownoisectr = 0; + datalen = i - indx + 27; + } else { + lownoisectr++; + } + } + } + + return datalen; +} + static uint32_t TexkomSearchMax(uint32_t indx, uint32_t len) { uint32_t res = 0; @@ -70,6 +90,22 @@ static uint32_t TexkomSearchMax(uint32_t indx, uint32_t len) { return res; } +static bool TexkomCorrelate(uint32_t indx, uint32_t threshold) { + if (indx < 2 || indx + 2 > g_GraphTraceLen) + return false; + + uint32_t g1 = GetGraphBuffer(indx - 2); + uint32_t g2 = GetGraphBuffer(indx - 1); + uint32_t g3 = GetGraphBuffer(indx); + uint32_t g4 = GetGraphBuffer(indx + 1); + uint32_t g5 = GetGraphBuffer(indx + 2); + + return ( + (g3 > threshold) && + (g3 >= g2) && (g3 >= g1) && (g3 > g4) && (g3 > g5) + ); +} + static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom reader", @@ -107,14 +143,38 @@ static int CmdHFTexkomReader(const char *Cmd) { if (sindx == 0 || sindx > samplesCount - 5) break; + uint32_t slen = TexkomSearchLength(sindx, TEXKOM_NOISE_THRESHOLD); + if (slen == 0) + continue; + uint32_t maxlvl = TexkomSearchMax(sindx, 1760); if (maxlvl < TEXKOM_NOISE_THRESHOLD) { sindx += 1700; continue; } - PrintAndLogEx(WARNING, "--- indx: %d, max: %d", sindx, maxlvl); - + uint32_t noiselvl = maxlvl / 5; + if (noiselvl < TEXKOM_NOISE_THRESHOLD) + noiselvl = TEXKOM_NOISE_THRESHOLD; + + PrintAndLogEx(WARNING, "--- indx: %d, len: %d, max: %d, noise: %d", sindx, slen, maxlvl, noiselvl); + + uint32_t implengths[256] = {}; + uint32_t implengthslen = 0; + uint32_t impulseindx = 0; + uint32_t impulsecnt = 0; + for (uint32_t i = 0; i < slen; i++) { + if (TexkomCorrelate(sindx + i, noiselvl)) { + impulsecnt++; + + if (impulseindx != 0) { + if (implengthslen < 256) + implengths[implengthslen++] = sindx + i - impulseindx; + } + impulseindx = sindx + i; + } + } + PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); } From a0d37a84c6bac3355326e5e4afce4729783662dd Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 18:39:15 +0300 Subject: [PATCH 11/24] read tk13 with crc ok --- client/src/cmdhftexkom.c | 252 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 250 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 97f2894d2..c17c47991 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -106,6 +106,138 @@ static bool TexkomCorrelate(uint32_t indx, uint32_t threshold) { ); } +static bool TexkomCalculateMaxMin(uint32_t* data, uint32_t len, uint32_t* dmax, uint32_t* dmin) { + *dmax = 0; + *dmin = 0xffffffff; + for (size_t i = 0; i < len; i++) { + if (data[i] > *dmax) + *dmax = data[i]; + if (data[i] < *dmin) + *dmin = data[i]; + } + + return (*dmax != 0) && (*dmin != 0xffffffff) && (*dmax > *dmin); +} + +static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi, uint32_t* low) { + *hi = 0; + *low = 0; + + uint32_t dmax = 0; + uint32_t dmin = 0xffffffff; + if (!TexkomCalculateMaxMin(data, len, &dmax, &dmin)) + return false; + + uint32_t dmiddle = (dmax + dmin) / 2; + uint32_t sumhi = 0; + uint32_t lenhi = 0; + uint32_t sumlow = 0; + uint32_t lenlow = 0; + for (size_t i = 0; i < len; i++) { + if (data[i] > dmiddle) { + sumhi += data[i]; + lenhi++; + } else { + sumlow += data[i]; + lenlow++; + } + } +PrintAndLogEx(WARNING, "--- min: %d, middle: %d, max: %d", dmin, dmiddle, dmax); + + *hi = sumhi / lenhi; + *low = sumlow / lenlow; + + return (*hi != 0) && (*low != 0) && (*hi > *low); +} + +inline bool TexcomCalculateBit(uint32_t data, uint32_t bitlen, uint32_t threshold) { + return + (data < (bitlen + threshold)) && + (data > (bitlen - threshold)); +} + +// code from https://github.com/li0ard/crclib/blob/main/index.js +static uint8_t TexcomTK13CRC(uint8_t* data) { + uint8_t crc = 0; + uint8_t indx = 0; + while (indx < 4) { + crc = crc ^ data[indx++]; + + for (uint8_t i = 0; i < 8; i++) + if (crc & 0x80) { + crc = 0x31 ^ (crc << 1); + } else + crc <<= 1; + }; + + PrintAndLogEx(WARNING, "--- crc: %x", crc); + return crc; +} + +static unsigned char dallas_crc8(const unsigned char * data, const unsigned int size) +{ + unsigned char crc = 0; + for ( unsigned int i = 0; i < size; ++i ) + { + unsigned char inbyte = data[i]; + for ( unsigned char j = 0; j < 8; ++j ) + { + unsigned char mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if ( mix ) crc ^= 0x8C; + inbyte >>= 1; + } + } + return crc; +} + +// code from https://github.com/li0ard/crclib/blob/main/index.js +static uint8_t TexcomTK17CRC(uint8_t* data) { + uint8_t ddata[8] = {0x00, 0x00, 0x00, data[0], data[1], data[2], data[3], 0x00}; + +/* + dallas (arrby) { + var arrby2 = []; + if (arrby.length < 8) { + return "FF"; + } + var n = 0; + var n2 = 7; + while (n < 7){ + arrby2[n] = arrby[n2]; + ++n; + --n2; + } + var n3 = 0; + var n4 = 0; + do { + var n5 = 255 & arrby2[n3]; + var n6 = n4; + for (var n7 = 0; n7 < 8; n7 = Number(n7 + 1)) { + var n8 = 1 & (255 & (n6 ^ n5)); + n6 = 255 & n6 >> 1; + n5 = 255 & n5 >> 1; + if (n8 != 1) continue; + n6 ^= 140; + } + if ((n3 = Number(n3 + 1)) >= 7) { + return n6.toString(16).toUpperCase(); + } + n4 = n6; + } while (true); + } + tk17(arrby) { + if(arrby.length < 8) { + return "FF" + } + return this.dallas( [0x00, arrby[1], arrby[2], arrby[3], arrby[4], 0x00, 0x00, 0x00] ) + } +*/ + + return dallas_crc8(ddata, 8); +} + + static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom reader", @@ -117,9 +249,12 @@ static int CmdHFTexkomReader(const char *Cmd) { arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool verbose = true; + CLIParserFree(ctx); - uint32_t samplesCount = 12000; + uint32_t samplesCount = 30000; clearCommandBuffer(); SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t)); @@ -137,6 +272,9 @@ static int CmdHFTexkomReader(const char *Cmd) { }; } + char bitstring[256] = {0}; + char cbitstring[128] = {0}; + bool codefound = false; uint32_t sindx = 0; while (sindx < samplesCount - 5) { sindx = TexkomSearchStart(sindx, TEXKOM_NOISE_THRESHOLD); @@ -176,9 +314,119 @@ static int CmdHFTexkomReader(const char *Cmd) { } PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); + uint32_t hilength = 0; + uint32_t lowlength = 0; + if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength)) + continue; + + uint32_t threshold = (hilength - lowlength) / 3 + 1; + PrintAndLogEx(WARNING, "--- hi: %d, low: %d, threshold: %d", hilength, lowlength, threshold); + + bitstring[0] = 0; + bool biterror = false; + for (uint32_t i = 0; i < implengthslen; i++) { + if (TexcomCalculateBit(implengths[i], hilength, threshold)) + strcat(bitstring, "1"); + else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) + strcat(bitstring, "0"); + else { + biterror = true; + break; + } + } + + if (biterror || strlen(bitstring) == 0) + continue; + + if (verbose) + PrintAndLogEx(INFO, "raw bit string [%d]: %s", strlen(bitstring), bitstring); + + // add trailing impulse (some tags just ignore it) + if (strlen(bitstring) % 2 != 0) { + if (bitstring[strlen(bitstring) - 1] == '1') + strcat(bitstring, "0"); + else + strcat(bitstring, "1"); + } + PrintAndLogEx(INFO, "bs [%d]: %s", strlen(bitstring), bitstring); + + cbitstring[0] = 0; + for (uint32_t i = 0; i < strlen(bitstring); i = i + 2) { + if (bitstring[i] == bitstring[i + 1]) { + cbitstring[0] = 0; + if (verbose) + PrintAndLogEx(WARNING, "Raw bit string have error at offset %d.", i); + break; + } + if (bitstring[i] == '1') + strcat(cbitstring, "1"); + else + strcat(cbitstring, "0"); + } + + if (strlen(cbitstring) == 0) + continue; + + if (verbose) + PrintAndLogEx(INFO, "bit string [%d]: %s", strlen(cbitstring), cbitstring); + + if (strlen(cbitstring) != 64) + continue; + + uint8_t tcode[8] = {0}; + for (uint32_t i = 0; i < strlen(cbitstring); i++) { + tcode[i / 8] = (tcode[i / 8] << 1) | ((cbitstring[i] == '1') ? 1 : 0); + } + + if (verbose) + PrintAndLogEx(INFO, "Hex code: %s", sprint_hex(tcode, 8)); + + if (tcode[0] != 0xff || tcode[1] != 0xff) + continue; + + // decoding code + + if (!verbose) + PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); + + if (tcode[2] == 0x63) { + // TK13 + PrintAndLogEx(INFO, "type: TK13"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + + if (TexcomTK13CRC(&tcode[3]) == tcode[7]) + PrintAndLogEx(INFO, "crc : OK"); + else + PrintAndLogEx(WARNING, "crc : WRONG"); + + } else if (tcode[2] == 0xca) { + // TK17 + PrintAndLogEx(INFO, "type: TK17"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + + if (TexcomTK17CRC(&tcode[3]) == tcode[7]) + PrintAndLogEx(INFO, "crc : OK"); + else + PrintAndLogEx(WARNING, "crc : WRONG"); + + } else { + PrintAndLogEx(INFO, "type: unknown"); + PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); + } + + + codefound = true; + break; } - PrintAndLogEx(WARNING, "Texkom card is not found"); + if (!codefound) { + if (strlen(bitstring) > 0) + PrintAndLogEx(INFO, "last raw bit string [%d]: %s", strlen(bitstring), bitstring); + if (strlen(cbitstring) > 0) + PrintAndLogEx(INFO, "last bit string [%d]: %s", strlen(cbitstring), cbitstring); + + PrintAndLogEx(ERR, "Texkom card is not found"); + } return PM3_SUCCESS; } From e341ce68e4f2b2a71664ba1f8ac2bac8c5669ae1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 19:00:24 +0300 Subject: [PATCH 12/24] remove crc debug and add dynamic threshold --- client/src/cmdhftexkom.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index c17c47991..3a34efc58 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -119,7 +119,7 @@ static bool TexkomCalculateMaxMin(uint32_t* data, uint32_t len, uint32_t* dmax, return (*dmax != 0) && (*dmin != 0xffffffff) && (*dmax > *dmin); } -static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi, uint32_t* low) { +static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi, uint32_t* low, uint32_t* lmax, uint32_t* lmin) { *hi = 0; *low = 0; @@ -147,6 +147,11 @@ PrintAndLogEx(WARNING, "--- min: %d, middle: %d, max: %d", dmin, dmiddle, dmax); *hi = sumhi / lenhi; *low = sumlow / lenlow; + if (lmax != NULL) + *lmax = dmax; + if (lmin != NULL) + *lmin = dmin; + return (*hi != 0) && (*low != 0) && (*hi > *low); } @@ -170,7 +175,6 @@ static uint8_t TexcomTK13CRC(uint8_t* data) { crc <<= 1; }; - PrintAndLogEx(WARNING, "--- crc: %x", crc); return crc; } @@ -316,7 +320,9 @@ static int CmdHFTexkomReader(const char *Cmd) { uint32_t hilength = 0; uint32_t lowlength = 0; - if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength)) + uint32_t lenmax = 0; + uint32_t lenmin = 0; + if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, &lenmax, &lenmin)) continue; uint32_t threshold = (hilength - lowlength) / 3 + 1; @@ -325,7 +331,7 @@ static int CmdHFTexkomReader(const char *Cmd) { bitstring[0] = 0; bool biterror = false; for (uint32_t i = 0; i < implengthslen; i++) { - if (TexcomCalculateBit(implengths[i], hilength, threshold)) + if (TexcomCalculateBit(implengths[i], hilength, MAX(threshold, lenmax - hilength))) strcat(bitstring, "1"); else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) strcat(bitstring, "0"); From cea9806226221b3580a51afaf9604638193c79f7 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 23:47:02 +0300 Subject: [PATCH 13/24] tk17 raw reading --- client/src/cmdhftexkom.c | 66 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 3a34efc58..18ce04830 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -241,6 +241,52 @@ static uint8_t TexcomTK17CRC(uint8_t* data) { return dallas_crc8(ddata, 8); } +inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { + uint32_t xlen = (len2 * 100) / (len1 + len2); + if (xlen < 10 || xlen > 90) + return -1; + if (xlen < 30) + return 0; + if (xlen < 50) + return 1; + if (xlen < 70) + return 2; + return 3; +} + + +static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool verbose) { + char bitstring[256] = {0}; + + for (uint32_t i = 0; i < implengthslen; i = i + 2) { + int dbit = TexcomTK17Get2Bits(implengths[i], implengths[i + 1]); + if (dbit < 0) + return false; + + switch (dbit) { + case 0: + strcat(bitstring, "00"); + break; + case 1: + strcat(bitstring, "01"); + break; + case 2: + strcat(bitstring, "10"); + break; + case 3: + strcat(bitstring, "11"); + break; + default: + return false; + } + } + + if (verbose) + PrintAndLogEx(INFO, "TK17 raw bit string [%d]: %s", strlen(bitstring), bitstring); + + + return strlen(bitstring) == 64; +} static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; @@ -270,7 +316,7 @@ static int CmdHFTexkomReader(const char *Cmd) { uint32_t size = (resp.data.asDwords[0]); if (size > 0) { - if (getSamples(samplesCount, true) != PM3_SUCCESS) { + if (getSamples(samplesCount, false) != PM3_SUCCESS) { PrintAndLogEx(ERR, "Get samples error"); return PM3_EFAILED; }; @@ -318,11 +364,16 @@ static int CmdHFTexkomReader(const char *Cmd) { } PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); + // check if it TK-17 modulation + // 65 impulses and 64 intervals + if (impulsecnt == 65) { + if (TexcomTK17Decode(implengths, implengthslen, verbose)) + break; + } + uint32_t hilength = 0; uint32_t lowlength = 0; - uint32_t lenmax = 0; - uint32_t lenmin = 0; - if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, &lenmax, &lenmin)) + if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, NULL, NULL)) continue; uint32_t threshold = (hilength - lowlength) / 3 + 1; @@ -331,11 +382,16 @@ static int CmdHFTexkomReader(const char *Cmd) { bitstring[0] = 0; bool biterror = false; for (uint32_t i = 0; i < implengthslen; i++) { - if (TexcomCalculateBit(implengths[i], hilength, MAX(threshold, lenmax - hilength))) + if (TexcomCalculateBit(implengths[i], hilength, threshold)) strcat(bitstring, "1"); else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) strcat(bitstring, "0"); else { + PrintAndLogEx(INFO, "ERROR string [%d]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); + //for (uint32_t j = 0; j < implengthslen; j++) + // printf("%d,", implengths[j]); + //printf("\r\n"); + biterror = true; break; } From f16386249680b76a551ab693bae4cbe7acd4f386 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Mon, 27 Jun 2022 23:50:23 +0300 Subject: [PATCH 14/24] fix codeql --- client/src/cmdhftexkom.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 18ce04830..8cb5c0554 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -282,7 +282,7 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool } if (verbose) - PrintAndLogEx(INFO, "TK17 raw bit string [%d]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "TK17 raw bit string [%zu]: %s", strlen(bitstring), bitstring); return strlen(bitstring) == 64; @@ -387,7 +387,7 @@ static int CmdHFTexkomReader(const char *Cmd) { else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) strcat(bitstring, "0"); else { - PrintAndLogEx(INFO, "ERROR string [%d]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); + PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); //for (uint32_t j = 0; j < implengthslen; j++) // printf("%d,", implengths[j]); //printf("\r\n"); @@ -401,7 +401,7 @@ static int CmdHFTexkomReader(const char *Cmd) { continue; if (verbose) - PrintAndLogEx(INFO, "raw bit string [%d]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "raw bit string [%zu]: %s", strlen(bitstring), bitstring); // add trailing impulse (some tags just ignore it) if (strlen(bitstring) % 2 != 0) { @@ -410,7 +410,6 @@ static int CmdHFTexkomReader(const char *Cmd) { else strcat(bitstring, "1"); } - PrintAndLogEx(INFO, "bs [%d]: %s", strlen(bitstring), bitstring); cbitstring[0] = 0; for (uint32_t i = 0; i < strlen(bitstring); i = i + 2) { @@ -430,7 +429,7 @@ static int CmdHFTexkomReader(const char *Cmd) { continue; if (verbose) - PrintAndLogEx(INFO, "bit string [%d]: %s", strlen(cbitstring), cbitstring); + PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); if (strlen(cbitstring) != 64) continue; @@ -483,9 +482,9 @@ static int CmdHFTexkomReader(const char *Cmd) { if (!codefound) { if (strlen(bitstring) > 0) - PrintAndLogEx(INFO, "last raw bit string [%d]: %s", strlen(bitstring), bitstring); + PrintAndLogEx(INFO, "last raw bit string [%zu]: %s", strlen(bitstring), bitstring); if (strlen(cbitstring) > 0) - PrintAndLogEx(INFO, "last bit string [%d]: %s", strlen(cbitstring), cbitstring); + PrintAndLogEx(INFO, "last bit string [%zu]: %s", strlen(cbitstring), cbitstring); PrintAndLogEx(ERR, "Texkom card is not found"); } From 2fdf09606fcb19d4cd2f3f3c5320ace1c1647c5d Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 00:05:18 +0300 Subject: [PATCH 15/24] calc tk17 raw bitstring --- client/src/cmdhftexkom.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 8cb5c0554..8ae4760aa 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -248,15 +248,16 @@ inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { if (xlen < 30) return 0; if (xlen < 50) - return 1; - if (xlen < 70) return 2; + if (xlen < 70) + return 1; return 3; } static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool verbose) { char bitstring[256] = {0}; + char cbitstring[256] = {0}; for (uint32_t i = 0; i < implengthslen; i = i + 2) { int dbit = TexcomTK17Get2Bits(implengths[i], implengths[i + 1]); @@ -284,6 +285,16 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool if (verbose) PrintAndLogEx(INFO, "TK17 raw bit string [%zu]: %s", strlen(bitstring), bitstring); + for (uint32_t i = 0; i < 8; i++) { + memcpy(&cbitstring[i * 8 + 0], &bitstring[i * 8 + 6], 2); + memcpy(&cbitstring[i * 8 + 2], &bitstring[i * 8 + 4], 2); + memcpy(&cbitstring[i * 8 + 4], &bitstring[i * 8 + 2], 2); + memcpy(&cbitstring[i * 8 + 6], &bitstring[i * 8 + 0], 2); + } + + if (verbose) + PrintAndLogEx(INFO, "TK17 bit string [%zu]: %s", strlen(cbitstring), cbitstring); + return strlen(bitstring) == 64; } From a18e50b18a7a4c55053a6b65d7cb5ae7274cb7b1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 00:14:50 +0300 Subject: [PATCH 16/24] move print code to one place and check preamble --- client/src/cmdhftexkom.c | 77 ++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 8ae4760aa..5d431ab1f 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -255,9 +255,9 @@ inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { } -static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool verbose) { - char bitstring[256] = {0}; - char cbitstring[256] = {0}; +static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, char* cbitstring, bool verbose) { + bitstring[0] = 0; + cbitstring[0] = 0; for (uint32_t i = 0; i < implengthslen; i = i + 2) { int dbit = TexcomTK17Get2Bits(implengths[i], implengths[i + 1]); @@ -295,8 +295,7 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, bool if (verbose) PrintAndLogEx(INFO, "TK17 bit string [%zu]: %s", strlen(cbitstring), cbitstring); - - return strlen(bitstring) == 64; + return (strlen(bitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0); } static int CmdHFTexkomReader(const char *Cmd) { @@ -378,8 +377,10 @@ static int CmdHFTexkomReader(const char *Cmd) { // check if it TK-17 modulation // 65 impulses and 64 intervals if (impulsecnt == 65) { - if (TexcomTK17Decode(implengths, implengthslen, verbose)) + if (TexcomTK17Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) { + codefound = true; break; + } } uint32_t hilength = 0; @@ -442,9 +443,14 @@ static int CmdHFTexkomReader(const char *Cmd) { if (verbose) PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); - if (strlen(cbitstring) != 64) + if ((strlen(cbitstring) != 64) || (strncmp(cbitstring, "1111111111111111", 16) != 0)) continue; + codefound = true; + break; + } + + if (codefound) { uint8_t tcode[8] = {0}; for (uint32_t i = 0; i < strlen(cbitstring); i++) { tcode[i / 8] = (tcode[i / 8] << 1) | ((cbitstring[i] == '1') ? 1 : 0); @@ -453,45 +459,40 @@ static int CmdHFTexkomReader(const char *Cmd) { if (verbose) PrintAndLogEx(INFO, "Hex code: %s", sprint_hex(tcode, 8)); - if (tcode[0] != 0xff || tcode[1] != 0xff) - continue; + if (tcode[0] == 0xff && tcode[1] == 0xff) { + // decoding code - // decoding code + if (!verbose) + PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); - if (!verbose) - PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); + if (tcode[2] == 0x63) { + // TK13 + PrintAndLogEx(INFO, "type: TK13"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); - if (tcode[2] == 0x63) { - // TK13 - PrintAndLogEx(INFO, "type: TK13"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + if (TexcomTK13CRC(&tcode[3]) == tcode[7]) + PrintAndLogEx(INFO, "crc : OK"); + else + PrintAndLogEx(WARNING, "crc : WRONG"); - if (TexcomTK13CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); - else - PrintAndLogEx(WARNING, "crc : WRONG"); + } else if (tcode[2] == 0xca) { + // TK17 + PrintAndLogEx(INFO, "type: TK17"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); - } else if (tcode[2] == 0xca) { - // TK17 - PrintAndLogEx(INFO, "type: TK17"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); - - if (TexcomTK17CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); - else - PrintAndLogEx(WARNING, "crc : WRONG"); + if (TexcomTK17CRC(&tcode[3]) == tcode[7]) + PrintAndLogEx(INFO, "crc : OK"); + else + PrintAndLogEx(WARNING, "crc : WRONG"); + } else { + PrintAndLogEx(INFO, "type: unknown"); + PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); + } } else { - PrintAndLogEx(INFO, "type: unknown"); - PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); + PrintAndLogEx(ERR, "Code have no preamble FFFF: %s", sprint_hex(tcode, 8)); } - - - codefound = true; - break; - } - - if (!codefound) { + } else { if (strlen(bitstring) > 0) PrintAndLogEx(INFO, "last raw bit string [%zu]: %s", strlen(bitstring), bitstring); if (strlen(cbitstring) > 0) From 6bb71fb8602a6e8c51b3ef370e7d009e05cd7ab7 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 00:22:29 +0300 Subject: [PATCH 17/24] bit names refactoring --- client/src/cmdhftexkom.c | 21 ++++++++++----------- client/src/cmdhftexkom.h | 8 ++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 5d431ab1f..317a28a25 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -244,37 +244,36 @@ static uint8_t TexcomTK17CRC(uint8_t* data) { inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { uint32_t xlen = (len2 * 100) / (len1 + len2); if (xlen < 10 || xlen > 90) - return -1; + return TK17WrongBit; if (xlen < 30) - return 0; + return TK17Bit00; if (xlen < 50) - return 2; + return TK17Bit10; if (xlen < 70) - return 1; - return 3; + return TK17Bit01; + return TK17Bit11; } - static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, char* cbitstring, bool verbose) { bitstring[0] = 0; cbitstring[0] = 0; for (uint32_t i = 0; i < implengthslen; i = i + 2) { int dbit = TexcomTK17Get2Bits(implengths[i], implengths[i + 1]); - if (dbit < 0) + if (dbit == TK17WrongBit) return false; switch (dbit) { - case 0: + case TK17Bit00: strcat(bitstring, "00"); break; - case 1: + case TK17Bit01: strcat(bitstring, "01"); break; - case 2: + case TK17Bit10: strcat(bitstring, "10"); break; - case 3: + case TK17Bit11: strcat(bitstring, "11"); break; default: diff --git a/client/src/cmdhftexkom.h b/client/src/cmdhftexkom.h index 9f4a3b32f..0c46759c2 100644 --- a/client/src/cmdhftexkom.h +++ b/client/src/cmdhftexkom.h @@ -22,6 +22,14 @@ #include "common.h" #include "pm3_cmd.h" +enum TK17Bits { + TK17WrongBit, + TK17Bit00, + TK17Bit01, + TK17Bit10, + TK17Bit11 +}; + int CmdHFTexkom(const char *Cmd); #endif \ No newline at end of file From 383dc934d6d6ce0d3125b1bd96e0ff536fc367b3 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 00:31:42 +0300 Subject: [PATCH 18/24] print modulation type --- client/src/cmdhftexkom.c | 39 +++++++++++++++++++++++++-------------- client/src/cmdhftexkom.h | 6 ++++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 317a28a25..3765eca70 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -333,7 +333,7 @@ static int CmdHFTexkomReader(const char *Cmd) { char bitstring[256] = {0}; char cbitstring[128] = {0}; - bool codefound = false; + int codefound = TexkomModError; uint32_t sindx = 0; while (sindx < samplesCount - 5) { sindx = TexkomSearchStart(sindx, TEXKOM_NOISE_THRESHOLD); @@ -377,7 +377,7 @@ static int CmdHFTexkomReader(const char *Cmd) { // 65 impulses and 64 intervals if (impulsecnt == 65) { if (TexcomTK17Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) { - codefound = true; + codefound = TexkomModTK17; break; } } @@ -445,11 +445,11 @@ static int CmdHFTexkomReader(const char *Cmd) { if ((strlen(cbitstring) != 64) || (strncmp(cbitstring, "1111111111111111", 16) != 0)) continue; - codefound = true; + codefound = TexkomModTK13; break; } - if (codefound) { + if (codefound != TexkomModError) { uint8_t tcode[8] = {0}; for (uint32_t i = 0; i < strlen(cbitstring); i++) { tcode[i / 8] = (tcode[i / 8] << 1) | ((cbitstring[i] == '1') ? 1 : 0); @@ -464,29 +464,40 @@ static int CmdHFTexkomReader(const char *Cmd) { if (!verbose) PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); + if (codefound == TexkomModTK13) + PrintAndLogEx(INFO, "modulation: TK13"); + else if (codefound == TexkomModTK17) + PrintAndLogEx(INFO, "modulation: TK17"); + else + PrintAndLogEx(INFO, "modulation: unknown"); + if (tcode[2] == 0x63) { // TK13 - PrintAndLogEx(INFO, "type: TK13"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + if (codefound != TexkomModTK13) + PrintAndLogEx(WARNING, " mod type: WRONG"); + PrintAndLogEx(INFO, "type : TK13"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); if (TexcomTK13CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); + PrintAndLogEx(INFO, "crc : OK"); else - PrintAndLogEx(WARNING, "crc : WRONG"); + PrintAndLogEx(WARNING, "crc : WRONG"); } else if (tcode[2] == 0xca) { // TK17 - PrintAndLogEx(INFO, "type: TK17"); - PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); + if (codefound != TexkomModTK17) + PrintAndLogEx(WARNING, " mod type: WRONG"); + PrintAndLogEx(INFO, "type : TK17"); + PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4)); if (TexcomTK17CRC(&tcode[3]) == tcode[7]) - PrintAndLogEx(INFO, "crc : OK"); + PrintAndLogEx(INFO, "crc : OK"); else - PrintAndLogEx(WARNING, "crc : WRONG"); + PrintAndLogEx(WARNING, "crc : WRONG"); } else { - PrintAndLogEx(INFO, "type: unknown"); - PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); + PrintAndLogEx(INFO, "type : unknown"); + PrintAndLogEx(INFO, "uid : %s (maybe)", sprint_hex(&tcode[3], 4)); } } else { PrintAndLogEx(ERR, "Code have no preamble FFFF: %s", sprint_hex(tcode, 8)); diff --git a/client/src/cmdhftexkom.h b/client/src/cmdhftexkom.h index 0c46759c2..2e8a79658 100644 --- a/client/src/cmdhftexkom.h +++ b/client/src/cmdhftexkom.h @@ -30,6 +30,12 @@ enum TK17Bits { TK17Bit11 }; +enum TexkomModulation { + TexkomModError, + TexkomModTK13, + TexkomModTK17 +}; + int CmdHFTexkom(const char *Cmd); #endif \ No newline at end of file From 5fd951a799ebaecc20a9fd119efed0f560fc0693 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 00:36:09 +0300 Subject: [PATCH 19/24] remove debug --- client/src/cmdhftexkom.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 3765eca70..9fc996ed0 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -142,7 +142,6 @@ static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi lenlow++; } } -PrintAndLogEx(WARNING, "--- min: %d, middle: %d, max: %d", dmin, dmiddle, dmax); *hi = sumhi / lenhi; *low = sumlow / lenlow; @@ -354,7 +353,7 @@ static int CmdHFTexkomReader(const char *Cmd) { if (noiselvl < TEXKOM_NOISE_THRESHOLD) noiselvl = TEXKOM_NOISE_THRESHOLD; - PrintAndLogEx(WARNING, "--- indx: %d, len: %d, max: %d, noise: %d", sindx, slen, maxlvl, noiselvl); + //PrintAndLogEx(WARNING, "--- indx: %d, len: %d, max: %d, noise: %d", sindx, slen, maxlvl, noiselvl); uint32_t implengths[256] = {}; uint32_t implengthslen = 0; @@ -371,7 +370,7 @@ static int CmdHFTexkomReader(const char *Cmd) { impulseindx = sindx + i; } } - PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); + //PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); // check if it TK-17 modulation // 65 impulses and 64 intervals @@ -388,7 +387,7 @@ static int CmdHFTexkomReader(const char *Cmd) { continue; uint32_t threshold = (hilength - lowlength) / 3 + 1; - PrintAndLogEx(WARNING, "--- hi: %d, low: %d, threshold: %d", hilength, lowlength, threshold); + //PrintAndLogEx(WARNING, "--- hi: %d, low: %d, threshold: %d", hilength, lowlength, threshold); bitstring[0] = 0; bool biterror = false; @@ -398,7 +397,7 @@ static int CmdHFTexkomReader(const char *Cmd) { else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) strcat(bitstring, "0"); else { - PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); + //PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); //for (uint32_t j = 0; j < implengthslen; j++) // printf("%d,", implengths[j]); //printf("\r\n"); From 7feca916875afe80b560975dcefd6623675c76de Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 09:47:27 +0300 Subject: [PATCH 20/24] refactoring decoders and verbosity --- client/src/cmdhftexkom.c | 168 +++++++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 61 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 9fc996ed0..d863fba05 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -191,6 +191,7 @@ static unsigned char dallas_crc8(const unsigned char * data, const unsigned int inbyte >>= 1; } } +PrintAndLogEx(WARNING, "--crc %x", crc); return crc; } @@ -240,6 +241,68 @@ static uint8_t TexcomTK17CRC(uint8_t* data) { return dallas_crc8(ddata, 8); } +static bool TexcomTK13Decode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, char* cbitstring, bool verbose) { + bitstring[0] = 0; + cbitstring[0] = 0; + + uint32_t hilength = 0; + uint32_t lowlength = 0; + if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, NULL, NULL)) + return false; + + uint32_t threshold = (hilength - lowlength) / 3 + 1; + //PrintAndLogEx(WARNING, "--- hi: %d, low: %d, threshold: %d", hilength, lowlength, threshold); + + bool biterror = false; + for (uint32_t i = 0; i < implengthslen; i++) { + if (TexcomCalculateBit(implengths[i], hilength, threshold)) + strcat(bitstring, "1"); + else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) + strcat(bitstring, "0"); + else { + //PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); + + biterror = true; + break; + } + } + + if (biterror || strlen(bitstring) == 0) + return false; + + if (verbose) + PrintAndLogEx(INFO, "raw bit string [%zu]: %s", strlen(bitstring), bitstring); + + // add trailing impulse (some tags just ignore it) + if (strlen(bitstring) % 2 != 0) { + if (bitstring[strlen(bitstring) - 1] == '1') + strcat(bitstring, "0"); + else + strcat(bitstring, "1"); + } + + for (uint32_t i = 0; i < strlen(bitstring); i = i + 2) { + if (bitstring[i] == bitstring[i + 1]) { + cbitstring[0] = 0; + if (verbose) + PrintAndLogEx(WARNING, "Raw bit string have error at offset %d.", i); + break; + } + if (bitstring[i] == '1') + strcat(cbitstring, "1"); + else + strcat(cbitstring, "0"); + } + + if (strlen(cbitstring) == 0) + return false; + + if (verbose) + PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); + + return ((strlen(cbitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0)); +} + inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { uint32_t xlen = (len2 * 100) / (len1 + len2); if (xlen < 10 || xlen > 90) @@ -296,6 +359,41 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* return (strlen(bitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0); } + +static bool TexcomGeneralDecode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, bool verbose) { + uint32_t hilength = 0; + uint32_t lowlength = 0; + if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, NULL, NULL)) + return false; + + uint32_t threshold = (hilength - lowlength) / 3 + 1; + + bitstring[0] = 0; + bool biterror = false; + for (uint32_t i = 0; i < implengthslen; i++) { + if (TexcomCalculateBit(implengths[i], hilength, threshold)) + strcat(bitstring, "1"); + else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) + strcat(bitstring, "0"); + else { + if (verbose) { + PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); + printf("Length array: \r\n"); + for (uint32_t j = 0; j < implengthslen; j++) + printf("%d,", implengths[j]); + printf("\r\n"); + } + + biterror = true; + break; + } + } + if (verbose) + PrintAndLogEx(INFO, "General raw bit string [%zu]: %s", strlen(bitstring), bitstring); + + return (!biterror && strlen(bitstring) > 0); +} + static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom reader", @@ -304,11 +402,12 @@ static int CmdHFTexkomReader(const char *Cmd) { void *argtable[] = { arg_param_begin, + arg_lit0("v", "verbose", "Verbose scan and output"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - bool verbose = true; + bool verbose = arg_get_lit(ctx, 1); CLIParserFree(ctx); @@ -332,6 +431,7 @@ static int CmdHFTexkomReader(const char *Cmd) { char bitstring[256] = {0}; char cbitstring[128] = {0}; + char genbitstring[256] = {0}; int codefound = TexkomModError; uint32_t sindx = 0; while (sindx < samplesCount - 5) { @@ -381,71 +481,15 @@ static int CmdHFTexkomReader(const char *Cmd) { } } - uint32_t hilength = 0; - uint32_t lowlength = 0; - if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, NULL, NULL)) - continue; - - uint32_t threshold = (hilength - lowlength) / 3 + 1; - //PrintAndLogEx(WARNING, "--- hi: %d, low: %d, threshold: %d", hilength, lowlength, threshold); - - bitstring[0] = 0; - bool biterror = false; - for (uint32_t i = 0; i < implengthslen; i++) { - if (TexcomCalculateBit(implengths[i], hilength, threshold)) - strcat(bitstring, "1"); - else if (TexcomCalculateBit(implengths[i], lowlength, threshold)) - strcat(bitstring, "0"); - else { - //PrintAndLogEx(INFO, "ERROR string [%zu]: %s, bit: %d, blen: %d", strlen(bitstring), bitstring, i, implengths[i]); - //for (uint32_t j = 0; j < implengthslen; j++) - // printf("%d,", implengths[j]); - //printf("\r\n"); - - biterror = true; + if (impulsecnt == 127 || impulsecnt == 128) { + if (TexcomTK13Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) { + codefound = TexkomModTK13; break; } } - if (biterror || strlen(bitstring) == 0) - continue; - if (verbose) - PrintAndLogEx(INFO, "raw bit string [%zu]: %s", strlen(bitstring), bitstring); - - // add trailing impulse (some tags just ignore it) - if (strlen(bitstring) % 2 != 0) { - if (bitstring[strlen(bitstring) - 1] == '1') - strcat(bitstring, "0"); - else - strcat(bitstring, "1"); - } - - cbitstring[0] = 0; - for (uint32_t i = 0; i < strlen(bitstring); i = i + 2) { - if (bitstring[i] == bitstring[i + 1]) { - cbitstring[0] = 0; - if (verbose) - PrintAndLogEx(WARNING, "Raw bit string have error at offset %d.", i); - break; - } - if (bitstring[i] == '1') - strcat(cbitstring, "1"); - else - strcat(cbitstring, "0"); - } - - if (strlen(cbitstring) == 0) - continue; - - if (verbose) - PrintAndLogEx(INFO, "bit string [%zu]: %s", strlen(cbitstring), cbitstring); - - if ((strlen(cbitstring) != 64) || (strncmp(cbitstring, "1111111111111111", 16) != 0)) - continue; - - codefound = TexkomModTK13; - break; + TexcomGeneralDecode(implengths, implengthslen, genbitstring, verbose); } if (codefound != TexkomModError) { @@ -502,6 +546,8 @@ static int CmdHFTexkomReader(const char *Cmd) { PrintAndLogEx(ERR, "Code have no preamble FFFF: %s", sprint_hex(tcode, 8)); } } else { + if (strlen(genbitstring) > 0) + PrintAndLogEx(INFO, "General decoding bitstring: %s", genbitstring); if (strlen(bitstring) > 0) PrintAndLogEx(INFO, "last raw bit string [%zu]: %s", strlen(bitstring), bitstring); if (strlen(cbitstring) > 0) From 45804fb45c8cb8351b752b13c63b1637937b340b Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:41:03 +0300 Subject: [PATCH 21/24] show code as in the duplicator and some comments --- client/src/cmdhftexkom.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index d863fba05..b5bb018fa 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -394,6 +394,13 @@ static bool TexcomGeneralDecode(uint32_t* implengths, uint32_t implengthslen, ch return (!biterror && strlen(bitstring) > 0); } +static void TexcomReverseCode(const uint8_t *code, int length, uint8_t *reverse_code) { + for (int i = 0; i < length; i++) { + reverse_code[i] = code[(length - 1) - i]; + } +}; + + static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom reader", @@ -473,7 +480,7 @@ static int CmdHFTexkomReader(const char *Cmd) { //PrintAndLogEx(WARNING, "--- impulses: %d, lenarray: %d, [%d,%d]", impulsecnt, implengthslen, implengths[0], implengths[1]); // check if it TK-17 modulation - // 65 impulses and 64 intervals + // 65 impulses and 64 intervals (1 interval = 2 bits, interval length encoding) that represents 128 bit of card code if (impulsecnt == 65) { if (TexcomTK17Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) { codefound = TexkomModTK17; @@ -481,6 +488,8 @@ static int CmdHFTexkomReader(const char *Cmd) { } } + // check if it TK-13 modulation + // it have 127 or 128 impulses and 128 double-intervals that represents 128 bit of card code if (impulsecnt == 127 || impulsecnt == 128) { if (TexcomTK13Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) { codefound = TexkomModTK13; @@ -488,6 +497,8 @@ static int CmdHFTexkomReader(const char *Cmd) { } } + // general decoding. it thought that there is 2 types of intervals "long" (1) and "short" (0) + // and tries to decode sequence. shows only raw data if (verbose) TexcomGeneralDecode(implengths, implengthslen, genbitstring, verbose); } @@ -498,14 +509,21 @@ static int CmdHFTexkomReader(const char *Cmd) { tcode[i / 8] = (tcode[i / 8] << 1) | ((cbitstring[i] == '1') ? 1 : 0); } - if (verbose) + uint8_t rtcode[8] = {0}; + TexcomReverseCode(tcode, 8, rtcode); + + if (verbose) { PrintAndLogEx(INFO, "Hex code: %s", sprint_hex(tcode, 8)); + PrintAndLogEx(INFO, "Hex code reversed: %s", sprint_hex(rtcode, 8)); + } if (tcode[0] == 0xff && tcode[1] == 0xff) { // decoding code - if (!verbose) + if (!verbose) { PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8)); + PrintAndLogEx(INFO, "Texkom duplicator: %s", sprint_hex(rtcode, 8)); + } if (codefound == TexkomModTK13) PrintAndLogEx(INFO, "modulation: TK13"); From 67fc919c72b3fbb96b283893a374f9db5914fb44 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:45:48 +0300 Subject: [PATCH 22/24] make style --- armsrc/hfops.c | 2 +- client/src/cmdhftexkom.c | 129 +++++++++++++++++++-------------------- client/src/cmdhftexkom.h | 2 +- doc/commands.json | 31 ++++++++-- doc/commands.md | 10 +++ 5 files changed, 100 insertions(+), 74 deletions(-) diff --git a/armsrc/hfops.c b/armsrc/hfops.c index 37759d616..3bf060c56 100644 --- a/armsrc/hfops.c +++ b/armsrc/hfops.c @@ -84,7 +84,7 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); uint32_t scnt = getSampleCounter(); - reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, (uint8_t*)&scnt, 4); + reply_ng(CMD_HF_ACQ_RAW_ADC, PM3_SUCCESS, (uint8_t *)&scnt, 4); if (ledcontrol) LEDsoff(); return 0; diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index b5bb018fa..8d4f016f8 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -25,9 +25,9 @@ #include "cmdparser.h" // command_t #include "comms.h" #include "ui.h" -#include "cmdhf14a.h" -#include "cmddata.h" -#include "graph.h" +#include "cmdhf14a.h" +#include "cmddata.h" +#include "graph.h" #define TEXKOM_NOISE_THRESHOLD (10) @@ -101,12 +101,12 @@ static bool TexkomCorrelate(uint32_t indx, uint32_t threshold) { uint32_t g5 = GetGraphBuffer(indx + 2); return ( - (g3 > threshold) && - (g3 >= g2) && (g3 >= g1) && (g3 > g4) && (g3 > g5) - ); + (g3 > threshold) && + (g3 >= g2) && (g3 >= g1) && (g3 > g4) && (g3 > g5) + ); } -static bool TexkomCalculateMaxMin(uint32_t* data, uint32_t len, uint32_t* dmax, uint32_t* dmin) { +static bool TexkomCalculateMaxMin(uint32_t *data, uint32_t len, uint32_t *dmax, uint32_t *dmin) { *dmax = 0; *dmin = 0xffffffff; for (size_t i = 0; i < len; i++) { @@ -119,7 +119,7 @@ static bool TexkomCalculateMaxMin(uint32_t* data, uint32_t len, uint32_t* dmax, return (*dmax != 0) && (*dmin != 0xffffffff) && (*dmax > *dmin); } -static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi, uint32_t* low, uint32_t* lmax, uint32_t* lmin) { +static bool TexkomCalculateBitLengths(uint32_t *data, uint32_t len, uint32_t *hi, uint32_t *low, uint32_t *lmax, uint32_t *lmin) { *hi = 0; *low = 0; @@ -155,19 +155,19 @@ static bool TexkomCalculateBitLengths(uint32_t* data, uint32_t len, uint32_t* hi } inline bool TexcomCalculateBit(uint32_t data, uint32_t bitlen, uint32_t threshold) { - return - (data < (bitlen + threshold)) && + return + (data < (bitlen + threshold)) && (data > (bitlen - threshold)); } // code from https://github.com/li0ard/crclib/blob/main/index.js -static uint8_t TexcomTK13CRC(uint8_t* data) { +static uint8_t TexcomTK13CRC(uint8_t *data) { uint8_t crc = 0; uint8_t indx = 0; while (indx < 4) { crc = crc ^ data[indx++]; - for (uint8_t i = 0; i < 8; i++) + for (uint8_t i = 0; i < 8; i++) if (crc & 0x80) { crc = 0x31 ^ (crc << 1); } else @@ -177,71 +177,68 @@ static uint8_t TexcomTK13CRC(uint8_t* data) { return crc; } -static unsigned char dallas_crc8(const unsigned char * data, const unsigned int size) -{ +static unsigned char dallas_crc8(const unsigned char *data, const unsigned int size) { unsigned char crc = 0; - for ( unsigned int i = 0; i < size; ++i ) - { + for (unsigned int i = 0; i < size; ++i) { unsigned char inbyte = data[i]; - for ( unsigned char j = 0; j < 8; ++j ) - { + for (unsigned char j = 0; j < 8; ++j) { unsigned char mix = (crc ^ inbyte) & 0x01; crc >>= 1; - if ( mix ) crc ^= 0x8C; + if (mix) crc ^= 0x8C; inbyte >>= 1; } } -PrintAndLogEx(WARNING, "--crc %x", crc); + PrintAndLogEx(WARNING, "--crc %x", crc); return crc; } // code from https://github.com/li0ard/crclib/blob/main/index.js -static uint8_t TexcomTK17CRC(uint8_t* data) { +static uint8_t TexcomTK17CRC(uint8_t *data) { uint8_t ddata[8] = {0x00, 0x00, 0x00, data[0], data[1], data[2], data[3], 0x00}; -/* - dallas (arrby) { - var arrby2 = []; - if (arrby.length < 8) { - return "FF"; - } - var n = 0; - var n2 = 7; - while (n < 7){ - arrby2[n] = arrby[n2]; - ++n; - --n2; - } - var n3 = 0; - var n4 = 0; - do { - var n5 = 255 & arrby2[n3]; - var n6 = n4; - for (var n7 = 0; n7 < 8; n7 = Number(n7 + 1)) { - var n8 = 1 & (255 & (n6 ^ n5)); - n6 = 255 & n6 >> 1; - n5 = 255 & n5 >> 1; - if (n8 != 1) continue; - n6 ^= 140; - } - if ((n3 = Number(n3 + 1)) >= 7) { - return n6.toString(16).toUpperCase(); - } - n4 = n6; - } while (true); - } - tk17(arrby) { - if(arrby.length < 8) { - return "FF" - } - return this.dallas( [0x00, arrby[1], arrby[2], arrby[3], arrby[4], 0x00, 0x00, 0x00] ) - } -*/ + /* + dallas (arrby) { + var arrby2 = []; + if (arrby.length < 8) { + return "FF"; + } + var n = 0; + var n2 = 7; + while (n < 7){ + arrby2[n] = arrby[n2]; + ++n; + --n2; + } + var n3 = 0; + var n4 = 0; + do { + var n5 = 255 & arrby2[n3]; + var n6 = n4; + for (var n7 = 0; n7 < 8; n7 = Number(n7 + 1)) { + var n8 = 1 & (255 & (n6 ^ n5)); + n6 = 255 & n6 >> 1; + n5 = 255 & n5 >> 1; + if (n8 != 1) continue; + n6 ^= 140; + } + if ((n3 = Number(n3 + 1)) >= 7) { + return n6.toString(16).toUpperCase(); + } + n4 = n6; + } while (true); + } + tk17(arrby) { + if(arrby.length < 8) { + return "FF" + } + return this.dallas( [0x00, arrby[1], arrby[2], arrby[3], arrby[4], 0x00, 0x00, 0x00] ) + } + */ return dallas_crc8(ddata, 8); } -static bool TexcomTK13Decode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, char* cbitstring, bool verbose) { +static bool TexcomTK13Decode(uint32_t *implengths, uint32_t implengthslen, char *bitstring, char *cbitstring, bool verbose) { bitstring[0] = 0; cbitstring[0] = 0; @@ -275,7 +272,7 @@ static bool TexcomTK13Decode(uint32_t* implengths, uint32_t implengthslen, char* // add trailing impulse (some tags just ignore it) if (strlen(bitstring) % 2 != 0) { - if (bitstring[strlen(bitstring) - 1] == '1') + if (bitstring[strlen(bitstring) - 1] == '1') strcat(bitstring, "0"); else strcat(bitstring, "1"); @@ -316,7 +313,7 @@ inline int TexcomTK17Get2Bits(uint32_t len1, uint32_t len2) { return TK17Bit11; } -static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, char* cbitstring, bool verbose) { +static bool TexcomTK17Decode(uint32_t *implengths, uint32_t implengthslen, char *bitstring, char *cbitstring, bool verbose) { bitstring[0] = 0; cbitstring[0] = 0; @@ -324,7 +321,7 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* int dbit = TexcomTK17Get2Bits(implengths[i], implengths[i + 1]); if (dbit == TK17WrongBit) return false; - + switch (dbit) { case TK17Bit00: strcat(bitstring, "00"); @@ -359,8 +356,7 @@ static bool TexcomTK17Decode(uint32_t* implengths, uint32_t implengthslen, char* return (strlen(bitstring) == 64) && (strncmp(cbitstring, "1111111111111111", 16) == 0); } - -static bool TexcomGeneralDecode(uint32_t* implengths, uint32_t implengthslen, char* bitstring, bool verbose) { +static bool TexcomGeneralDecode(uint32_t *implengths, uint32_t implengthslen, char *bitstring, bool verbose) { uint32_t hilength = 0; uint32_t lowlength = 0; if (!TexkomCalculateBitLengths(implengths, implengthslen, &hilength, &lowlength, NULL, NULL)) @@ -400,7 +396,6 @@ static void TexcomReverseCode(const uint8_t *code, int length, uint8_t *reverse_ } }; - static int CmdHFTexkomReader(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf texkom reader", @@ -461,7 +456,7 @@ static int CmdHFTexkomReader(const char *Cmd) { noiselvl = TEXKOM_NOISE_THRESHOLD; //PrintAndLogEx(WARNING, "--- indx: %d, len: %d, max: %d, noise: %d", sindx, slen, maxlvl, noiselvl); - + uint32_t implengths[256] = {}; uint32_t implengthslen = 0; uint32_t impulseindx = 0; diff --git a/client/src/cmdhftexkom.h b/client/src/cmdhftexkom.h index 2e8a79658..a90d36033 100644 --- a/client/src/cmdhftexkom.h +++ b/client/src/cmdhftexkom.h @@ -38,4 +38,4 @@ enum TexkomModulation { int CmdHFTexkom(const char *Cmd); -#endif \ No newline at end of file +#endif diff --git a/doc/commands.json b/doc/commands.json index 4f6703656..db5be2717 100644 --- a/doc/commands.json +++ b/doc/commands.json @@ -2661,7 +2661,7 @@ }, "hf help": { "command": "hf help", - "description": "-------- ----------------------- High Frequency ----------------------- 14a { ISO14443A RFIDs... } 14b { ISO14443B RFIDs... } 15 { ISO15693 RFIDs... } cipurse { Cipurse transport Cards... } epa { German Identification Card... } emrtd { Machine Readable Travel Document... } felica { ISO18092 / FeliCa RFIDs... } fido { FIDO and FIDO2 authenticators... } gallagher { Gallagher DESFire RFIDs... } ksx6924 { KS X 6924 (T-Money, Snapper+) RFIDs } jooki { Jooki RFIDs... } iclass { ICLASS RFIDs... } legic { LEGIC RFIDs... } lto { LTO Cartridge Memory RFIDs... } mf { MIFARE RFIDs... } mfp { MIFARE Plus RFIDs... } mfu { MIFARE Ultralight RFIDs... } mfdes { MIFARE Desfire RFIDs... } ntag424 { NXP NTAG 4242 DNA RFIDs... } seos { SEOS RFIDs... } st25ta { ST25TA RFIDs... } thinfilm { Thinfilm RFIDs... } topaz { TOPAZ (NFC Type 1) RFIDs... } waveshare { Waveshare NFC ePaper... } ----------- --------------------- General --------------------- help This help list List protocol data in trace buffer search Search for known HF tags", + "description": "-------- ----------------------- High Frequency ----------------------- 14a { ISO14443A RFIDs... } 14b { ISO14443B RFIDs... } 15 { ISO15693 RFIDs... } cipurse { Cipurse transport Cards... } epa { German Identification Card... } emrtd { Machine Readable Travel Document... } felica { ISO18092 / FeliCa RFIDs... } fido { FIDO and FIDO2 authenticators... } gallagher { Gallagher DESFire RFIDs... } ksx6924 { KS X 6924 (T-Money, Snapper+) RFIDs } jooki { Jooki RFIDs... } iclass { ICLASS RFIDs... } legic { LEGIC RFIDs... } lto { LTO Cartridge Memory RFIDs... } mf { MIFARE RFIDs... } mfp { MIFARE Plus RFIDs... } mfu { MIFARE Ultralight RFIDs... } mfdes { MIFARE Desfire RFIDs... } ntag424 { NXP NTAG 4242 DNA RFIDs... } seos { SEOS RFIDs... } st25ta { ST25TA RFIDs... } thinfilm { Thinfilm RFIDs... } topaz { TOPAZ (NFC Type 1) RFIDs... } texkom { Texkom RFIDs... } waveshare { Waveshare NFC ePaper... } ----------- --------------------- General --------------------- help This help list List protocol data in trace buffer search Search for known HF tags", "notes": [], "offline": true, "options": [], @@ -6302,6 +6302,27 @@ ], "usage": "hf st25ta sim [-h] -u " }, + "hf texkom help": { + "command": "hf texkom help", + "description": "help This help", + "notes": [], + "offline": true, + "options": [], + "usage": "" + }, + "hf texkom reader": { + "command": "hf texkom reader", + "description": "Read a texkom tag", + "notes": [ + "hf texkom reader" + ], + "offline": false, + "options": [ + "-h, --help This help", + "-v, --verbose Verbose scan and output" + ], + "usage": "hf texkom reader [-hv]" + }, "hf thinfilm help": { "command": "hf thinfilm help", "description": "help This help list List NFC Barcode / Thinfilm history - not correct", @@ -6528,8 +6549,8 @@ "command": "hw connect", "description": "Connects to a Proxmark3 device via specified serial port. Baudrate here is only for physical UART or UART-BT, NOT for USB-CDC or blue shark add-on", "notes": [ - "hw connect -p /dev/ttyACM0", - "hw connect -p /dev/ttyACM0 -b 115200" + "hw connect -p /dev/ttyacm0", + "hw connect -p /dev/ttyacm0 -b 115200" ], "offline": true, "options": [ @@ -10998,8 +11019,8 @@ } }, "metadata": { - "commands_extracted": 693, + "commands_extracted": 695, "extracted_by": "PM3Help2JSON v1.00", - "extracted_on": "2022-06-12T09:54:12" + "extracted_on": "2022-06-28T08:43:20" } } \ No newline at end of file diff --git a/doc/commands.md b/doc/commands.md index 6421ba761..b9689c5c2 100644 --- a/doc/commands.md +++ b/doc/commands.md @@ -646,6 +646,16 @@ Check column "offline" for their availability. |`hf topaz raw `|N |`Send raw hex data to tag` +### hf texkom + + { Texkom RFIDs... } + +|command |offline |description +|------- |------- |----------- +|`hf texkom help `|Y |`This help` +|`hf texkom reader `|N |`Act like a Texkom reader` + + ### hf waveshare { Waveshare NFC ePaper... } From 4df92e2655a0e2899cac09393e0965b29fb887b1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 12:26:20 +0300 Subject: [PATCH 23/24] crc for tk17 works --- client/src/cmdhftexkom.c | 42 +--------------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 8d4f016f8..8cb73d6c0 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -188,7 +188,6 @@ static unsigned char dallas_crc8(const unsigned char *data, const unsigned int s inbyte >>= 1; } } - PrintAndLogEx(WARNING, "--crc %x", crc); return crc; } @@ -196,46 +195,7 @@ static unsigned char dallas_crc8(const unsigned char *data, const unsigned int s static uint8_t TexcomTK17CRC(uint8_t *data) { uint8_t ddata[8] = {0x00, 0x00, 0x00, data[0], data[1], data[2], data[3], 0x00}; - /* - dallas (arrby) { - var arrby2 = []; - if (arrby.length < 8) { - return "FF"; - } - var n = 0; - var n2 = 7; - while (n < 7){ - arrby2[n] = arrby[n2]; - ++n; - --n2; - } - var n3 = 0; - var n4 = 0; - do { - var n5 = 255 & arrby2[n3]; - var n6 = n4; - for (var n7 = 0; n7 < 8; n7 = Number(n7 + 1)) { - var n8 = 1 & (255 & (n6 ^ n5)); - n6 = 255 & n6 >> 1; - n5 = 255 & n5 >> 1; - if (n8 != 1) continue; - n6 ^= 140; - } - if ((n3 = Number(n3 + 1)) >= 7) { - return n6.toString(16).toUpperCase(); - } - n4 = n6; - } while (true); - } - tk17(arrby) { - if(arrby.length < 8) { - return "FF" - } - return this.dallas( [0x00, arrby[1], arrby[2], arrby[3], arrby[4], 0x00, 0x00, 0x00] ) - } - */ - - return dallas_crc8(ddata, 8); + return dallas_crc8(ddata, 7); } static bool TexcomTK13Decode(uint32_t *implengths, uint32_t implengthslen, char *bitstring, char *cbitstring, bool verbose) { From 22f1e8e209b9843a9e1c9a51d0aba48fbdc2db0d Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Tue, 28 Jun 2022 19:06:17 +0300 Subject: [PATCH 24/24] check noise at the antenna --- client/src/cmdhftexkom.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/client/src/cmdhftexkom.c b/client/src/cmdhftexkom.c index 8cb73d6c0..d810c2f16 100644 --- a/client/src/cmdhftexkom.c +++ b/client/src/cmdhftexkom.c @@ -38,6 +38,17 @@ inline uint32_t GetGraphBuffer(uint32_t indx) { return g_GraphBuffer[indx] + 128; } +static uint32_t TexkomAVGField(void) { + if (g_GraphTraceLen == 0) + return 0; + + uint64_t vsum = 0; + for (uint32_t i = 0; i < g_GraphTraceLen; i++) + vsum += GetGraphBuffer(i); + + return vsum / g_GraphTraceLen; +} + static uint32_t TexkomSearchStart(uint32_t indx, uint32_t threshold) { // one bit length = 27, minimal noise = 60 uint32_t lownoisectr = 0; @@ -398,8 +409,11 @@ static int CmdHFTexkomReader(const char *Cmd) { uint32_t sindx = 0; while (sindx < samplesCount - 5) { sindx = TexkomSearchStart(sindx, TEXKOM_NOISE_THRESHOLD); - if (sindx == 0 || sindx > samplesCount - 5) + if (sindx == 0 || sindx > samplesCount - 5) { + if (TexkomAVGField() > 30) + PrintAndLogEx(WARNING, "Too noisy environment. Try to move the tag from the antenna a bit."); break; + } uint32_t slen = TexkomSearchLength(sindx, TEXKOM_NOISE_THRESHOLD); if (slen == 0)