added hf 14a reader to source and added functionality to exec empty commands

This commit is contained in:
merlokk 2017-11-27 13:49:17 +02:00
commit 32bafb1946
3 changed files with 34 additions and 39 deletions

View file

@ -28,7 +28,7 @@ int CLIParserInit(char *vprogramName, char *vprogramHint) {
return 0; return 0;
} }
int CLIParserParseArg(int argc, char **argv, void* vargtable[], size_t vargtableLen) { int CLIParserParseArg(int argc, char **argv, void* vargtable[], size_t vargtableLen, bool allowEmptyExec) {
int nerrors; int nerrors;
argtable = vargtable; argtable = vargtable;
@ -44,7 +44,7 @@ int CLIParserParseArg(int argc, char **argv, void* vargtable[], size_t vargtable
nerrors = arg_parse(argc, argv, argtable); nerrors = arg_parse(argc, argv, argtable);
/* special case: '--help' takes precedence over error reporting */ /* special case: '--help' takes precedence over error reporting */
if (argc < 2 ||((struct arg_lit *)argtable[0])->count > 0) { // help must be the first record if ((argc < 2 && !allowEmptyExec) ||((struct arg_lit *)argtable[0])->count > 0) { // help must be the first record
printf("Usage: %s", programName); printf("Usage: %s", programName);
arg_print_syntaxv(stdout, argtable, "\n"); arg_print_syntaxv(stdout, argtable, "\n");
if (programHint) if (programHint)
@ -75,7 +75,7 @@ enum ParserState {
#define isSpace(c)(c == ' ' || c == '\t') #define isSpace(c)(c == ' ' || c == '\t')
int CLIParserParseString(const char* str, void* vargtable[], size_t vargtableLen) { int CLIParserParseString(const char* str, void* vargtable[], size_t vargtableLen, bool allowEmptyExec) {
int argc = 0; int argc = 0;
char *argv[200] = {NULL}; char *argv[200] = {NULL};
@ -132,7 +132,7 @@ int CLIParserParseString(const char* str, void* vargtable[], size_t vargtableLen
} }
} }
return CLIParserParseArg(argc, argv, vargtable, vargtableLen); return CLIParserParseArg(argc, argv, vargtable, vargtableLen, allowEmptyExec);
} }
void CLIParserFree() { void CLIParserFree() {

View file

@ -10,6 +10,7 @@
#include "argtable3.h" #include "argtable3.h"
#include "util.h" #include "util.h"
#include <stdbool.h>
#define arg_param_begin arg_lit0("hH", "help", "print this help and exit") #define arg_param_begin arg_lit0("hH", "help", "print this help and exit")
#define arg_param_end arg_end(20) #define arg_param_end arg_end(20)
@ -18,8 +19,8 @@
#define arg_get_str(n)(((struct arg_str*)argtable[n])) #define arg_get_str(n)(((struct arg_str*)argtable[n]))
extern int CLIParserInit(char *vprogramName, char *vprogramHint); extern int CLIParserInit(char *vprogramName, char *vprogramHint);
extern int CLIParserParseString(const char* str, void* argtable[], size_t vargtableLen); extern int CLIParserParseString(const char* str, void* argtable[], size_t vargtableLen, bool allowEmptyExec);
extern int CLIParserParseArg(int argc, char **argv, void* argtable[], size_t vargtableLen); extern int CLIParserParseArg(int argc, char **argv, void* argtable[], size_t vargtableLen, bool allowEmptyExec);
extern void CLIParserFree(); extern void CLIParserFree();
extern int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); extern int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen);

View file

@ -133,38 +133,32 @@ int CmdHF14AList(const char *Cmd)
int CmdHF14AReader(const char *Cmd) { int CmdHF14AReader(const char *Cmd) {
uint32_t cm = ISO14A_CONNECT; uint32_t cm = ISO14A_CONNECT;
bool disconnectAfter = true; bool leaveSignalON = false;
int cmdp = 0; CLIParserInit("hf 14a reader", "Executes ISO1443A anticollision-select group of commands.");
while(param_getchar(Cmd, cmdp) != 0x00) { void* argtable[] = {
switch(param_getchar(Cmd, cmdp)) { arg_param_begin,
case 'h': arg_lit0("kK", "keep", "keep the field active after command executed"),
case 'H': arg_lit0("xX", "drop", "just drop the signal field"),
PrintAndLog("Usage: hf 14a reader [k|x] [3]"); arg_lit0("3", NULL, "ISO14443-3 select only (skip RATS)"),
PrintAndLog(" k keep the field active after command executed"); arg_param_end
PrintAndLog(" x just drop the signal field"); };
PrintAndLog(" 3 ISO14443-3 select only (skip RATS)"); if (CLIParserParseString(Cmd, argtable, sizeof(argtable) / sizeof(argtable[0]), true)){
CLIParserFree();
return 0; return 0;
case '3': }
cm |= ISO14A_NO_RATS;
break; leaveSignalON = arg_get_lit(1)->count;
case 'k': if (arg_get_lit(2)->count) {
case 'K':
disconnectAfter = false;
break;
case 'x':
case 'X':
cm = cm - ISO14A_CONNECT; cm = cm - ISO14A_CONNECT;
break; }
default: if (arg_get_lit(3)->count) {
PrintAndLog("Unknown command."); cm |= ISO14A_NO_RATS;
return 1;
} }
cmdp++; CLIParserFree();
}
if (!disconnectAfter) if (leaveSignalON)
cm |= ISO14A_NO_DISCONNECT; cm |= ISO14A_NO_DISCONNECT;
UsbCommand c = {CMD_READER_ISO_14443a, {cm, 0, 0}}; UsbCommand c = {CMD_READER_ISO_14443a, {cm, 0, 0}};
@ -196,12 +190,12 @@ int CmdHF14AReader(const char *Cmd) {
if(card.ats_len >= 3) { // a valid ATS consists of at least the length byte (TL) and 2 CRC bytes if(card.ats_len >= 3) { // a valid ATS consists of at least the length byte (TL) and 2 CRC bytes
PrintAndLog(" ATS : %s", sprint_hex(card.ats, card.ats_len)); PrintAndLog(" ATS : %s", sprint_hex(card.ats, card.ats_len));
} }
if (!disconnectAfter) { if (leaveSignalON) {
PrintAndLog("Card is selected. You can now start sending commands"); PrintAndLog("Card is selected. You can now start sending commands");
} }
} }
if (disconnectAfter) { if (!leaveSignalON) {
PrintAndLog("Field dropped."); PrintAndLog("Field dropped.");
} }
@ -744,7 +738,7 @@ int CmdHF14AAPDU(const char *cmd) {
arg_str1(NULL, NULL, "<APDU (hex)>", NULL), arg_str1(NULL, NULL, "<APDU (hex)>", NULL),
arg_param_end arg_param_end
}; };
if (CLIParserParseString(cmd, argtable, sizeof(argtable) / sizeof(argtable[0]))){ if (CLIParserParseString(cmd, argtable, sizeof(argtable) / sizeof(argtable[0]), false)){
CLIParserFree(); CLIParserFree();
return 0; return 0;
} }