2010-02-21 08:47:22 +08:00
//-----------------------------------------------------------------------------
// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
2019-10-12 05:13:52 +08:00
// Modified by
// Marshellow
// Iceman
// Doegox
2010-02-21 08:47:22 +08:00
//
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
// at your option, any later version. See the LICENSE.txt file for the text of
// the license.
//-----------------------------------------------------------------------------
// Low frequency commands
//-----------------------------------------------------------------------------
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
# include "cmdlf.h"
2019-08-08 22:57:33 +08:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <limits.h>
# include <ctype.h>
2020-12-04 07:11:57 +08:00
# include "cmdparser.h" // command_t
2019-08-08 22:57:33 +08:00
# include "comms.h"
2020-12-04 07:11:57 +08:00
# include "commonutil.h" // ARRAYLEN
2019-08-08 22:57:33 +08:00
# include "lfdemod.h" // device/client demods of LF signals
# include "ui.h" // for show graph controls
2020-05-03 06:33:28 +08:00
# include "proxgui.h"
2020-12-04 07:11:57 +08:00
# include "cliparser.h" // args parsing
2019-08-08 22:57:33 +08:00
# include "graph.h" // for graph data
# include "cmddata.h" // for `lf search`
# include "cmdlfawid.h" // for awid menu
2020-12-04 07:11:57 +08:00
# include "cmdlfem.h" // for em menu
# include "cmdlfem410x.h" // for em4x menu
2020-10-17 01:13:40 +08:00
# include "cmdlfem4x05.h" // for em4x05 / 4x69
2020-10-20 07:00:23 +08:00
# include "cmdlfem4x50.h" // for em4x50
2020-12-06 06:47:03 +08:00
# include "cmdlfem4x70.h" // for em4x70
2019-08-08 22:57:33 +08:00
# include "cmdlfhid.h" // for hid menu
# include "cmdlfhitag.h" // for hitag menu
2020-09-29 03:09:26 +08:00
# include "cmdlfidteck.h" // for idteck menu
2019-08-08 22:57:33 +08:00
# include "cmdlfio.h" // for ioprox menu
# include "cmdlfcotag.h" // for COTAG meny
2020-10-12 18:27:00 +08:00
# include "cmdlfdestron.h" // for FDX-A FECAVA Destron menu
2020-10-12 04:38:52 +08:00
# include "cmdlffdxb.h" // for FDX-B menu
2020-09-29 03:09:26 +08:00
# include "cmdlfgallagher.h" // for GALLAGHER menu
# include "cmdlfguard.h" // for gproxii menu
# include "cmdlfindala.h" // for indala menu
# include "cmdlfjablotron.h" // for JABLOTRON menu
2019-08-08 22:57:33 +08:00
# include "cmdlfkeri.h" // for keri menu
2019-10-12 05:13:52 +08:00
# include "cmdlfmotorola.h" // for Motorola menu
2020-09-29 03:09:26 +08:00
# include "cmdlfnedap.h" // for NEDAP menu
# include "cmdlfnexwatch.h" // for nexwatch menu
# include "cmdlfnoralsy.h" // for NORALSY meny
# include "cmdlfpac.h" // for pac menu
# include "cmdlfparadox.h" // for paradox menu
# include "cmdlfpcf7931.h" // for pcf7931 menu
# include "cmdlfpresco.h" // for presco menu
# include "cmdlfpyramid.h" // for pyramid menu
# include "cmdlfsecurakey.h" // for securakey menu
# include "cmdlft55xx.h" // for t55xx menu
# include "cmdlfti.h" // for ti menu
# include "cmdlfviking.h" // for viking menu
# include "cmdlfvisa2000.h" // for VISA2000 menu
2019-08-08 22:57:33 +08:00
2020-09-17 23:17:28 +08:00
# define LF_CMDREAD_MAX_EXTRA_SYMBOLS 4
2020-06-02 02:45:37 +08:00
static bool g_lf_threshold_set = false ;
2017-02-27 21:04:50 +08:00
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
static int CmdHelp ( const char * Cmd ) ;
2021-02-02 23:33:43 +08:00
// Informative user function.
// loop and wait for either keyboard press or pm3 button to exit
// if key event, send break loop cmd to Pm3
int lfsim_wait_check ( uint32_t cmd ) {
2019-03-10 06:35:06 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( INFO , " Press " _GREEN_ ( " <Enter> " ) " or pm3-button to abort simulation " ) ;
for ( ; ; ) {
if ( kbd_enter_pressed ( ) ) {
SendCommandNG ( CMD_BREAK_LOOP , NULL , 0 ) ;
PrintAndLogEx ( DEBUG , " User aborted " ) ;
break ;
}
PacketResponseNG resp ;
if ( WaitForResponseTimeout ( cmd , & resp , 1000 ) ) {
if ( resp . status = = PM3_EOPABORTED ) {
PrintAndLogEx ( DEBUG , " Button pressed, user aborted " ) ;
break ;
}
}
}
PrintAndLogEx ( INFO , " Done " ) ;
2019-05-23 22:51:19 +08:00
return PM3_SUCCESS ;
2015-10-21 15:07:36 +08:00
}
2021-01-27 21:11:36 +08:00
2019-10-25 06:55:16 +08:00
static int CmdLFTune ( const char * Cmd ) {
2020-12-21 08:45:03 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf tune " ,
" Continuously measure LF antenna tuning. \n "
" Press button or <Enter> to interrupt. " ,
2020-12-21 09:06:43 +08:00
" lf tune \n "
2020-12-21 19:55:36 +08:00
" lf tune --mix "
2020-12-21 08:45:03 +08:00
) ;
char q_str [ 60 ] ;
snprintf ( q_str , sizeof ( q_str ) , " Frequency divisor. %d -> 134 kHz, %d -> 125 kHz " , LF_DIVISOR_134 , LF_DIVISOR_125 ) ;
void * argtable [ ] = {
arg_param_begin ,
2020-12-21 09:06:43 +08:00
arg_u64_0 ( " n " , " iter " , " <dec> " , " number of iterations (default: 0=infinite) " ) ,
2020-12-21 08:45:03 +08:00
arg_u64_0 ( " q " , " divisor " , " <dec> " , q_str ) ,
arg_dbl0 ( " f " , " freq " , " <float> " , " Frequency in kHz " ) ,
arg_lit0 ( NULL , " bar " , " bar style " ) ,
arg_lit0 ( NULL , " mix " , " mixed style " ) ,
arg_lit0 ( NULL , " value " , " values style " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
uint32_t iter = arg_get_u32_def ( ctx , 1 , 0 ) ;
uint8_t divisor = arg_get_u32_def ( ctx , 2 , LF_DIVISOR_125 ) ;
double freq = arg_get_dbl_def ( ctx , 3 , 125 ) ;
bool is_bar = arg_get_lit ( ctx , 4 ) ;
bool is_mix = arg_get_lit ( ctx , 5 ) ;
bool is_value = arg_get_lit ( ctx , 6 ) ;
CLIParserFree ( ctx ) ;
if ( divisor < 19 ) {
PrintAndLogEx ( ERR , " divisor must be between 19 and 255 " ) ;
return PM3_EINVARG ;
2019-10-04 03:18:37 +08:00
}
2020-12-21 08:45:03 +08:00
if ( ( freq < 47 ) | | ( freq > 600 ) ) {
PrintAndLogEx ( ERR , " freq must be between 47 and 600 " ) ;
return PM3_EINVARG ;
}
divisor = LF_FREQ2DIV ( freq ) ;
if ( ( is_bar + is_mix + is_value ) > 1 ) {
PrintAndLogEx ( ERR , " Select only one output style " ) ;
return PM3_EINVARG ;
}
barMode_t style = session . bar_mode ;
if ( is_bar )
style = STYLE_BAR ;
if ( is_mix )
style = STYLE_MIXED ;
if ( is_value )
style = STYLE_VALUE ;
2019-09-24 19:06:43 +08:00
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( INFO , " Measuring LF antenna at " _YELLOW_ ( " %.2f " ) " kHz, click " _GREEN_ ( " pm3 button " ) " or press " _GREEN_ ( " Enter " ) " to exit " , LF_DIV2FREQ ( divisor ) ) ;
2019-09-24 19:06:43 +08:00
2019-10-04 03:18:37 +08:00
uint8_t params [ ] = { 1 , 0 } ;
params [ 1 ] = divisor ;
2019-09-24 19:06:43 +08:00
PacketResponseNG resp ;
clearCommandBuffer ( ) ;
2020-02-24 16:44:48 +08:00
2019-10-04 03:18:37 +08:00
SendCommandNG ( CMD_MEASURE_ANTENNA_TUNING_LF , params , sizeof ( params ) ) ;
2019-09-24 19:06:43 +08:00
if ( ! WaitForResponseTimeout ( CMD_MEASURE_ANTENNA_TUNING_LF , & resp , 1000 ) ) {
PrintAndLogEx ( WARNING , " Timeout while waiting for Proxmark LF initialization, aborting " ) ;
return PM3_ETIMEOUT ;
}
2020-02-24 16:44:48 +08:00
2019-10-04 03:18:37 +08:00
params [ 0 ] = 2 ;
2020-12-21 08:45:03 +08:00
2020-12-21 09:06:43 +08:00
// #define MAX_ADC_LF_VOLTAGE 140800
2020-12-21 08:45:03 +08:00
uint32_t max = 71000 ;
bool first = true ;
2020-12-23 08:12:35 +08:00
print_progress ( 0 , max , style ) ;
2020-12-21 08:45:03 +08:00
2019-09-24 19:06:43 +08:00
// loop forever (till button pressed) if iter = 0 (default)
for ( uint8_t i = 0 ; iter = = 0 | | i < iter ; i + + ) {
2020-02-24 16:44:48 +08:00
if ( kbd_enter_pressed ( ) ) {
2019-09-24 19:06:43 +08:00
break ;
}
2020-02-24 16:44:48 +08:00
2019-10-04 03:18:37 +08:00
SendCommandNG ( CMD_MEASURE_ANTENNA_TUNING_LF , params , sizeof ( params ) ) ;
2019-09-24 19:06:43 +08:00
if ( ! WaitForResponseTimeout ( CMD_MEASURE_ANTENNA_TUNING_LF , & resp , 1000 ) ) {
2020-02-24 16:44:48 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-09-24 19:06:43 +08:00
PrintAndLogEx ( WARNING , " Timeout while waiting for Proxmark LF measure, aborting " ) ;
2020-12-21 08:45:03 +08:00
break ;
2019-09-24 19:06:43 +08:00
}
2020-02-24 16:44:48 +08:00
if ( ( resp . status = = PM3_EOPABORTED ) | | ( resp . length ! = sizeof ( uint32_t ) ) ) {
2020-12-21 08:45:03 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-09-24 19:06:43 +08:00
break ;
2020-02-24 16:44:48 +08:00
}
2019-09-24 21:44:16 +08:00
uint32_t volt = resp . data . asDwords [ 0 ] ;
2020-12-21 08:45:03 +08:00
if ( first ) {
2020-12-24 02:51:10 +08:00
max = ( volt * 1.03 ) ;
2020-12-21 08:45:03 +08:00
first = false ;
}
2020-12-24 02:51:10 +08:00
if ( volt > max ) {
max = ( volt * 1.03 ) ;
2020-12-21 08:45:03 +08:00
}
print_progress ( volt , max , style ) ;
2019-09-24 19:06:43 +08:00
}
2020-02-24 16:44:48 +08:00
2019-10-04 03:18:37 +08:00
params [ 0 ] = 3 ;
SendCommandNG ( CMD_MEASURE_ANTENNA_TUNING_LF , params , sizeof ( params ) ) ;
2019-09-24 19:06:43 +08:00
if ( ! WaitForResponseTimeout ( CMD_MEASURE_ANTENNA_TUNING_LF , & resp , 1000 ) ) {
PrintAndLogEx ( WARNING , " Timeout while waiting for Proxmark LF shutdown, aborting " ) ;
return PM3_ETIMEOUT ;
}
2020-12-21 08:45:03 +08:00
PrintAndLogEx ( NORMAL , " \x1b %c[2K \r " , 30 ) ;
2020-03-16 05:41:05 +08:00
PrintAndLogEx ( INFO , " Done. " ) ;
2019-09-24 19:06:43 +08:00
return PM3_SUCCESS ;
}
2015-11-10 18:42:59 +08:00
2015-10-17 05:16:46 +08:00
/* send a LF command before reading */
2019-03-10 18:20:22 +08:00
int CmdLFCommandRead ( const char * Cmd ) {
2021-02-05 05:01:23 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf cmdread " ,
" Modulate LF reader field to send command before read. All periods in microseconds. \n "
" - use " _YELLOW_ ( " `lf config` " ) _CYAN_ ( " to set parameters " ) ,
" lf cmdread -d 50 -z 116 -o 166 -e W3000 -c W00110 --> probing for Hitag 1/S \n "
" lf cmdread -d 50 -z 116 -o 166 -e W3000 -c W11000 --> probing for Hitag 2 \n "
" lf cmdread -d 50 -z 116 -o 166 -e W3000 -c W11000 -q -s 2000 -@ --> probing for Hitag 2, oscilloscope style \n "
" lf cmdread -d 48 -z 112 -o 176 -e W3000 -e S240 -e E336 -c W0S00000010000E --> probing for Hitag (us) \n "
) ;
2016-07-31 01:36:48 +08:00
2021-02-05 05:01:23 +08:00
char div_str [ 70 ] = { 0 } ;
sprintf ( div_str , " Extra symbol definition and duration (up to %i) " , LF_CMDREAD_MAX_EXTRA_SYMBOLS ) ;
void * argtable [ ] = {
arg_param_begin ,
arg_u64_0 ( " d " , " duration " , " <us> " , " delay OFF period, (0 for bitbang mode) " ) ,
arg_str0 ( " c " , " cmd " , " <0|1|...> " , " command symbols " ) ,
arg_strx0 ( " e " , " extra " , " <us> " , div_str ) ,
arg_u64_0 ( " o " , " one " , " <us> " , " ONE time period " ) ,
arg_u64_0 ( " z " , " zero " , " <us> " , " ZERO time period " ) ,
arg_u64_0 ( " s " , " samples " , " <dec> " , " number of samples to collect " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_lit0 ( " @ " , NULL , " continuous mode " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , false ) ;
uint32_t delay = arg_get_u32_def ( ctx , 1 , 0 ) ;
int cmd_len = 128 ;
char cmd [ 128 ] = { 0 } ;
2021-02-09 23:56:55 +08:00
CLIGetStrWithReturn ( ctx , 2 , ( uint8_t * ) cmd , & cmd_len ) ;
2021-02-05 05:01:23 +08:00
int extra_arg_len = 250 ;
char extra_arg [ 250 ] = { 0 } ;
2021-02-09 23:56:55 +08:00
CLIGetStrWithReturn ( ctx , 3 , ( uint8_t * ) extra_arg , & extra_arg_len ) ;
2021-02-05 05:01:23 +08:00
uint16_t period_1 = arg_get_u32_def ( ctx , 4 , 0 ) ;
uint16_t period_0 = arg_get_u32_def ( ctx , 5 , 0 ) ;
uint32_t samples = arg_get_u32_def ( ctx , 6 , 0 ) ;
bool verbose = arg_get_lit ( ctx , 7 ) ;
bool cm = arg_get_lit ( ctx , 8 ) ;
2021-02-09 23:56:55 +08:00
CLIParserFree ( ctx ) ;
2019-05-24 01:16:06 +08:00
2021-02-05 05:01:23 +08:00
if ( session . pm3_present = = false )
return PM3_ENOTTY ;
2019-04-20 07:08:07 +08:00
2020-09-17 23:17:28 +08:00
const uint8_t payload_header_size = 12 + ( 3 * LF_CMDREAD_MAX_EXTRA_SYMBOLS ) ;
2019-05-20 21:15:45 +08:00
struct p {
uint32_t delay ;
2020-09-17 23:17:28 +08:00
uint16_t period_0 ;
uint16_t period_1 ;
uint8_t symbol_extra [ LF_CMDREAD_MAX_EXTRA_SYMBOLS ] ;
uint16_t period_extra [ LF_CMDREAD_MAX_EXTRA_SYMBOLS ] ;
2020-09-16 18:52:04 +08:00
uint32_t samples : 31 ;
bool verbose : 1 ;
uint8_t data [ PM3_CMD_DATA_SIZE - payload_header_size ] ;
2019-05-24 01:16:06 +08:00
} PACKED payload ;
2021-02-05 05:01:23 +08:00
payload . delay = delay ;
payload . period_1 = period_1 ;
payload . period_0 = period_0 ;
2020-09-16 18:52:04 +08:00
payload . samples = samples ;
payload . verbose = verbose ;
2021-02-05 05:01:23 +08:00
memcpy ( payload . data , cmd , cmd_len ) ;
// extra symbol definition
2020-09-17 23:17:28 +08:00
uint8_t index_extra = 0 ;
2021-02-05 05:01:23 +08:00
int i = 0 ;
2021-02-09 23:56:55 +08:00
for ( ; i < extra_arg_len ; ) {
2021-02-05 05:01:23 +08:00
if ( index_extra < LF_CMDREAD_MAX_EXTRA_SYMBOLS - 1 ) {
payload . symbol_extra [ index_extra ] = extra_arg [ i ] ;
int tmp = atoi ( extra_arg + ( i + 1 ) ) ;
payload . period_extra [ index_extra ] = tmp ;
index_extra + + ;
i + + ;
while ( extra_arg [ i ] > = 0x30 & & extra_arg [ i ] < = 0x39 )
i + + ;
2019-05-20 21:15:45 +08:00
2021-02-05 05:01:23 +08:00
} else {
PrintAndLogEx ( WARNING , " Too many extra symbols, please define up to %i symbols " , LF_CMDREAD_MAX_EXTRA_SYMBOLS ) ;
2019-03-10 06:35:06 +08:00
}
}
2019-10-13 06:48:26 +08:00
// bitbang mode
if ( payload . delay = = 0 ) {
2020-09-17 23:17:28 +08:00
if ( payload . period_0 < 7 | | payload . period_1 < 7 ) {
2021-02-05 05:01:23 +08:00
PrintAndLogEx ( WARNING , " periods cannot be less than 7us in bit bang mode " ) ;
2019-10-13 06:48:26 +08:00
return PM3_EINVARG ;
}
}
2019-10-01 05:18:48 +08:00
2021-02-05 05:01:23 +08:00
PrintAndLogEx ( DEBUG , " Cmd read - settings " ) ;
PrintAndLogEx ( DEBUG , " ------------------- " ) ;
PrintAndLogEx ( DEBUG , " delay: %u , zero %u , one %u , samples %u " , payload . delay , payload . period_0 , payload . period_1 , payload . samples ) ;
PrintAndLogEx ( DEBUG , " Extra symbols " ) ;
PrintAndLogEx ( DEBUG , " ------------- " ) ;
for ( i = 0 ; i < LF_CMDREAD_MAX_EXTRA_SYMBOLS ; i + + ) {
if ( payload . symbol_extra [ i ] = = 0x00 )
continue ;
PrintAndLogEx ( DEBUG , " %c - %u " , payload . symbol_extra [ i ] , payload . period_extra [ i ] ) ;
2020-09-16 18:52:04 +08:00
}
2021-02-05 05:01:23 +08:00
PrintAndLogEx ( DEBUG , " data: %s " , payload . data ) ;
if ( cm ) {
PrintAndLogEx ( INFO , " Press " _GREEN_ ( " <Enter> " ) " to exit " ) ;
}
2020-09-16 18:52:04 +08:00
if ( verbose ) {
PrintAndLogEx ( SUCCESS , " Sending command... " ) ;
}
2019-03-10 06:35:06 +08:00
2020-09-16 18:52:04 +08:00
int ret = PM3_SUCCESS ;
do {
clearCommandBuffer ( ) ;
2021-02-05 05:01:23 +08:00
SendCommandNG ( CMD_LF_MOD_THEN_ACQ_RAW_ADC , ( uint8_t * ) & payload , payload_header_size + cmd_len ) ;
2019-10-01 01:39:34 +08:00
2020-09-16 18:52:04 +08:00
PacketResponseNG resp ;
2019-03-10 06:35:06 +08:00
2021-02-05 05:01:23 +08:00
i = 10 ;
2020-09-16 18:52:04 +08:00
// 20sec wait loop
while ( ! WaitForResponseTimeout ( CMD_LF_MOD_THEN_ACQ_RAW_ADC , & resp , 2000 ) & & i ! = 0 ) {
if ( verbose ) {
PrintAndLogEx ( NORMAL , " . " NOLF ) ;
}
i - - ;
}
if ( verbose ) {
PrintAndLogEx ( NORMAL , " " ) ;
}
2021-02-05 05:01:23 +08:00
if ( resp . status ! = PM3_SUCCESS ) {
2020-09-16 18:52:04 +08:00
PrintAndLogEx ( WARNING , " command failed. " ) ;
return PM3_ESOFT ;
2019-10-01 01:39:34 +08:00
}
2021-02-05 05:01:23 +08:00
if ( i ) {
if ( verbose ) {
PrintAndLogEx ( SUCCESS , " downloading response signal data " ) ;
}
getSamples ( samples , false ) ;
ret = PM3_SUCCESS ;
} else {
PrintAndLogEx ( WARNING , " timeout while waiting for reply. " ) ;
return PM3_ETIMEOUT ;
2020-09-16 18:52:04 +08:00
}
2021-02-05 05:01:23 +08:00
} while ( cm & & kbd_enter_pressed ( ) = = false ) ;
2020-09-16 18:52:04 +08:00
return ret ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2019-03-10 18:20:22 +08:00
int CmdFlexdemod ( const char * Cmd ) {
2019-04-10 18:23:40 +08:00
( void ) Cmd ; // Cmd is not used so far
2019-02-25 03:11:05 +08:00
# ifndef LONG_WAIT
# define LONG_WAIT 100
# endif
2019-04-10 14:55:29 +08:00
int i , j , start , bit , sum ;
2019-03-10 06:35:06 +08:00
int data [ GraphTraceLen ] ;
memcpy ( data , GraphBuffer , GraphTraceLen ) ;
size_t size = GraphTraceLen ;
for ( i = 0 ; i < GraphTraceLen ; + + i )
data [ i ] = ( data [ i ] < 0 ) ? - 1 : 1 ;
for ( start = 0 ; start < size - LONG_WAIT ; start + + ) {
int first = data [ start ] ;
for ( i = start ; i < start + LONG_WAIT ; i + + ) {
if ( data [ i ] ! = first ) {
break ;
}
}
if ( i = = ( start + LONG_WAIT ) )
break ;
}
if ( start = = size - LONG_WAIT ) {
2019-03-12 06:12:31 +08:00
PrintAndLogEx ( WARNING , " nothing to wait for " ) ;
2019-05-24 01:16:06 +08:00
return PM3_ENODATA ;
2019-03-10 06:35:06 +08:00
}
data [ start ] = 4 ;
2019-03-10 07:00:59 +08:00
data [ start + 1 ] = 0 ;
2019-03-10 06:35:06 +08:00
uint8_t bits [ 64 ] = { 0x00 } ;
i = start ;
for ( bit = 0 ; bit < 64 ; bit + + ) {
sum = 0 ;
2019-04-08 02:13:30 +08:00
for ( j = 0 ; j < 16 ; j + + ) {
2019-03-10 06:35:06 +08:00
sum + = data [ i + + ] ;
}
bits [ bit ] = ( sum > 0 ) ? 1 : 0 ;
PrintAndLogEx ( NORMAL , " bit %d sum %d " , bit , sum ) ;
}
for ( bit = 0 ; bit < 64 ; bit + + ) {
sum = 0 ;
for ( j = 0 ; j < 16 ; j + + )
sum + = data [ i + + ] ;
2019-03-10 21:42:43 +08:00
if ( sum > 0 & & bits [ bit ] ! = 1 ) PrintAndLogEx ( WARNING , " oops1 at %d " , bit ) ;
2019-03-10 06:35:06 +08:00
2019-03-10 21:42:43 +08:00
if ( sum < 0 & & bits [ bit ] ! = 0 ) PrintAndLogEx ( WARNING , " oops2 at %d " , bit ) ;
2019-03-10 06:35:06 +08:00
}
// iceman, use demod buffer? blue line?
// HACK writing back to graphbuffer.
GraphTraceLen = 32 * 64 ;
i = 0 ;
for ( bit = 0 ; bit < 64 ; bit + + ) {
2019-04-10 14:55:29 +08:00
int phase = ( bits [ bit ] = = 0 ) ? 0 : 1 ;
2019-03-10 06:35:06 +08:00
for ( j = 0 ; j < 32 ; j + + ) {
GraphBuffer [ i + + ] = phase ;
phase = ! phase ;
}
}
RepaintGraphWindow ( ) ;
2019-05-24 01:16:06 +08:00
return PM3_SUCCESS ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2012-07-02 16:37:50 +08:00
2020-03-05 18:16:05 +08:00
int lf_getconfig ( sample_config * config ) {
if ( ! session . pm3_present ) return PM3_ENOTTY ;
if ( config = = NULL )
return PM3_EINVARG ;
clearCommandBuffer ( ) ;
SendCommandNG ( CMD_LF_SAMPLING_GET_CONFIG , NULL , 0 ) ;
PacketResponseNG resp ;
if ( ! WaitForResponseTimeout ( CMD_LF_SAMPLING_GET_CONFIG , & resp , 2000 ) ) {
PrintAndLogEx ( WARNING , " command execution time out " ) ;
return PM3_ETIMEOUT ;
}
2020-03-05 18:27:42 +08:00
memcpy ( config , resp . data . asBytes , sizeof ( sample_config ) ) ;
2020-03-05 18:16:05 +08:00
return PM3_SUCCESS ;
}
2019-10-12 05:13:52 +08:00
int lf_config ( sample_config * config ) {
if ( ! session . pm3_present ) return PM3_ENOTTY ;
clearCommandBuffer ( ) ;
2020-01-10 02:28:44 +08:00
if ( config ! = NULL )
SendCommandNG ( CMD_LF_SAMPLING_SET_CONFIG , ( uint8_t * ) config , sizeof ( sample_config ) ) ;
2020-01-13 00:28:12 +08:00
else
2020-03-05 18:16:05 +08:00
SendCommandNG ( CMD_LF_SAMPLING_PRINT_CONFIG , NULL , 0 ) ;
2020-01-13 00:28:12 +08:00
2019-10-12 05:13:52 +08:00
return PM3_SUCCESS ;
}
2019-10-04 04:11:16 +08:00
int CmdLFConfig ( const char * Cmd ) {
2021-02-03 23:00:54 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf config " ,
" Get/Set config for LF sampling, bit/sample, decimation, frequency \n "
" These changes are temporary, will be reset after a power cycle. \n \n "
" - use " _YELLOW_ ( " `lf read` " ) _CYAN_ ( " performs a read (active field) \n " )
_CYAN_ ( " - use " ) _YELLOW_ ( " `lf sniff` " ) _CYAN_ ( " performs a sniff (no active field) " ) ,
" lf config --> shows current config \n "
" lf config -b 8 --125 --> samples at 125 kHz, 8 bps \n "
2021-02-05 05:01:23 +08:00
" lf config -b 4 --134 --dec 3 --> samples at 134 kHz, averages three samples into one, stored with a resolution of 4 bits per sample \n "
2021-02-03 23:00:54 +08:00
" lf config --trig 20 -s 10000 --> trigger sampling when above 20, skip 10 000 first samples after triggered \n "
) ;
2019-05-24 01:16:06 +08:00
2021-02-03 23:00:54 +08:00
char div_str [ 70 ] = { 0 } ;
sprintf ( div_str , " Manually set freq divisor. %d -> 134 kHz, %d -> 125 kHz " , LF_DIVISOR_134 , LF_DIVISOR_125 ) ;
void * argtable [ ] = {
arg_param_begin ,
arg_lit0 ( NULL , " 125 " , " 125 kHz frequency " ) ,
arg_lit0 ( NULL , " 134 " , " 134 kHz frequency " ) ,
arg_int0 ( " a " , " avg " , " <0|1> " , " averaging - if set, will average the stored sample value when decimating (default 1) " ) ,
arg_int0 ( " b " , " bps " , " <1-8> " , " sets resolution of bits per sample (default 8) " ) ,
arg_int0 ( NULL , " dec " , " <1-8> " , " sets decimation. A value of N saves only 1 in N samples (default 1) " ) ,
arg_int0 ( NULL , " divisor " , " <19-255> " , div_str ) ,
arg_int0 ( " f " , " freq " , " <47-600> " , " manually set frequency in kHz " ) ,
2021-02-05 05:01:23 +08:00
arg_lit0 ( " r " , " reset " , " reset values to defaults " ) ,
2021-02-03 23:00:54 +08:00
arg_int0 ( " s " , " skip " , " <dec> " , " sets a number of samples to skip before capture (default 0) " ) ,
arg_int0 ( " t " , " trig " , " <0-128> " , " sets trigger threshold. 0 means no threshold " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
bool use_125 = arg_get_lit ( ctx , 1 ) ;
bool use_134 = arg_get_lit ( ctx , 2 ) ;
int8_t avg = arg_get_int_def ( ctx , 3 , 0 ) ;
int8_t bps = arg_get_int_def ( ctx , 4 , - 1 ) ;
int8_t dec = arg_get_int_def ( ctx , 5 , - 1 ) ;
int16_t div = arg_get_int_def ( ctx , 6 , - 1 ) ;
int16_t freq = arg_get_int_def ( ctx , 7 , - 1 ) ;
2021-02-05 05:01:23 +08:00
bool reset = arg_get_lit ( ctx , 8 ) ;
int32_t skip = arg_get_int_def ( ctx , 9 , - 1 ) ;
int16_t trigg = arg_get_int_def ( ctx , 10 , - 1 ) ;
2021-02-09 23:56:55 +08:00
CLIParserFree ( ctx ) ;
2021-02-03 23:00:54 +08:00
2021-02-09 23:56:55 +08:00
if ( session . pm3_present = = false )
2021-02-03 23:00:54 +08:00
return PM3_ENOTTY ;
2019-05-24 01:16:06 +08:00
2020-01-10 02:28:44 +08:00
// if called with no params, just print the device config
if ( strlen ( Cmd ) = = 0 ) {
return lf_config ( NULL ) ;
}
2019-09-29 08:43:01 +08:00
2021-02-03 23:00:54 +08:00
if ( use_125 + use_134 > 1 ) {
2021-02-09 23:56:55 +08:00
PrintAndLogEx ( ERR , " use only one of 125 or 134 params " ) ;
2021-02-03 23:00:54 +08:00
return PM3_EINVARG ;
}
2020-01-10 02:28:44 +08:00
sample_config config = {
2020-01-13 00:28:12 +08:00
. decimation = - 1 ,
. bits_per_sample = - 1 ,
. averaging = - 1 ,
. divisor = - 1 ,
. trigger_threshold = - 1 ,
. samples_to_skip = - 1 ,
. verbose = true
2020-01-10 02:28:44 +08:00
} ;
2020-01-13 00:28:12 +08:00
2021-02-05 05:01:23 +08:00
if ( reset ) {
config . decimation = 1 ;
config . bits_per_sample = 8 ;
config . averaging = 1 ,
config . divisor = LF_DIVISOR_125 ;
2021-02-09 23:56:55 +08:00
config . samples_to_skip = 0 ;
2021-02-05 05:01:23 +08:00
config . trigger_threshold = 0 ;
g_lf_threshold_set = false ;
}
2021-02-03 23:00:54 +08:00
if ( use_125 )
config . divisor = LF_DIVISOR_125 ;
if ( use_134 )
config . divisor = LF_DIVISOR_134 ;
config . averaging = ( avg = = 1 ) ;
if ( bps > - 1 ) {
// bps is limited to 8
config . bits_per_sample = ( bps & 0x0F ) ;
if ( config . bits_per_sample > 8 )
config . bits_per_sample = 8 ;
}
2020-01-10 02:28:44 +08:00
2021-02-09 23:56:55 +08:00
if ( dec > - 1 ) {
2021-02-03 23:00:54 +08:00
// decimation is limited to 8
config . decimation = ( dec & 0x0F ) ;
if ( config . decimation > 8 )
config . decimation = 8 ;
}
2020-01-10 02:28:44 +08:00
2021-02-09 23:56:55 +08:00
if ( div > - 1 ) {
2021-02-03 23:00:54 +08:00
config . divisor = div ;
if ( config . divisor < 19 ) {
PrintAndLogEx ( ERR , " divisor must be between 19 and 255 " ) ;
return PM3_EINVARG ;
}
}
2020-01-10 02:28:44 +08:00
2021-02-09 23:56:55 +08:00
if ( freq > - 1 ) {
2021-02-03 23:00:54 +08:00
config . divisor = LF_FREQ2DIV ( freq ) ;
if ( config . divisor < 19 ) {
PrintAndLogEx ( ERR , " freq must be between 47 and 600 " ) ;
return PM3_EINVARG ;
2019-03-10 06:35:06 +08:00
}
}
2021-02-03 23:00:54 +08:00
if ( trigg > - 1 ) {
config . trigger_threshold = trigg ;
g_lf_threshold_set = ( config . trigger_threshold > 0 ) ;
}
2019-03-10 06:35:06 +08:00
2021-02-03 23:00:54 +08:00
config . samples_to_skip = skip ;
2019-10-12 05:13:52 +08:00
return lf_config ( & config ) ;
2015-01-31 06:03:44 +08:00
}
2015-01-29 07:57:22 +08:00
2020-01-08 05:05:01 +08:00
int lf_read ( bool verbose , uint32_t samples ) {
2019-05-24 01:16:06 +08:00
if ( ! session . pm3_present ) return PM3_ENOTTY ;
2019-05-20 22:48:51 +08:00
struct p {
2020-09-16 18:52:04 +08:00
uint32_t samples : 31 ;
bool verbose : 1 ;
2019-05-20 22:48:51 +08:00
} PACKED ;
struct p payload ;
2020-01-08 05:05:01 +08:00
payload . verbose = verbose ;
2019-05-20 22:48:51 +08:00
payload . samples = samples ;
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-08-04 01:17:00 +08:00
SendCommandNG ( CMD_LF_ACQ_RAW_ADC , ( uint8_t * ) & payload , sizeof ( payload ) ) ;
2019-04-18 18:43:35 +08:00
PacketResponseNG resp ;
2019-03-10 06:35:06 +08:00
if ( g_lf_threshold_set ) {
2019-08-04 01:17:00 +08:00
WaitForResponse ( CMD_LF_ACQ_RAW_ADC , & resp ) ;
2019-03-10 06:35:06 +08:00
} else {
2019-08-04 01:17:00 +08:00
if ( ! WaitForResponseTimeout ( CMD_LF_ACQ_RAW_ADC , & resp , 2500 ) ) {
2020-09-06 05:57:44 +08:00
PrintAndLogEx ( WARNING , " (lf_read) command execution time out " ) ;
2019-05-20 22:48:51 +08:00
return PM3_ETIMEOUT ;
2019-03-10 06:35:06 +08:00
}
}
2019-05-20 22:48:51 +08:00
2020-09-07 16:39:15 +08:00
// response is number of bits read
uint32_t size = ( resp . data . asDwords [ 0 ] / 8 ) ;
2020-09-06 05:57:44 +08:00
getSamples ( size , verbose ) ;
2019-05-20 22:48:51 +08:00
return PM3_SUCCESS ;
2017-07-30 15:17:48 +08:00
}
2019-03-10 18:20:22 +08:00
int CmdLFRead ( const char * Cmd ) {
2021-02-03 17:33:02 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf read " ,
" Sniff low frequency signal. \n "
" - use " _YELLOW_ ( " `lf config` " ) _CYAN_ ( " to set parameters. \n " )
_CYAN_ ( " - use " ) _YELLOW_ ( " `data plot` " ) _CYAN_ ( " to look at it " ) ,
" lf read -v -s 12000 --> collect 12000 samples \n "
" lf read -s 3000 -@ --> oscilloscope style \n "
) ;
2019-03-09 15:59:13 +08:00
2021-02-03 17:33:02 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_u64_0 ( " s " , " samples " , " <dec> " , " number of samples to collect " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_lit0 ( " @ " , NULL , " continuous reading mode " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
uint32_t samples = arg_get_u32_def ( ctx , 1 , 0 ) ;
bool verbose = arg_get_lit ( ctx , 2 ) ;
bool cm = arg_get_lit ( ctx , 3 ) ;
CLIParserFree ( ctx ) ;
2019-03-10 06:35:06 +08:00
2021-02-03 17:33:02 +08:00
if ( session . pm3_present = = false )
return PM3_ENOTTY ;
2019-03-10 06:35:06 +08:00
2021-02-03 17:33:02 +08:00
if ( cm ) {
PrintAndLogEx ( INFO , " Press " _GREEN_ ( " <Enter> " ) " to exit " ) ;
2020-09-16 08:38:28 +08:00
}
int ret = PM3_SUCCESS ;
do {
ret = lf_read ( verbose , samples ) ;
2021-02-05 05:01:23 +08:00
} while ( cm & & kbd_enter_pressed ( ) = = false ) ;
2020-09-16 08:38:28 +08:00
return ret ;
2015-01-31 06:03:44 +08:00
}
2015-01-29 07:57:22 +08:00
2020-09-20 17:12:38 +08:00
int lf_sniff ( bool verbose , uint32_t samples ) {
2019-05-24 01:16:06 +08:00
if ( ! session . pm3_present ) return PM3_ENOTTY ;
2020-09-20 17:12:38 +08:00
struct p {
uint32_t samples : 31 ;
bool verbose : 1 ;
} PACKED ;
struct p payload ;
payload . verbose = verbose ;
payload . samples = samples ;
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2020-09-20 17:12:38 +08:00
SendCommandNG ( CMD_LF_SNIFF_RAW_ADC , ( uint8_t * ) & payload , sizeof ( payload ) ) ;
PacketResponseNG resp ;
if ( g_lf_threshold_set ) {
WaitForResponse ( CMD_LF_SNIFF_RAW_ADC , & resp ) ;
} else {
if ( ! WaitForResponseTimeout ( CMD_LF_SNIFF_RAW_ADC , & resp , 2500 ) ) {
PrintAndLogEx ( WARNING , " (lf_read) command execution time out " ) ;
return PM3_ETIMEOUT ;
}
}
// response is number of bits read
uint32_t size = ( resp . data . asDwords [ 0 ] / 8 ) ;
getSamples ( size , verbose ) ;
2019-05-24 01:16:06 +08:00
return PM3_SUCCESS ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2020-09-20 17:12:38 +08:00
int CmdLFSniff ( const char * Cmd ) {
2021-02-03 16:22:36 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf sniff " ,
" Sniff low frequency signal. \n "
" - use " _YELLOW_ ( " `lf config` " ) _CYAN_ ( " to set parameters. \n " )
_CYAN_ ( " - use " ) _YELLOW_ ( " `data plot` " ) _CYAN_ ( " to look at it " ) ,
" lf sniff -v \n "
" lf sniff -s 3000 -@ --> oscilloscope style \n "
) ;
2020-09-20 17:12:38 +08:00
2021-02-03 16:22:36 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_u64_0 ( " s " , " samples " , " <dec> " , " number of samples to collect " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_lit0 ( " @ " , NULL , " continuous sniffing mode " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
uint32_t samples = arg_get_u32_def ( ctx , 1 , 0 ) ;
bool verbose = arg_get_lit ( ctx , 2 ) ;
bool cm = arg_get_lit ( ctx , 3 ) ;
CLIParserFree ( ctx ) ;
2020-09-20 17:12:38 +08:00
2021-02-03 16:22:36 +08:00
if ( session . pm3_present = = false )
return PM3_ENOTTY ;
2020-09-20 17:12:38 +08:00
2021-02-03 16:22:36 +08:00
if ( cm ) {
PrintAndLogEx ( INFO , " Press " _GREEN_ ( " <Enter> " ) " to exit " ) ;
2020-09-20 17:12:38 +08:00
}
int ret = PM3_SUCCESS ;
do {
ret = lf_sniff ( verbose , samples ) ;
2021-02-03 16:22:36 +08:00
} while ( cm & & ! kbd_enter_pressed ( ) ) ;
2020-09-20 17:12:38 +08:00
return ret ;
}
2021-02-05 23:37:20 +08:00
static void lf_chk_bitstream ( void ) {
2019-03-10 06:35:06 +08:00
// convert to bitstream if necessary
2019-03-10 07:00:59 +08:00
for ( int i = 0 ; i < ( int ) ( GraphTraceLen / 2 ) ; i + + ) {
2019-03-10 06:35:06 +08:00
if ( GraphBuffer [ i ] > 1 | | GraphBuffer [ i ] < 0 ) {
CmdGetBitStream ( " " ) ;
2021-02-05 23:37:20 +08:00
PrintAndLogEx ( INFO , " converted Graphbuffer to bitstream values (0|1) " ) ;
2019-03-10 06:35:06 +08:00
break ;
}
}
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2019-10-12 05:13:52 +08:00
2021-02-05 05:36:08 +08:00
// Uploads GraphBuffer to device, in order to be used for LF SIM.
int lfsim_upload_gb ( void ) {
2019-10-06 05:56:19 +08:00
PrintAndLogEx ( DEBUG , " DEBUG: Uploading %zu bytes " , GraphTraceLen ) ;
2019-05-22 20:32:30 +08:00
struct pupload {
uint8_t flag ;
uint16_t offset ;
uint8_t data [ PM3_CMD_DATA_SIZE - 3 ] ;
2019-05-23 18:12:20 +08:00
} PACKED payload_up ;
2019-05-22 20:32:30 +08:00
2019-06-08 03:40:33 +08:00
// flag =
// b0 0
2019-05-22 20:32:30 +08:00
// 1 clear bigbuff
2019-05-23 22:51:19 +08:00
payload_up . flag = 0x1 ;
2019-03-09 15:59:13 +08:00
2019-04-30 16:10:25 +08:00
// fast push mode
conn . block_after_ACK = true ;
2019-05-01 07:38:52 +08:00
2021-02-02 06:52:48 +08:00
PacketResponseNG resp ;
2019-03-10 06:35:06 +08:00
//can send only 512 bits at a time (1 byte sent per bit...)
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( INFO , " . " NOLF ) ;
2019-05-22 20:32:30 +08:00
for ( uint16_t i = 0 ; i < GraphTraceLen ; i + = PM3_CMD_DATA_SIZE - 3 ) {
size_t len = MIN ( ( GraphTraceLen - i ) , PM3_CMD_DATA_SIZE - 3 ) ;
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-05-22 20:32:30 +08:00
payload_up . offset = i ;
2019-06-08 03:40:33 +08:00
for ( uint16_t j = 0 ; j < len ; j + + )
payload_up . data [ j ] = GraphBuffer [ i + j ] ;
2019-08-04 01:17:00 +08:00
SendCommandNG ( CMD_LF_UPLOAD_SIM_SAMPLES , ( uint8_t * ) & payload_up , sizeof ( struct pupload ) ) ;
2020-04-30 02:33:29 +08:00
WaitForResponse ( CMD_LF_UPLOAD_SIM_SAMPLES , & resp ) ;
if ( resp . status ! = PM3_SUCCESS ) {
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( INFO , " Bigbuf is full " ) ;
2020-04-30 02:33:29 +08:00
break ;
}
2020-08-29 20:52:11 +08:00
PrintAndLogEx ( NORMAL , " . " NOLF ) ;
2019-05-22 20:32:30 +08:00
payload_up . flag = 0 ;
2019-03-10 06:35:06 +08:00
}
2021-02-05 05:36:08 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-04-30 16:10:25 +08:00
2019-05-09 04:45:20 +08:00
// Disable fast mode before last command
2019-04-30 16:10:25 +08:00
conn . block_after_ACK = false ;
2021-02-05 05:36:08 +08:00
return PM3_SUCCESS ;
}
//Attempt to simulate any wave in buffer (one bit per output sample)
// converts GraphBuffer to bitstream (based on zero crossings) if needed.
int CmdLFSim ( const char * Cmd ) {
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf sim " ,
" Simulate low frequency tag from graphbuffer \n "
" Use " _YELLOW_ ( " `lf config` " ) _CYAN_ ( " to set parameters " ) ,
" lf sim \n "
" lf sim --gap 240 --> start simulating with 240ms gap "
) ;
void * argtable [ ] = {
arg_param_begin ,
arg_u64_0 ( " g " , " gap " , " <ms> " , " start gap in microseconds " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
uint16_t gap = arg_get_u32_def ( ctx , 1 , 0 ) ;
2021-02-09 23:56:55 +08:00
CLIParserFree ( ctx ) ;
2021-02-05 05:36:08 +08:00
if ( session . pm3_present = = false ) {
PrintAndLogEx ( DEBUG , " DEBUG: no proxmark present " ) ;
return PM3_ENOTTY ;
}
// sanity check
if ( GraphTraceLen < 20 ) {
PrintAndLogEx ( ERR , " No data in Graphbuffer " ) ;
return PM3_ENODATA ;
}
// convert to bitstream if necessary
2021-02-05 23:37:20 +08:00
lf_chk_bitstream ( ) ;
2021-02-05 05:36:08 +08:00
lfsim_upload_gb ( ) ;
2019-05-22 20:32:30 +08:00
struct p {
uint16_t len ;
uint16_t gap ;
2019-05-23 22:51:19 +08:00
} PACKED payload ;
2019-05-22 20:32:30 +08:00
payload . len = GraphTraceLen ;
2019-06-08 03:40:33 +08:00
payload . gap = gap ;
2016-10-20 07:16:32 +08:00
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2021-02-09 23:56:55 +08:00
SendCommandNG ( CMD_LF_SIMULATE , ( uint8_t * ) & payload , sizeof ( payload ) ) ;
2021-02-02 23:33:43 +08:00
return lfsim_wait_check ( CMD_LF_SIMULATE ) ;
2015-02-22 10:36:02 +08:00
}
2015-03-08 12:31:23 +08:00
2019-10-12 05:13:52 +08:00
// sim fsk data given clock, fcHigh, fcLow, invert
2015-02-20 10:35:34 +08:00
// - allow pull data from DemodBuffer
2019-03-10 18:20:22 +08:00
int CmdLFfskSim ( const char * Cmd ) {
2021-02-02 23:33:43 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf simfsk " ,
" Simulate FSK tag from demodbuffer or input. There are about four FSK modulations to know of. \n "
" FSK1 - where fc/8 = high and fc/5 = low \n "
" FSK1a - is inverted FSK1, ie: fc/5 = high and fc/8 = low \n "
" FSK2 - where fc/10 = high and fc/8 = low \n "
" FSK2a - is inverted FSK2, ie: fc/10 = high and fc/8 = low \n \n "
" NOTE: if you set one clock manually set them all manually " ,
" lf simfsk -c 40 --high 8 --low 5 -d 010203 --> FSK1 rf/40 data 010203 \n "
" lf simfsk -c 40 --high 5 --low 8 -d 010203 --> FSK1a rf/40 data 010203 \n "
" lf simfsk -c 64 --high 10 --low 8 -d 010203 --> FSK2 rf/64 data 010203 \n "
" lf simfsk -c 64 --high 8 --low 10 -d 010203 --> FSK2a rf/64 data 010203 \n \n "
" lf simfsk -c 50 --high 10 --low 8 -d 1D5559555569A9A555A59569 --> simulate HID Prox tag manually \n "
" lf simfsk -c 50 --high 10 --low 8 --stt -d 011DB2487E8D811111111111 --> simulate AWID tag manually "
) ;
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_u64_0 ( " c " , " clk " , " <dec> " , " manually set clock - can autodetect if using DemodBuffer (default 64) " ) ,
arg_u64_0 ( NULL , " low " , " <dec> " , " manually set larger Field Clock " ) ,
2021-02-09 23:56:55 +08:00
arg_u64_0 ( NULL , " high " , " <dec> " , " manually set smaller Field Clock " ) ,
2021-02-02 23:33:43 +08:00
arg_lit0 ( NULL , " stt " , " TBD! - STT to enable a gap between playback repetitions (default: no gap) " ) ,
arg_str0 ( " d " , " data " , " <hex> " , " data to sim - omit to use DemodBuffer " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
uint8_t clk = arg_get_u32_def ( ctx , 1 , 0 ) ;
uint8_t fclow = arg_get_u32_def ( ctx , 2 , 0 ) ;
uint8_t fchigh = arg_get_u32_def ( ctx , 3 , 0 ) ;
bool separator = arg_get_lit ( ctx , 4 ) ;
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
int raw_len = 64 ;
char raw [ 64 ] = { 0 } ;
2021-02-09 23:56:55 +08:00
CLIGetStrWithReturn ( ctx , 5 , ( uint8_t * ) raw , & raw_len ) ;
2021-02-02 23:33:43 +08:00
bool verbose = arg_get_lit ( ctx , 6 ) ;
2021-02-09 23:56:55 +08:00
CLIParserFree ( ctx ) ;
2019-03-10 06:35:06 +08:00
// No args
2021-02-02 23:33:43 +08:00
if ( raw_len = = 0 & & DemodBufferLen = = 0 ) {
PrintAndLogEx ( ERR , " No user supplied data nor inside Demodbuffer " ) ;
return PM3_EINVARG ;
}
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
if ( verbose & & separator ) {
PrintAndLogEx ( INFO , " STT gap isn't implemented yet. Skipping... " ) ;
separator = 0 ;
}
uint8_t bs [ 256 ] = { 0x00 } ;
int bs_len = hextobinarray ( ( char * ) bs , raw ) ;
if ( bs_len = = 0 ) {
// Using data from DemodBuffer
// might be able to autodetect FC and clock from Graphbuffer if using demod buffer
// will need clock, fchigh, fclow and bitstream
PrintAndLogEx ( INFO , " No user supplied data, using Demodbuffer... " ) ;
if ( clk = = 0 | | fchigh = = 0 | | fclow = = 0 ) {
int firstClockEdge = 0 ;
bool res = fskClocks ( & fchigh , & fclow , & clk , & firstClockEdge ) ;
if ( res = = false ) {
clk = 0 ;
fchigh = 0 ;
fclow = 0 ;
2019-03-10 06:35:06 +08:00
}
}
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( DEBUG , " Detected rf/%u, High fc/%u, Low fc/%u, n %zu " , clk , fchigh , fclow , DemodBufferLen ) ;
2019-03-10 06:35:06 +08:00
} else {
2021-02-02 23:33:43 +08:00
setDemodBuff ( bs , bs_len , 0 ) ;
2019-03-10 06:35:06 +08:00
}
//default if not found
2021-02-02 23:33:43 +08:00
if ( clk = = 0 ) {
clk = 50 ;
PrintAndLogEx ( DEBUG , " Autodetection of clock failed, falling back to rf/%u " , clk ) ;
}
if ( fchigh = = 0 ) {
fchigh = 10 ;
PrintAndLogEx ( DEBUG , " Autodetection of larger clock failed, falling back to fc/%u " , fchigh ) ;
}
if ( fclow = = 0 ) {
fclow = 8 ;
PrintAndLogEx ( DEBUG , " Autodetection of smaller clock failed, falling back to fc/%u " , fclow ) ;
}
2019-03-10 06:35:06 +08:00
size_t size = DemodBufferLen ;
2019-05-24 05:07:12 +08:00
if ( size > ( PM3_CMD_DATA_SIZE - sizeof ( lf_fsksim_t ) ) ) {
2019-12-14 19:57:25 +08:00
PrintAndLogEx ( WARNING , " DemodBuffer too long for current implementation - length: %zu - max: %zu " , size , PM3_CMD_DATA_SIZE - sizeof ( lf_fsksim_t ) ) ;
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( INFO , " Continuing with trimmed down data " ) ;
2019-05-24 05:07:12 +08:00
size = PM3_CMD_DATA_SIZE - sizeof ( lf_fsksim_t ) ;
2019-03-10 06:35:06 +08:00
}
2019-05-24 01:16:06 +08:00
2019-05-24 05:07:12 +08:00
lf_fsksim_t * payload = calloc ( 1 , sizeof ( lf_fsksim_t ) + size ) ;
2021-02-02 23:33:43 +08:00
payload - > fchigh = fchigh ;
payload - > fclow = fclow ;
2019-05-24 05:07:12 +08:00
payload - > separator = separator ;
payload - > clock = clk ;
memcpy ( payload - > data , DemodBuffer , size ) ;
2019-05-24 01:16:06 +08:00
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-08-04 01:17:00 +08:00
SendCommandNG ( CMD_LF_FSK_SIMULATE , ( uint8_t * ) payload , sizeof ( lf_fsksim_t ) + size ) ;
2019-05-24 06:32:17 +08:00
free ( payload ) ;
2019-03-10 06:35:06 +08:00
setClockGrid ( clk , 0 ) ;
2019-05-24 01:16:06 +08:00
2021-02-02 23:33:43 +08:00
return lfsim_wait_check ( CMD_LF_FSK_SIMULATE ) ;
2015-02-20 10:35:34 +08:00
}
2019-10-12 05:13:52 +08:00
// sim ask data given clock, invert, manchester or raw, separator
2015-02-20 10:35:34 +08:00
// - allow pull data from DemodBuffer
2019-03-10 18:20:22 +08:00
int CmdLFaskSim ( const char * Cmd ) {
2021-02-02 23:33:43 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf simask " ,
" Simulate ASK tag from demodbuffer or input " ,
" lf simask --clk 32 --am -d 0102030405 --> simulate ASK/MAN rf/32 \n "
" lf simask --clk 32 --bi -d 0102030405 --> simulate ASK/BIPHASE rf/32 \n \n "
" lf simask --clk 64 --am -d ffbd8001686f1924 --> simulate a EM410x tag \n "
" lf simask --clk 64 --am --stt -d 5649533200003F340000001B --> simulate a VISA2K tag "
) ;
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_lit0 ( " i " , " inv " , " invert data " ) ,
arg_u64_0 ( " c " , " clk " , " <dec> " , " manually set clock - can autodetect if using DemodBuffer (default 64) " ) ,
arg_lit0 ( NULL , " bi " , " ask/biphase encoding " ) ,
arg_lit0 ( NULL , " am " , " ask/manchester encoding (default) " ) ,
arg_lit0 ( NULL , " ar " , " ask/raw encoding " ) ,
arg_lit0 ( NULL , " stt " , " add t55xx Sequence Terminator gap - default: no gaps (only manchester) " ) ,
arg_str0 ( " d " , " data " , " <hex> " , " data to sim - omit to use DemodBuffer " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
bool invert = arg_get_lit ( ctx , 1 ) ;
uint8_t clk = arg_get_u32_def ( ctx , 2 , 0 ) ;
bool use_bi = arg_get_lit ( ctx , 3 ) ;
bool use_am = arg_get_lit ( ctx , 4 ) ;
bool use_ar = arg_get_lit ( ctx , 5 ) ;
bool separator = arg_get_lit ( ctx , 6 ) ;
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
int raw_len = 64 ;
char raw [ 64 ] = { 0 } ;
2021-02-09 23:56:55 +08:00
CLIGetStrWithReturn ( ctx , 7 , ( uint8_t * ) raw , & raw_len ) ;
2021-02-02 23:33:43 +08:00
bool verbose = arg_get_lit ( ctx , 8 ) ;
2021-02-09 23:56:55 +08:00
CLIParserFree ( ctx ) ;
2021-02-02 23:33:43 +08:00
if ( ( use_bi + use_am + use_ar ) > 1 ) {
PrintAndLogEx ( ERR , " only one encoding can be set " ) ;
return PM3_EINVARG ;
2019-03-10 06:35:06 +08:00
}
2021-02-02 23:33:43 +08:00
uint8_t encoding = 1 ;
if ( use_bi )
encoding = 2 ;
else if ( use_ar )
encoding = 0 ;
2019-03-10 06:35:06 +08:00
// No args
2021-02-02 23:33:43 +08:00
if ( raw_len = = 0 & & DemodBufferLen = = 0 ) {
PrintAndLogEx ( ERR , " No user supplied data nor any inside Demodbuffer " ) ;
return PM3_EINVARG ;
}
2019-03-10 06:35:06 +08:00
2021-02-02 23:33:43 +08:00
uint8_t bs [ 256 ] = { 0x00 } ;
int bs_len = hextobinarray ( ( char * ) bs , raw ) ;
2021-02-09 23:56:55 +08:00
if ( bs_len = = 0 ) {
2021-02-02 23:33:43 +08:00
// Using data from DemodBuffer
// might be able to autodetect FC and clock from Graphbuffer if using demod buffer
// will need carrier, clock, and bitstream
PrintAndLogEx ( INFO , " No user supplied data, using Demodbuffer... " ) ;
int res = 0 ;
if ( clk = = 0 ) {
res = GetAskClock ( " 0 " , verbose ) ;
if ( res < 1 ) {
clk = 64 ;
} else {
clk = ( uint8_t ) res ;
}
}
PrintAndLogEx ( DEBUG , " Detected rf/%u, n %zu " , clk , DemodBufferLen ) ;
2019-03-10 06:35:06 +08:00
} else {
2021-02-02 23:33:43 +08:00
setDemodBuff ( bs , bs_len , 0 ) ;
}
if ( clk = = 0 ) {
clk = 32 ;
PrintAndLogEx ( DEBUG , " Autodetection of clock failed, falling back to rf/%u " , clk ) ;
}
if ( encoding = = 0 ) {
clk / = 2 ; // askraw needs to double the clock speed
PrintAndLogEx ( DEBUG , " ASK/RAW needs half rf. Using rf/%u " , clk ) ;
2019-03-10 06:35:06 +08:00
}
size_t size = DemodBufferLen ;
2019-05-24 19:06:08 +08:00
if ( size > ( PM3_CMD_DATA_SIZE - sizeof ( lf_asksim_t ) ) ) {
2019-12-14 19:57:25 +08:00
PrintAndLogEx ( WARNING , " DemodBuffer too long for current implementation - length: %zu - max: %zu " , size , PM3_CMD_DATA_SIZE - sizeof ( lf_asksim_t ) ) ;
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( INFO , " Continuing with trimmed down data " ) ;
2019-05-24 19:06:08 +08:00
size = PM3_CMD_DATA_SIZE - sizeof ( lf_asksim_t ) ;
2019-03-10 06:35:06 +08:00
}
2019-05-24 19:06:08 +08:00
lf_asksim_t * payload = calloc ( 1 , sizeof ( lf_asksim_t ) + size ) ;
2021-02-02 23:33:43 +08:00
payload - > encoding = encoding ;
2019-05-24 19:06:08 +08:00
payload - > invert = invert ;
payload - > separator = separator ;
payload - > clock = clk ;
memcpy ( payload - > data , DemodBuffer , size ) ;
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-08-04 01:17:00 +08:00
SendCommandNG ( CMD_LF_ASK_SIMULATE , ( uint8_t * ) payload , sizeof ( lf_asksim_t ) + size ) ;
2019-05-24 19:06:08 +08:00
free ( payload ) ;
2021-02-02 23:33:43 +08:00
setClockGrid ( clk , 0 ) ;
2019-05-24 19:06:08 +08:00
2021-02-02 23:33:43 +08:00
return lfsim_wait_check ( CMD_LF_ASK_SIMULATE ) ;
2015-02-20 10:35:34 +08:00
}
2019-10-12 05:13:52 +08:00
// sim psk data given carrier, clock, invert
2015-02-22 10:36:02 +08:00
// - allow pull data from DemodBuffer or parameters
2019-03-10 18:20:22 +08:00
int CmdLFpskSim ( const char * Cmd ) {
2021-02-09 23:56:55 +08:00
2021-02-02 06:52:48 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf simpsk " ,
2021-02-02 23:33:43 +08:00
" Simulate PSK tag from demodbuffer or input " ,
" lf simpsk -1 --clk 40 --fc 4 -d 01020304 --> simulate PSK1 rf/40 psksub fc/4, data 01020304 \n \n "
" lf simpsk -1 --clk 32 --fc 2 -d a0000000bd989a11 --> simulate a indala tag manually "
2021-02-02 06:52:48 +08:00
) ;
2019-03-10 06:35:06 +08:00
2021-02-02 06:52:48 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_lit0 ( " 1 " , " psk1 " , " set PSK1 (default) " ) ,
arg_lit0 ( " 2 " , " psk2 " , " set PSK2 " ) ,
2021-02-09 23:56:55 +08:00
arg_lit0 ( " 3 " , " psk3 " , " set PSK3 " ) ,
2021-02-02 06:52:48 +08:00
arg_lit0 ( " i " , " inv " , " invert data " ) ,
arg_u64_0 ( " c " , " clk " , " <dec> " , " manually set clock - can autodetect if using DemodBuffer (default 32) " ) ,
2021-02-02 23:33:43 +08:00
arg_u64_0 ( NULL , " fc " , " <dec> " , " 2|4|8 are valid carriers (default 2) " ) ,
2021-02-02 06:52:48 +08:00
arg_str0 ( " d " , " data " , " <hex> " , " data to sim - omit to use DemodBuffer " ) ,
arg_lit0 ( " v " , " verbose " , " verbose output " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
bool use_psk1 = arg_get_lit ( ctx , 1 ) ;
bool use_psk2 = arg_get_lit ( ctx , 2 ) ;
bool use_psk3 = arg_get_lit ( ctx , 3 ) ;
bool invert = arg_get_lit ( ctx , 4 ) ;
uint8_t clk = arg_get_u32_def ( ctx , 5 , 0 ) ;
uint8_t carrier = arg_get_u32_def ( ctx , 6 , 2 ) ;
int raw_len = 64 ;
char raw [ 64 ] = { 0 } ;
2021-02-09 23:56:55 +08:00
CLIGetStrWithReturn ( ctx , 7 , ( uint8_t * ) raw , & raw_len ) ;
2021-02-02 06:52:48 +08:00
bool verbose = arg_get_lit ( ctx , 8 ) ;
CLIParserFree ( ctx ) ;
2019-03-10 06:35:06 +08:00
2021-02-02 06:52:48 +08:00
if ( ( use_psk1 + use_psk2 + use_psk3 ) > 1 ) {
PrintAndLogEx ( ERR , " only one PSK mode can be set " ) ;
return PM3_EINVARG ;
2019-03-10 06:35:06 +08:00
}
2021-02-09 23:56:55 +08:00
2021-02-02 06:52:48 +08:00
if ( carrier ! = 2 & & carrier ! = 4 & & carrier ! = 8 ) {
PrintAndLogEx ( ERR , " Wrong carrier given, expected <2|4|8> " ) ;
return PM3_EINVARG ;
}
uint8_t psk_type = 1 ;
if ( use_psk2 )
psk_type = 2 ;
if ( use_psk3 )
psk_type = 3 ;
2021-02-02 16:13:13 +08:00
// No args
if ( raw_len = = 0 & & DemodBufferLen = = 0 ) {
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( ERR , " No user supplied data nor any inside Demodbuffer " ) ;
2021-02-02 06:52:48 +08:00
return PM3_EINVARG ;
}
2021-02-02 16:13:13 +08:00
uint8_t bs [ 256 ] = { 0x00 } ;
int bs_len = hextobinarray ( ( char * ) bs , raw ) ;
2019-03-10 06:35:06 +08:00
2021-02-09 23:56:55 +08:00
if ( bs_len = = 0 ) {
2021-02-02 06:52:48 +08:00
// Using data from DemodBuffer
// might be able to autodetect FC and clock from Graphbuffer if using demod buffer
// will need carrier, clock, and bitstream
2021-02-02 16:13:13 +08:00
PrintAndLogEx ( INFO , " No user supplied data, using Demodbuffer... " ) ;
2019-03-10 06:35:06 +08:00
2021-02-02 06:52:48 +08:00
int res = 0 ;
if ( clk = = 0 ) {
res = GetPskClock ( " " , verbose ) ;
2021-02-09 23:56:55 +08:00
if ( res < 1 ) {
2021-02-02 06:52:48 +08:00
clk = 32 ;
} else {
clk = ( uint8_t ) res ;
}
}
2019-03-10 06:35:06 +08:00
2021-02-02 06:52:48 +08:00
if ( carrier = = 0 ) {
2021-02-09 23:56:55 +08:00
res = GetPskCarrier ( verbose ) ;
if ( res < 1 ) {
carrier = 2 ;
} else {
carrier = ( uint8_t ) res ;
}
2021-02-02 06:52:48 +08:00
}
2021-02-02 16:13:13 +08:00
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( DEBUG , " Detected rf/%u, fc/%u, n %zu " , clk , carrier , DemodBufferLen ) ;
2019-03-10 06:35:06 +08:00
} else {
2021-02-02 06:52:48 +08:00
setDemodBuff ( bs , bs_len , 0 ) ;
2019-03-10 06:35:06 +08:00
}
2021-02-02 06:52:48 +08:00
if ( clk = = 0 ) {
clk = 32 ;
2021-02-02 23:33:43 +08:00
PrintAndLogEx ( DEBUG , " Autodetection of clock failed, falling back to rf/%u " , clk ) ;
2021-02-02 06:52:48 +08:00
}
2019-03-10 06:35:06 +08:00
2021-02-02 06:52:48 +08:00
if ( psk_type = = 2 ) {
//need to convert psk2 to psk1 data before sim
psk2TOpsk1 ( DemodBuffer , DemodBufferLen ) ;
} else if ( psk_type = = 3 ) {
2021-02-02 16:13:13 +08:00
PrintAndLogEx ( INFO , " PSK3 not yet available. Falling back to PSK1 " ) ;
2021-02-02 06:52:48 +08:00
psk_type = 1 ;
2019-03-10 06:35:06 +08:00
}
2021-02-02 06:52:48 +08:00
2019-03-10 06:35:06 +08:00
size_t size = DemodBufferLen ;
2019-05-24 21:11:30 +08:00
if ( size > ( PM3_CMD_DATA_SIZE - sizeof ( lf_psksim_t ) ) ) {
2019-12-14 19:57:25 +08:00
PrintAndLogEx ( WARNING , " DemodBuffer too long for current implementation - length: %zu - max: %zu " , size , PM3_CMD_DATA_SIZE - sizeof ( lf_psksim_t ) ) ;
2021-02-02 16:13:13 +08:00
PrintAndLogEx ( INFO , " Continuing with trimmed down data " ) ;
2019-05-24 21:11:30 +08:00
size = PM3_CMD_DATA_SIZE - sizeof ( lf_psksim_t ) ;
2019-03-10 06:35:06 +08:00
}
2019-05-24 21:11:30 +08:00
lf_psksim_t * payload = calloc ( 1 , sizeof ( lf_psksim_t ) + size ) ;
payload - > carrier = carrier ;
payload - > invert = invert ;
payload - > clock = clk ;
memcpy ( payload - > data , DemodBuffer , size ) ;
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-08-04 01:17:00 +08:00
SendCommandNG ( CMD_LF_PSK_SIMULATE , ( uint8_t * ) payload , sizeof ( lf_psksim_t ) + size ) ;
2019-05-24 21:11:30 +08:00
free ( payload ) ;
2021-02-02 23:33:43 +08:00
setClockGrid ( clk , 0 ) ;
2019-05-24 21:11:30 +08:00
2021-02-02 23:33:43 +08:00
return lfsim_wait_check ( CMD_LF_PSK_SIMULATE ) ;
2015-02-22 10:36:02 +08:00
}
2015-02-20 10:35:34 +08:00
2019-03-10 18:20:22 +08:00
int CmdLFSimBidir ( const char * Cmd ) {
2021-01-27 21:14:59 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf simbidir " ,
" Simulate LF tag with bidirectional data transmission between reader and tag " ,
" lf simbidir "
) ;
void * argtable [ ] = {
arg_param_begin ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
CLIParserFree ( ctx ) ;
2019-03-10 06:35:06 +08:00
// Set ADC to twice the carrier for a slight supersampling
// HACK: not implemented in ARMSRC.
PrintAndLogEx ( INFO , " Not implemented yet. " ) ;
2019-10-01 20:30:30 +08:00
// SendCommandMIX(CMD_LF_SIMULATE_BIDIR, 47, 384, 0, NULL, 0);
2019-05-24 01:16:06 +08:00
return PM3_SUCCESS ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2019-11-19 19:17:08 +08:00
// ICEMAN, Verichip is Animal tag. Tested against correct reader
/*
2019-03-10 18:20:22 +08:00
int CmdVchDemod ( const char * Cmd ) {
2019-10-01 20:30:30 +08:00
if ( GraphTraceLen < 4096 ) {
PrintAndLogEx ( DEBUG , " debug; VchDemod - too few samples " ) ;
return PM3_EINVARG ;
}
2019-03-10 06:35:06 +08:00
// Is this the entire sync pattern, or does this also include some
// data bits that happen to be the same everywhere? That would be
// lovely to know.
static const int SyncPattern [ ] = {
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 , - 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 , - 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 , - 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 , - 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 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
} ;
2019-11-19 19:17:08 +08:00
// iceman, using correlate as preamble detect seems way better than our current memcompare
2019-03-10 06:35:06 +08:00
// So first, we correlate for the sync pattern, and mark that.
int bestCorrel = 0 , bestPos = 0 ;
int i , j , sum = 0 ;
// It does us no good to find the sync pattern, with fewer than 2048 samples after it.
for ( i = 0 ; i < ( GraphTraceLen - 2048 ) ; i + + ) {
for ( j = 0 ; j < ARRAYLEN ( SyncPattern ) ; j + + ) {
2019-03-10 07:00:59 +08:00
sum + = GraphBuffer [ i + j ] * SyncPattern [ j ] ;
2019-03-10 06:35:06 +08:00
}
if ( sum > bestCorrel ) {
bestCorrel = sum ;
bestPos = i ;
}
}
PrintAndLogEx ( NORMAL , " best sync at %d [metric %d] " , bestPos , bestCorrel ) ;
char bits [ 257 ] ;
bits [ 256 ] = ' \0 ' ;
int worst = INT_MAX , worstPos = 0 ;
for ( i = 0 ; i < 2048 ; i + = 8 ) {
sum = 0 ;
for ( j = 0 ; j < 8 ; j + + )
2019-03-10 07:00:59 +08:00
sum + = GraphBuffer [ bestPos + i + j ] ;
2019-03-10 06:35:06 +08:00
if ( sum < 0 )
2019-03-10 07:00:59 +08:00
bits [ i / 8 ] = ' . ' ;
2019-03-10 06:35:06 +08:00
else
2019-03-10 07:00:59 +08:00
bits [ i / 8 ] = ' 1 ' ;
2019-03-10 06:35:06 +08:00
2019-03-10 07:00:59 +08:00
if ( abs ( sum ) < worst ) {
2019-03-10 06:35:06 +08:00
worst = abs ( sum ) ;
worstPos = i ;
}
}
PrintAndLogEx ( NORMAL , " bits: " ) ;
PrintAndLogEx ( NORMAL , " %s " , bits ) ;
PrintAndLogEx ( NORMAL , " worst metric: %d at pos %d " , worst , worstPos ) ;
// clone
2019-03-10 07:00:59 +08:00
if ( strcmp ( Cmd , " clone " ) = = 0 ) {
2019-03-10 06:35:06 +08:00
GraphTraceLen = 0 ;
char * s ;
2019-03-10 07:00:59 +08:00
for ( s = bits ; * s ; s + + ) {
for ( j = 0 ; j < 16 ; j + + ) {
GraphBuffer [ GraphTraceLen + + ] = ( * s = = ' 1 ' ) ? 1 : 0 ;
2019-03-10 06:35:06 +08:00
}
2019-03-10 07:00:59 +08:00
}
2019-03-10 06:35:06 +08:00
RepaintGraphWindow ( ) ;
}
2019-05-24 01:16:06 +08:00
return PM3_SUCCESS ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2019-11-19 19:17:08 +08:00
*/
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
2019-04-14 03:54:04 +08:00
static bool CheckChipType ( bool getDeviceData ) {
2017-02-27 04:32:51 +08:00
2019-03-10 06:35:06 +08:00
bool retval = false ;
if ( ! getDeviceData ) return retval ;
save_restoreGB ( GRAPH_SAVE ) ;
save_restoreDB ( GRAPH_SAVE ) ;
//check for em4x05/em4x69 chips first
uint32_t word = 0 ;
2020-10-21 03:59:33 +08:00
if ( em4x05_isblock0 ( & word ) ) {
2020-09-06 05:57:44 +08:00
PrintAndLogEx ( SUCCESS , " Chipset detection: " _GREEN_ ( " EM4x05 / EM4x69 " ) ) ;
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( HINT , " Hint: try " _YELLOW_ ( " `lf em 4x05` " ) " commands " ) ;
2019-03-10 06:35:06 +08:00
retval = true ;
goto out ;
}
2019-07-13 06:38:30 +08:00
2019-03-10 06:35:06 +08:00
//check for t55xx chip...
if ( tryDetectP1 ( true ) ) {
2019-10-10 13:56:39 +08:00
PrintAndLogEx ( SUCCESS , " Chipset detection: " _GREEN_ ( " T55xx " ) ) ;
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( HINT , " Hint: try " _YELLOW_ ( " `lf t55xx` " ) " commands " ) ;
2019-03-10 06:35:06 +08:00
retval = true ;
2020-09-11 02:49:23 +08:00
goto out ;
2019-03-10 06:35:06 +08:00
}
2020-08-13 18:25:04 +08:00
2020-06-30 23:43:47 +08:00
// check for em4x50 chips
if ( detect_4x50_block ( ) ) {
PrintAndLogEx ( SUCCESS , " Chipset detection: " _GREEN_ ( " EM4x50 " ) ) ;
PrintAndLogEx ( HINT , " Hint: try " _YELLOW_ ( " `lf em 4x50` " ) " commands " ) ;
2020-12-06 06:47:03 +08:00
retval = true ;
goto out ;
}
// check for em4x70 chips
if ( detect_4x70_block ( ) ) {
PrintAndLogEx ( SUCCESS , " Chipset detection: " _GREEN_ ( " EM4x70 " ) ) ;
PrintAndLogEx ( HINT , " Hint: try " _YELLOW_ ( " `lf em 4x70` " ) " commands " ) ;
2020-06-30 23:43:47 +08:00
retval = true ;
goto out ;
}
2019-03-12 06:12:31 +08:00
2020-09-06 05:57:44 +08:00
PrintAndLogEx ( NORMAL , " Couldn't identify a chipset " ) ;
2019-03-10 06:35:06 +08:00
out :
save_restoreGB ( GRAPH_RESTORE ) ;
save_restoreDB ( GRAPH_RESTORE ) ;
return retval ;
2017-02-27 04:32:51 +08:00
}
2019-03-10 18:20:22 +08:00
int CmdLFfind ( const char * Cmd ) {
2019-03-10 06:35:06 +08:00
2021-01-27 21:11:36 +08:00
CLIParserContext * ctx ;
CLIParserInit ( & ctx , " lf search " ,
" Read and search for valid known tag. For offline mode, you can `data load` first then search. " ,
" lf search -> try reading data from tag & search for known tag \n "
" lf search -1 -> use data from GraphBuffer & search for known tag \n "
" lf search -u -> try reading data from tag & search for known and unknown tag \n "
" lf search -1u -> use data from GraphBuffer & search for known and unknown tag \n "
) ;
2019-03-10 06:35:06 +08:00
2021-01-27 21:11:36 +08:00
void * argtable [ ] = {
arg_param_begin ,
arg_lit0 ( " 1 " , NULL , " Use data from Graphbuffer to search " ) ,
arg_lit0 ( " u " , NULL , " Search for unknown tags, if not set, reads only known tags " ) ,
arg_param_end
} ;
CLIExecWithReturn ( ctx , Cmd , argtable , true ) ;
bool use_gb = arg_get_lit ( ctx , 1 ) ;
bool search_unk = arg_get_lit ( ctx , 2 ) ;
CLIParserFree ( ctx ) ;
2019-03-10 06:35:06 +08:00
2021-01-27 21:11:36 +08:00
bool is_online = ( session . pm3_present & & ( use_gb = = false ) ) ;
if ( is_online )
2020-01-08 05:05:01 +08:00
lf_read ( false , 30000 ) ;
2019-03-10 06:35:06 +08:00
2021-01-27 21:11:36 +08:00
size_t min_length = 2000 ;
if ( GraphTraceLen < min_length ) {
2019-03-10 06:35:06 +08:00
PrintAndLogEx ( FAILED , " Data in Graphbuffer was too small. " ) ;
2019-05-22 21:40:58 +08:00
return PM3_ESOFT ;
2019-03-10 06:35:06 +08:00
}
2020-08-28 13:59:25 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-03-10 06:35:06 +08:00
PrintAndLogEx ( INFO , " NOTE: some demods output possible binary " ) ;
PrintAndLogEx ( INFO , " if it finds something that looks like a tag " ) ;
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( INFO , " False Positives " _YELLOW_ ( " ARE " ) " possible " ) ;
2019-03-11 21:55:02 +08:00
PrintAndLogEx ( INFO , " " ) ;
2019-10-10 13:56:39 +08:00
PrintAndLogEx ( INFO , " Checking for known tags... " ) ;
PrintAndLogEx ( INFO , " " ) ;
2019-03-10 06:35:06 +08:00
// only run these tests if device is online
2021-01-27 21:11:36 +08:00
if ( is_online ) {
2020-01-21 22:22:36 +08:00
if ( IfPm3Hitag ( ) ) {
if ( readHitagUid ( ) ) {
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Hitag " ) " found! " ) ;
2020-01-21 22:22:36 +08:00
return PM3_SUCCESS ;
}
}
2020-06-29 03:41:21 +08:00
if ( IfPm3EM4x50 ( ) ) {
2020-06-30 23:43:47 +08:00
if ( read_em4x50_uid ( ) = = PM3_SUCCESS ) {
2020-06-29 03:41:21 +08:00
PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " EM4x50 ID " ) " found! " ) ;
return PM3_SUCCESS ;
}
}
2019-03-10 06:35:06 +08:00
// only run if graphbuffer is just noise as it should be for hitag
// The improved noise detection will find Cotag.
if ( getSignalProperties ( ) - > isnoise ) {
2020-08-28 13:59:25 +08:00
PrintAndLogEx ( INPLACE , " Searching for MOTOROLA tag... " ) ;
2019-10-12 05:13:52 +08:00
if ( readMotorolaUid ( ) ) {
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Motorola FlexPass ID " ) " found! " ) ;
2019-10-13 06:48:26 +08:00
return PM3_SUCCESS ;
2019-10-12 05:13:52 +08:00
}
2020-12-02 00:06:49 +08:00
PrintAndLogEx ( INPLACE , " Searching for COTAG tag... " ) ;
2019-10-12 05:13:52 +08:00
if ( readCOTAGUid ( ) ) {
2020-04-22 08:22:55 +08:00
PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " COTAG ID " ) " found! " ) ;
2019-10-13 06:48:26 +08:00
return PM3_SUCCESS ;
2019-05-02 05:26:06 +08:00
}
2019-03-10 06:35:06 +08:00
2020-08-28 13:59:25 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-10-10 13:56:39 +08:00
PrintAndLogEx ( FAILED , _RED_ ( " No data found! " ) ) ;
PrintAndLogEx ( INFO , " Signal looks like noise. Maybe not an LF tag? " ) ;
2020-08-28 13:59:25 +08:00
PrintAndLogEx ( NORMAL , " " ) ;
2019-05-22 21:40:58 +08:00
return PM3_ESOFT ;
2019-03-10 06:35:06 +08:00
}
}
2021-01-27 21:11:36 +08:00
int retval = PM3_SUCCESS ;
2020-09-28 17:50:20 +08:00
if ( demodVisa2k ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Visa2000 ID " ) " found! " ) ; goto out ; }
2020-10-12 18:27:00 +08:00
if ( demodDestron ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " FDX-A FECAVA Destron ID " ) " found! " ) ; goto out ; } // to do before HID
2020-09-28 17:50:20 +08:00
if ( demodHID ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " HID Prox ID " ) " found! " ) ; goto out ; }
if ( demodAWID ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " AWID ID " ) " found! " ) ; goto out ; }
if ( demodIOProx ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " IO Prox ID " ) " found! " ) ; goto out ; }
if ( demodParadox ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Paradox ID " ) " found! " ) ; goto out ; }
if ( demodNexWatch ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " NexWatch ID " ) " found! " ) ; goto out ; }
if ( demodIndala ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Indala ID " ) " found! " ) ; goto out ; }
if ( demodEM410x ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " EM410x ID " ) " found! " ) ; goto out ; }
2020-10-12 04:38:52 +08:00
if ( demodFDXB ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " FDX-B ID " ) " found! " ) ; goto out ; }
2020-09-28 17:50:20 +08:00
if ( demodGuard ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Guardall G-Prox II ID " ) " found! " ) ; goto out ; }
if ( demodIdteck ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Idteck ID " ) " found! " ) ; goto out ; }
if ( demodJablotron ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Jablotron ID " ) " found! " ) ; goto out ; }
if ( demodNedap ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " NEDAP ID " ) " found! " ) ; goto out ; }
if ( demodNoralsy ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Noralsy ID " ) " found! " ) ; goto out ; }
if ( demodKeri ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " KERI ID " ) " found! " ) ; goto out ; }
if ( demodPac ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " PAC/Stanley ID " ) " found! " ) ; goto out ; }
if ( demodPresco ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Presco ID " ) " found! " ) ; goto out ; }
if ( demodPyramid ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Pyramid ID " ) " found! " ) ; goto out ; }
if ( demodSecurakey ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Securakey ID " ) " found! " ) ; goto out ; }
if ( demodViking ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " Viking ID " ) " found! " ) ; goto out ; }
if ( demodGallagher ( true ) = = PM3_SUCCESS ) { PrintAndLogEx ( SUCCESS , " \n Valid " _GREEN_ ( " GALLAGHER ID " ) " found! " ) ; goto out ; }
2020-08-28 13:59:25 +08:00
// if (demodTI() == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Texas Instrument ID") " found!"); goto out;}
// if (demodFermax() == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Fermax ID") " found!"); goto out;}
2019-03-11 21:55:02 +08:00
2019-05-09 07:07:34 +08:00
PrintAndLogEx ( FAILED , _RED_ ( " No known 125/134 kHz tags found! " ) ) ;
2019-03-10 06:35:06 +08:00
2021-01-27 21:11:36 +08:00
if ( search_unk ) {
2019-03-10 06:35:06 +08:00
//test unknown tag formats (raw mode)
2019-03-11 21:55:02 +08:00
PrintAndLogEx ( INFO , " \n Checking for unknown tags: \n " ) ;
2021-01-27 21:11:36 +08:00
int ans = AutoCorrelate ( GraphBuffer , GraphBuffer , GraphTraceLen , 8000 , false , false ) ;
2019-03-10 06:35:06 +08:00
if ( ans > 0 ) {
2019-03-11 21:55:02 +08:00
PrintAndLogEx ( INFO , " Possible auto correlation of %d repeating samples " , ans ) ;
2019-03-10 06:35:06 +08:00
2019-03-10 07:00:59 +08:00
if ( ans % 8 = = 0 )
2019-03-10 06:35:06 +08:00
PrintAndLogEx ( INFO , " Possible %d bytes " , ( ans / 8 ) ) ;
}
2019-03-10 07:00:59 +08:00
//fsk
if ( GetFskClock ( " " , false ) ) {
2020-09-28 17:50:20 +08:00
if ( FSKrawDemod ( 0 , 0 , 0 , 0 , true ) = = PM3_SUCCESS ) {
2021-02-15 18:01:01 +08:00
PrintAndLogEx ( INFO , " Unknown FSK Modulated Tag found! " ) ;
2019-03-10 07:00:59 +08:00
goto out ;
2019-03-10 06:35:06 +08:00
}
}
bool st = true ;
2020-09-28 17:50:20 +08:00
if ( ASKDemod_ext ( 0 , 0 , 0 , 0 , false , true , false , 1 , & st ) = = PM3_SUCCESS ) {
2021-02-15 18:01:01 +08:00
PrintAndLogEx ( INFO , " Unknown ASK Modulated and Manchester encoded Tag found! " ) ;
PrintAndLogEx ( INFO , " if it does not look right it could instead be ASK/Biphase - try " _YELLOW_ ( " 'data rawdemod ab' " ) ) ;
2019-03-10 07:00:59 +08:00
goto out ;
2019-03-10 06:35:06 +08:00
}
2019-05-22 20:32:30 +08:00
if ( CmdPSK1rawDemod ( " " ) = = PM3_SUCCESS ) {
2021-02-15 18:01:01 +08:00
PrintAndLogEx ( INFO , " Possible unknown PSK1 Modulated Tag found above! " ) ;
PrintAndLogEx ( INFO , " Could also be PSK2 - try " _YELLOW_ ( " 'data rawdemod p2' " ) ) ;
PrintAndLogEx ( INFO , " Could also be PSK3 - [currently not supported] " ) ;
PrintAndLogEx ( INFO , " Could also be NRZ - try " _YELLOW_ ( " 'data rawdemod nr " ) ) ;
2019-03-10 06:35:06 +08:00
goto out ;
}
2021-02-15 18:01:01 +08:00
PrintAndLogEx ( FAILED , _RED_ ( " No data found! " ) ) ;
2019-03-10 06:35:06 +08:00
}
2019-11-19 19:17:08 +08:00
retval = PM3_ESOFT ;
2017-07-31 18:31:39 +08:00
out :
2019-03-10 06:35:06 +08:00
// identify chipset
2021-01-27 21:11:36 +08:00
if ( CheckChipType ( is_online ) = = false ) {
2019-07-13 06:38:30 +08:00
PrintAndLogEx ( DEBUG , " Automatic chip type detection " _RED_ ( " failed " ) ) ;
2020-06-09 00:43:34 +08:00
retval = false ;
2019-06-08 22:10:04 +08:00
}
2019-11-19 19:17:08 +08:00
return retval ;
2014-12-31 05:08:33 +08:00
}
2017-02-26 06:00:20 +08:00
static command_t CommandTable [ ] = {
2021-02-02 23:33:43 +08:00
{ " help " , CmdHelp , AlwaysAvailable , " This help " } ,
2020-10-23 04:16:44 +08:00
{ " ----------- " , CmdHelp , AlwaysAvailable , " -------------- " _CYAN_ ( " Low Frequency " ) " -------------- " } ,
2019-05-02 02:48:15 +08:00
{ " awid " , CmdLFAWID , AlwaysAvailable , " { AWID RFIDs... } " } ,
{ " cotag " , CmdLFCOTAG , AlwaysAvailable , " { COTAG CHIPs... } " } ,
2020-10-12 18:27:00 +08:00
{ " destron " , CmdLFDestron , AlwaysAvailable , " { FDX-A Destron RFIDs... } " } ,
2020-12-04 07:11:57 +08:00
{ " em " , CmdLFEM , AlwaysAvailable , " { EM CHIPs & RFIDs... } " } ,
2020-10-12 04:38:52 +08:00
{ " fdxb " , CmdLFFdxB , AlwaysAvailable , " { FDX-B RFIDs... } " } ,
2019-10-09 03:45:40 +08:00
{ " gallagher " , CmdLFGallagher , AlwaysAvailable , " { GALLAGHER RFIDs... } " } ,
2019-05-02 02:48:15 +08:00
{ " gproxii " , CmdLFGuard , AlwaysAvailable , " { Guardall Prox II RFIDs... } " } ,
2020-03-10 17:41:16 +08:00
{ " hid " , CmdLFHID , AlwaysAvailable , " { HID Prox RFIDs... } " } ,
2019-05-02 02:48:15 +08:00
{ " hitag " , CmdLFHitag , AlwaysAvailable , " { Hitag CHIPs... } " } ,
2020-09-29 03:09:26 +08:00
{ " idteck " , CmdLFIdteck , AlwaysAvailable , " { Idteck RFIDs... } " } ,
2019-05-02 02:48:15 +08:00
{ " indala " , CmdLFINDALA , AlwaysAvailable , " { Indala RFIDs... } " } ,
{ " io " , CmdLFIO , AlwaysAvailable , " { ioProx RFIDs... } " } ,
{ " jablotron " , CmdLFJablotron , AlwaysAvailable , " { Jablotron RFIDs... } " } ,
{ " keri " , CmdLFKeri , AlwaysAvailable , " { KERI RFIDs... } " } ,
2020-03-02 20:59:41 +08:00
{ " motorola " , CmdLFMotorola , AlwaysAvailable , " { Motorola RFIDs... } " } ,
2019-05-02 02:48:15 +08:00
{ " nedap " , CmdLFNedap , AlwaysAvailable , " { Nedap RFIDs... } " } ,
{ " nexwatch " , CmdLFNEXWATCH , AlwaysAvailable , " { NexWatch RFIDs... } " } ,
{ " noralsy " , CmdLFNoralsy , AlwaysAvailable , " { Noralsy RFIDs... } " } ,
{ " pac " , CmdLFPac , AlwaysAvailable , " { PAC/Stanley RFIDs... } " } ,
{ " paradox " , CmdLFParadox , AlwaysAvailable , " { Paradox RFIDs... } " } ,
{ " pcf7931 " , CmdLFPCF7931 , AlwaysAvailable , " { PCF7931 CHIPs... } " } ,
{ " presco " , CmdLFPresco , AlwaysAvailable , " { Presco RFIDs... } " } ,
{ " pyramid " , CmdLFPyramid , AlwaysAvailable , " { Farpointe/Pyramid RFIDs... } " } ,
{ " securakey " , CmdLFSecurakey , AlwaysAvailable , " { Securakey RFIDs... } " } ,
{ " ti " , CmdLFTI , AlwaysAvailable , " { TI CHIPs... } " } ,
{ " t55xx " , CmdLFT55XX , AlwaysAvailable , " { T55xx CHIPs... } " } ,
{ " viking " , CmdLFViking , AlwaysAvailable , " { Viking RFIDs... } " } ,
{ " visa2000 " , CmdLFVisa2k , AlwaysAvailable , " { Visa2000 RFIDs... } " } ,
2020-09-25 01:51:57 +08:00
{ " ----------- " , CmdHelp , AlwaysAvailable , " --------------------- " _CYAN_ ( " General " ) " --------------------- " } ,
2019-10-04 04:11:16 +08:00
{ " config " , CmdLFConfig , IfPm3Lf , " Get/Set config for LF sampling, bit/sample, decimation, frequency " } ,
2021-02-05 05:01:23 +08:00
{ " cmdread " , CmdLFCommandRead , IfPm3Lf , " Modulate LF reader field to send command before read " } ,
2020-01-10 02:28:44 +08:00
{ " read " , CmdLFRead , IfPm3Lf , " Read LF tag " } ,
2021-01-27 21:11:36 +08:00
{ " search " , CmdLFfind , AlwaysAvailable , " Read and Search for valid known tag " } ,
2021-02-02 23:33:43 +08:00
{ " sim " , CmdLFSim , IfPm3Lf , " Simulate LF tag from buffer " } ,
{ " simask " , CmdLFaskSim , IfPm3Lf , " Simulate " _YELLOW_ ( " ASK " ) " tag " } ,
{ " simfsk " , CmdLFfskSim , IfPm3Lf , " Simulate " _YELLOW_ ( " FSK " ) " tag " } ,
{ " simpsk " , CmdLFpskSim , IfPm3Lf , " Simulate " _YELLOW_ ( " PSK " ) " tag " } ,
// {"simnrz", CmdLFnrzSim, IfPm3Lf, "Simulate " _YELLOW_("NRZ") " tag"},
2019-05-02 06:02:38 +08:00
{ " simbidir " , CmdLFSimBidir , IfPm3Lf , " Simulate LF tag (with bidirectional data transmission between reader and tag) " } ,
{ " sniff " , CmdLFSniff , IfPm3Lf , " Sniff LF traffic between reader and tag " } ,
2019-09-24 19:06:43 +08:00
{ " tune " , CmdLFTune , IfPm3Lf , " Continuously measure LF antenna tuning " } ,
2021-02-02 23:33:43 +08:00
// {"vchdemod", CmdVchDemod, AlwaysAvailable, "Demodulate samples for VeriChip"},
2019-11-19 19:17:08 +08:00
// {"flexdemod", CmdFlexdemod, AlwaysAvailable, "Demodulate samples for Motorola FlexPass"},
2019-05-02 02:48:15 +08:00
{ NULL , NULL , NULL , NULL }
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
} ;
2019-03-10 18:20:22 +08:00
int CmdLF ( const char * Cmd ) {
2019-03-10 06:35:06 +08:00
clearCommandBuffer ( ) ;
2019-04-19 06:47:51 +08:00
return CmdsParse ( CommandTable , Cmd ) ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}
2019-03-10 18:20:22 +08:00
int CmdHelp ( const char * Cmd ) {
2019-04-10 18:23:40 +08:00
( void ) Cmd ; // Cmd is not used so far
2019-03-10 06:35:06 +08:00
CmdsHelp ( CommandTable ) ;
2019-05-22 20:32:30 +08:00
return PM3_SUCCESS ;
Client cleanup and restructuring. Stage 1...
Next Step is refactoring some of the giant functions which are
just copy/paste of some other ones with just a few line changes,
removing unnecessary 'goto' etc.
The MS Windows version is broken with this commit but will be fixed
soon. Everything can't be done all at once :P
The commands are now hierarchical, for example:
"hf 14a read" vs. "hf 14b read".
You can also request help:
"hf help", "data help", "hf 15 help" etc.
Indents are now space-based, not tab-based anymore. Hopefully
no one will be trolling about it, considering the suicide-prone work
being done here ;)
client/cmdhw.c, client/proxusb.c, client/cmdhw.h, client/proxusb.h,
client/cmdmain.c, client/cmdlfhid.c, client/cmdmain.h, client/cmdlfhid.h,
client/data.c, client/data.h, client/cmdhf.c, client/cmdlf.c,
client/cmdhf.h, client/cmdhf15.c, client/cmdhf14b.c, client/cmdlf.h,
client/cmdhf15.h, client/cmdhf14b.h, client/cmddata.c, client/cmddata.h,
client/ui.c, client/cmdparser.c, client/cmdlfti.c, client/ui.h,
client/cmdlfem4x.c, client/cmdparser.h, client/cmdlfti.h, client/cmdlfem4x.h,
client/graph.c, client/graph.h, client/cmdhf14a.c, client/cmdhf14a.h,
client/cmdhflegic.c, client/cmdhflegic.c: New files.
client/cli.c, client/flasher.c, client/snooper.c, client/proxmark3.c,
client/proxmark3.h, client/Makefile: Update accordingly.
client/flash.h, client/flash.c, client/proxgui.cpp: Cosmetic changes.
client/translate.h, client/command.c, client/gui.c,
client/usb.c, client/prox.h: Remove.
include/usb_cmd.h (CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443_SIM): Remove dead cmd.
common/crc16.h: New file.
common/crc16.c: Modify accordingly.
common/iso14443crc.h: New file.
common/iso14443_crc.c: Rename to
common/iso14443crc.c: and modify accordingly.
armsrc/lfops.c, armsrc/iso14443.c,
armsrc/iso14443a.c: include .h files from
the common directory instead of including the c files.
common/Makefile.common, armsrc/Makefile: Modify accordingly.
2010-02-04 09:27:07 +08:00
}