mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 13:23:51 -07:00
Add new cmd parser functions.
This commit is contained in:
parent
ce4c651853
commit
a3f8d635ca
2 changed files with 69 additions and 67 deletions
|
@ -88,10 +88,52 @@ static int usage_hf_felica_request_service(void) {
|
||||||
PrintAndLogEx(NORMAL, "\nUsage: hf felica rqservice [-h] <0A 0B 0C ... IDm hex> <01 Number of Node hex> <0A 0B Node Code List hex (Little Endian)> <0A 0B CRC hex>");
|
PrintAndLogEx(NORMAL, "\nUsage: hf felica rqservice [-h] <0A 0B 0C ... IDm hex> <01 Number of Node hex> <0A 0B Node Code List hex (Little Endian)> <0A 0B CRC hex>");
|
||||||
PrintAndLogEx(NORMAL, " -h this help");
|
PrintAndLogEx(NORMAL, " -h this help");
|
||||||
PrintAndLogEx(NORMAL, " -c calculate and append CRC");
|
PrintAndLogEx(NORMAL, " -c calculate and append CRC");
|
||||||
PrintAndLogEx(NORMAL, "Example: rqservice 01100910c11bc407 01 FFFF 2837");
|
PrintAndLogEx(NORMAL, "\nExample: hf felica rqservice 01100910c11bc407 01 FFFF 2837\n\n");
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parses line spacing and tabs.
|
||||||
|
* Returns 1 if the given char is a space or tab
|
||||||
|
*/
|
||||||
|
static int parse_cmd_parameter_separator(const char *Cmd, int i){
|
||||||
|
return Cmd[i] == ' ' || Cmd[i] == '\t' ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Counts and sets the number of commands.
|
||||||
|
*/
|
||||||
|
static void strip_cmds(const char *Cmd){
|
||||||
|
PrintAndLogEx(NORMAL, "CMD count: %i", strlen(Cmd));
|
||||||
|
while (*Cmd == ' ' || *Cmd == '\t'){
|
||||||
|
PrintAndLogEx(NORMAL, "CMD: %s", Cmd);
|
||||||
|
Cmd++;
|
||||||
|
}
|
||||||
|
PrintAndLogEx(NORMAL, "CMD string: %s", Cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a char is a hex value.
|
||||||
|
* @param Cmd
|
||||||
|
* @return one if it is a valid hex char. Zero if not a valid hex char.
|
||||||
|
*/
|
||||||
|
static bool is_hex_input(const char *Cmd, int i){
|
||||||
|
return (Cmd[i] >= '0' && Cmd[i] <= '9') || (Cmd[i] >= 'a' && Cmd[i] <= 'f') || (Cmd[i] >= 'A' && Cmd[i] <= 'F') ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param Extracts the data from the cmd and puts it into the data array.
|
||||||
|
*/
|
||||||
|
static void get_cmd_data(const char *Cmd, int i, uint16_t datalen, uint8_t *data, char buf[]){
|
||||||
|
uint32_t temp;
|
||||||
|
if (strlen(buf) >= 2) {
|
||||||
|
sscanf(buf, "%x", &temp);
|
||||||
|
data[datalen] = (uint8_t)(temp & 0xff);
|
||||||
|
*buf = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int usage_hf_felica_dump(void) {
|
static int usage_hf_felica_dump(void) {
|
||||||
PrintAndLogEx(NORMAL, "Usage: hf felica dump [-h] <outputfile>");
|
PrintAndLogEx(NORMAL, "Usage: hf felica dump [-h] <outputfile>");
|
||||||
PrintAndLogEx(NORMAL, " -h this help");
|
PrintAndLogEx(NORMAL, " -h this help");
|
||||||
|
@ -120,15 +162,24 @@ static int CmdHFFelicaDump(const char *Cmd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command parser for rqservice.
|
||||||
|
* @param Cmd input data of the user.
|
||||||
|
* @return client result code.
|
||||||
|
*/
|
||||||
static int CmdHFFelicaRequestService(const char *Cmd) {
|
static int CmdHFFelicaRequestService(const char *Cmd) {
|
||||||
if (strlen(Cmd) < 2) return usage_hf_felica_request_service();
|
if (strlen(Cmd) < 2) return usage_hf_felica_request_service();
|
||||||
char buf[5] = "";
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
uint8_t data[PM3_CMD_DATA_SIZE];
|
uint8_t data[PM3_CMD_DATA_SIZE];
|
||||||
|
bool crc = false;
|
||||||
|
bool length = false;
|
||||||
uint16_t datalen = 0;
|
uint16_t datalen = 0;
|
||||||
set_number_of_cmds();
|
char buf[5] = "";
|
||||||
|
|
||||||
|
strip_cmds(Cmd);
|
||||||
while (Cmd[i] != '\0') {
|
while (Cmd[i] != '\0') {
|
||||||
PrintAndLogEx(NORMAL, "String %s: ", Cmd[i]);
|
PrintAndLogEx(NORMAL, "Parse String %s: ", Cmd);
|
||||||
|
PrintAndLogEx(NORMAL, "i = %i: ", i);
|
||||||
if (Cmd[i] == '-') {
|
if (Cmd[i] == '-') {
|
||||||
switch (Cmd[i + 1]) {
|
switch (Cmd[i + 1]) {
|
||||||
case 'H':
|
case 'H':
|
||||||
|
@ -137,72 +188,36 @@ static int CmdHFFelicaRequestService(const char *Cmd) {
|
||||||
case 'c':
|
case 'c':
|
||||||
crc = true;
|
crc = true;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
length = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return usage_hf_felica_raw();
|
return usage_hf_felica_raw();
|
||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
i = i + parse_cmd_parameter(i);
|
PrintAndLogEx(NORMAL, "i after single params = %i: ", i);
|
||||||
if(is_hex_input()){
|
i = i + parse_cmd_parameter_separator(Cmd, i);
|
||||||
|
PrintAndLogEx(NORMAL, "i after cnd separator: %i", i);
|
||||||
|
if (is_hex_input(Cmd, i)){
|
||||||
buf[strlen(buf) + 1] = 0;
|
buf[strlen(buf) + 1] = 0;
|
||||||
buf[strlen(buf)] = Cmd[i];
|
buf[strlen(buf)] = Cmd[i];
|
||||||
i++;
|
i++;
|
||||||
i = i + get_cmd_data(i);
|
PrintAndLogEx(NORMAL, "i after is hex input: %i", i);
|
||||||
}else{
|
get_cmd_data(Cmd, i, datalen, data, buf);
|
||||||
|
|
||||||
|
}else {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
request_service();
|
request_service();
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
return 0;
|
return PM3_SUCCESS;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parses line spacing and tabs.
|
|
||||||
* Returns 1 if the given char is a space or tab
|
|
||||||
*/
|
|
||||||
static int parse_cmd_parameter_separator(const char *Cmd, int i){
|
|
||||||
PrintAndLogEx(NORMAL, "parse_cmd_parameter_separator String %s: ", Cmd[i]);
|
|
||||||
return Cmd[i] == ' ' || Cmd[i] == '\t' ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Counts and sets the number of commands.
|
|
||||||
*/
|
|
||||||
static void set_number_of_cmds(const char *Cmd){
|
|
||||||
while (*Cmd == ' ' || *Cmd == '\t'){
|
|
||||||
Cmd++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if a char is a hex value.
|
|
||||||
* @param Cmd
|
|
||||||
* @return one if it is a valid hex char. Zero if not a valid hex char.
|
|
||||||
*/
|
|
||||||
static bool is_hex_input(const char *Cmd, int i){
|
|
||||||
PrintAndLogEx(NORMAL, "is_hex_input String %s: ", Cmd[i]);
|
|
||||||
return (Cmd[i] >= '0' && Cmd[i] <= '9') || (Cmd[i] >= 'a' && Cmd[i] <= 'f') || (Cmd[i] >= 'A' && Cmd[i] <= 'F') ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param Cmd the chars from which the data will be extracted.
|
|
||||||
* @return a buffer with the data from the command
|
|
||||||
*/
|
|
||||||
static int get_cmd_data(const char *Cmd, int i){
|
|
||||||
int char_counter = 0;
|
|
||||||
if (strlen(buf) >= 2) {
|
|
||||||
sscanf(buf, "%x", &temp);
|
|
||||||
data[datalen] = (uint8_t)(temp & 0xff);
|
|
||||||
*buf = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CmdHFFelicaNotImplementedYet(const char *Cmd) {
|
static int CmdHFFelicaNotImplementedYet(const char *Cmd) {
|
||||||
PrintAndLogEx(NORMAL, "Feature not implemented Yet!");
|
PrintAndLogEx(NORMAL, "Feature not implemented Yet!");
|
||||||
return 0;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// simulate iso18092 / FeliCa tag
|
// simulate iso18092 / FeliCa tag
|
||||||
|
@ -717,21 +732,10 @@ int readFelicaUid(bool verbose) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dump(const char *Cmd) {
|
|
||||||
clearCommandBuffer();
|
|
||||||
char ctmp = tolower(param_getchar(Cmd, 0));
|
|
||||||
if (ctmp == 'h') return usage_hf_felica_dumplite();
|
|
||||||
|
|
||||||
// TODO FINISH THIS METHOD
|
|
||||||
PrintAndLogEx(SUCCESS, "NOT IMPLEMENTED YET!");
|
|
||||||
return PM3_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int request_service() {
|
int request_service() {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
{"----------- General -----------", CmdHelp, IfPm3Iso14443a, ""},
|
{"----------- General -----------", CmdHelp, IfPm3Iso14443a, ""},
|
||||||
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
||||||
|
@ -740,7 +744,7 @@ static command_t CommandTable[] = {
|
||||||
{"sniff", CmdHFFelicaSniff, IfPm3Felica, "Sniff ISO 18092/FeliCa traffic"},
|
{"sniff", CmdHFFelicaSniff, IfPm3Felica, "Sniff ISO 18092/FeliCa traffic"},
|
||||||
{"raw", CmdHFFelicaCmdRaw, IfPm3Felica, "Send raw hex data to tag"},
|
{"raw", CmdHFFelicaCmdRaw, IfPm3Felica, "Send raw hex data to tag"},
|
||||||
{"----------- FeliCa Standard (support in progress) -----------", CmdHelp, IfPm3Iso14443a, ""},
|
{"----------- FeliCa Standard (support in progress) -----------", CmdHelp, IfPm3Iso14443a, ""},
|
||||||
{"dump", CmdHFFelicaDump, IfPm3Felica, "Wait for and try dumping FeliCa"},
|
//{"dump", CmdHFFelicaDump, IfPm3Felica, "Wait for and try dumping FeliCa"},
|
||||||
{"rqservice", CmdHFFelicaRequestService, IfPm3Felica, "verify the existence of Area and Service, and to acquire Key Version."},
|
{"rqservice", CmdHFFelicaRequestService, IfPm3Felica, "verify the existence of Area and Service, and to acquire Key Version."},
|
||||||
{"rqresponse", CmdHFFelicaNotImplementedYet, IfPm3Felica, "verify the existence of a card and its Mode."},
|
{"rqresponse", CmdHFFelicaNotImplementedYet, IfPm3Felica, "verify the existence of a card and its Mode."},
|
||||||
//{"rdNoEncryption", CmdHFFelicaNotImplementedYet, IfPm3Felica, "read Block Data from authentication-not-required Service."},
|
//{"rdNoEncryption", CmdHFFelicaNotImplementedYet, IfPm3Felica, "read Block Data from authentication-not-required Service."},
|
||||||
|
|
|
@ -15,6 +15,4 @@
|
||||||
|
|
||||||
int CmdHFFelica(const char *Cmd);
|
int CmdHFFelica(const char *Cmd);
|
||||||
int readFelicaUid(bool verbose);
|
int readFelicaUid(bool verbose);
|
||||||
int dump();
|
|
||||||
int request_service();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue