char result[30];
int dataLen;
char endian = 0;
- dataLen = param_getstr(Cmd, cmdp++, inModel);
+ dataLen = param_getstr(Cmd, cmdp++, inModel, sizeof(inModel));
if (dataLen < 4) return 0;
- dataLen = param_getstr(Cmd, cmdp++, inHexStr);
+ dataLen = param_getstr(Cmd, cmdp++, inHexStr, sizeof(inHexStr));
if (dataLen < 4) return 0;
bool reverse = (param_get8(Cmd, cmdp++)) ? true : false;
endian = param_getchar(Cmd, cmdp++);
// takes hex string in and searches for a matching result (hex string must include checksum)
int CmdrevengSearch(const char *Cmd){
char inHexStr[50] = {0x00};
- int dataLen = param_getstr(Cmd, 0, inHexStr);
+ int dataLen = param_getstr(Cmd, 0, inHexStr, sizeof(inHexStr));
if (dataLen < 4) return 0;
char *Models[80];
bool showWaitCycles = false;
bool markCRCBytes = false;
char type[40] = {0};
- int tlen = param_getstr(Cmd,0,type);
+ int tlen = param_getstr(Cmd,0,type, sizeof(type));
char param1 = param_getchar(Cmd, 1);
char param2 = param_getchar(Cmd, 2);
bool errors = false;
//File handling and reading
FILE *f;
char filename[FILE_PATH_SIZE];
- if(opt == 'f' && param_getstr(Cmd, 1, filename) > 0)
+ if(opt == 'f' && param_getstr(Cmd, 1, filename, sizeof(filename)) > 0)
{
f = fopen(filename, "rb");
}else{
//Open the tagdump-file
FILE *f;
char filename[FILE_PATH_SIZE];
- if(opt == 'f' && param_getstr(Cmd, 1, filename) > 0) {
+ if(opt == 'f' && param_getstr(Cmd, 1, filename, sizeof(filename)) > 0) {
f = fopen(filename, "rb");
if ( f == NULL ) {
PrintAndLog("Could not find file %s", filename);
case 'c':
case 'C':
have_credit_key = true;
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, CreditKEY, dataLen);
} else if (dataLen == 1) {
break;
case 'f':
case 'F':
- fileNameLen = param_getstr(Cmd, cmdp+1, filename);
+ fileNameLen = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));
if (fileNameLen < 1) {
PrintAndLog("No filename found after f");
errors = true;
case 'k':
case 'K':
have_debit_key = true;
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, KEY, dataLen);
} else if (dataLen == 1) {
break;
case 'k':
case 'K':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, KEY, dataLen);
} else if (dataLen == 1) {
break;
case 'f':
case 'F':
- fileNameLen = param_getstr(Cmd, cmdp+1, filename);
+ fileNameLen = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));
if (fileNameLen < 1) {
PrintAndLog("No filename found after f");
errors = true;
break;
case 'k':
case 'K':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, KEY, dataLen);
} else if (dataLen == 1) {
case 'k':
case 'K':
auth = true;
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, KEY, dataLen);
} else if (dataLen == 1) {
char fileName[255] = {0};
if(opt == 'f')
{
- if(param_getstr(Cmd, 1, fileName) > 0)
+ if(param_getstr(Cmd, 1, fileName, sizeof(fileName)) > 0)
{
return bruteforceFileNoKeys(fileName);
}else
char tempnum[5];
FILE *f;
char filename[FILE_PATH_SIZE];
- if (param_getstr(Cmd, 0, filename) < 1)
+ if (param_getstr(Cmd, 0, filename, sizeof(filename)) < 1)
return usage_hf_iclass_readtagfile();
- if (param_getstr(Cmd,1,(char *)&tempnum) < 1)
+ if (param_getstr(Cmd, 1, tempnum, sizeof(tempnum)) < 1)
startblock = 0;
else
sscanf(tempnum,"%d",&startblock);
- if (param_getstr(Cmd,2,(char *)&tempnum) < 1)
+ if (param_getstr(Cmd,2, tempnum, sizeof(tempnum)) < 1)
endblock = 0;
else
sscanf(tempnum,"%d",&endblock);
return usage_hf_iclass_calc_newkey();
case 'e':
case 'E':
- dataLen = param_getstr(Cmd, cmdp, tempStr);
+ dataLen = param_getstr(Cmd, cmdp, tempStr, sizeof(tempStr));
if (dataLen==2)
oldElite = true;
elite = true;
break;
case 'n':
case 'N':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, NEWKEY, dataLen);
} else if (dataLen == 1) {
break;
case 'o':
case 'O':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) {
errors = param_gethex(tempStr, 0, OLDKEY, dataLen);
} else if (dataLen == 1) {
return usage_hf_iclass_managekeys();
case 'f':
case 'F':
- fileNameLen = param_getstr(Cmd, cmdp+1, filename);
+ fileNameLen = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));
if (fileNameLen < 1) {
PrintAndLog("No filename found after f");
errors = true;
case 'k':
case 'K':
operation += 3; //set key
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 16) { //ul-c or ev1/ntag key length
errors = param_gethex(tempStr, 0, KEY, dataLen);
} else {
char ctmp3[3] = {0};\r
int len = param_getlength(Cmd, indx);\r
if (len > 0 && len < 4){\r
- param_getstr(Cmd, indx, ctmp3);\r
+ param_getstr(Cmd, indx, ctmp3, sizeof(ctmp3));\r
\r
*paramT |= (ctmp3[0] == 't' || ctmp3[0] == 'T');\r
*paramD |= (ctmp3[0] == 'd' || ctmp3[0] == 'D');\r
// double parameters - ts, ds\r
int clen = param_getlength(Cmd, 2);\r
if (clen == 2 || clen == 3){\r
- param_getstr(Cmd, 2, ctmp3);\r
+ param_getstr(Cmd, 2, ctmp3, sizeof(ctmp3));\r
ctmp = ctmp3[1];\r
}\r
//parse\r
keycnt++;\r
} else {\r
// May be a dic file\r
- if ( param_getstr(Cmd, 2 + i,filename) >= FILE_PATH_SIZE ) {\r
+ if ( param_getstr(Cmd, 2 + i, filename, sizeof(filename)) >= FILE_PATH_SIZE ) {\r
PrintAndLog("File name too long");\r
free(keyBlock);\r
return 2;\r
break;\r
case 'f':\r
case 'F':\r
- len = param_getstr(Cmd, cmdp+1, filename);\r
+ len = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));\r
if (len < 1) {\r
PrintAndLog("error no filename found");\r
return 0;\r
}\r
}\r
\r
- len = param_getstr(Cmd,nameParamNo,filename);\r
+ len = param_getstr(Cmd,nameParamNo,filename,sizeof(filename));\r
\r
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;\r
\r
}\r
}\r
\r
- len = param_getstr(Cmd,nameParamNo,filename);\r
+ len = param_getstr(Cmd,nameParamNo,filename,sizeof(filename));\r
\r
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;\r
\r
}\r
return 0;\r
} else {\r
- param_getstr(Cmd, 0, filename);\r
+ param_getstr(Cmd, 0, filename, sizeof(filename));\r
\r
len = strlen(filename);\r
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;\r
}\r
return 0;\r
} else {\r
- param_getstr(Cmd, 0, filename);\r
+ param_getstr(Cmd, 0, filename, sizeof(filename));\r
\r
len = strlen(filename);\r
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;\r
return usage_hf_mfu_info();
case 'k':
case 'K':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 32 || dataLen == 8) { //ul-c or ev1/ntag key length
errors = param_gethex(tempStr, 0, authenticationkey, dataLen);
dataLen /= 2; // handled as bytes from now on
return usage_hf_mfu_dump();
case 'k':
case 'K':
- dataLen = param_getstr(Cmd, cmdp+1, tempStr);
+ dataLen = param_getstr(Cmd, cmdp+1, tempStr, sizeof(tempStr));
if (dataLen == 32 || dataLen == 8) { //ul-c or ev1/ntag key length
errors = param_gethex(tempStr, 0, authenticationkey, dataLen);
dataLen /= 2;
break;
case 'n':
case 'N':
- fileNlen = param_getstr(Cmd, cmdp+1, filename);
+ fileNlen = param_getstr(Cmd, cmdp+1, filename, sizeof(filename));
if (!fileNlen) errors = true;
if (fileNlen > FILE_PATH_SIZE-5) fileNlen = FILE_PATH_SIZE-5;
cmdp += 2;
cmdp++;
break;
case 'c':
- param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes);
+ param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes, sizeof(c.d.asBytes));
cmdp+=2;
break;
case 'd':
uint8_t fcHigh=0, fcLow=0, clk=0;
uint8_t invert=0;
bool errors = false;
- char hexData[32] = {0x00}; // store entered hex data
+ char hexData[64] = {0x00}; // store entered hex data
uint8_t data[255] = {0x00};
int dataLen = 0;
uint8_t cmdp = 0;
// cmdp++;
// break;
case 'd':
- dataLen = param_getstr(Cmd, cmdp+1, hexData);
+ dataLen = param_getstr(Cmd, cmdp+1, hexData, sizeof(hexData));
if (dataLen==0) {
errors=true;
} else {
uint8_t encoding = 1, separator = 0;
uint8_t clk=0, invert=0;
bool errors = false;
- char hexData[32] = {0x00};
+ char hexData[64] = {0x00};
uint8_t data[255]= {0x00}; // store entered hex data
int dataLen = 0;
uint8_t cmdp = 0;
cmdp++;
break;
case 'd':
- dataLen = param_getstr(Cmd, cmdp+1, hexData);
+ dataLen = param_getstr(Cmd, cmdp+1, hexData, sizeof(hexData));
if (dataLen==0) {
errors=true;
} else {
uint8_t carrier=0, clk=0;
uint8_t invert=0;
bool errors = false;
- char hexData[32] = {0x00}; // store entered hex data
+ char hexData[64] = {0x00}; // store entered hex data
uint8_t data[255] = {0x00};
int dataLen = 0;
uint8_t cmdp = 0;
cmdp++;
break;
case 'd':
- dataLen = param_getstr(Cmd, cmdp+1, hexData);
+ dataLen = param_getstr(Cmd, cmdp+1, hexData, sizeof(hexData));
if (dataLen==0) {
errors=true;
} else {
delay = param_get32ex(Cmd, 4, 1000, 10);
}
- param_getstr(Cmd, 0, filename);
+ param_getstr(Cmd, 0, filename, sizeof(filename));
uidBlock = calloc(stUidBlock, 5);
if (uidBlock == NULL) return 1;
case 'D':
case 'd':
//param get string int param_getstr(const char *line, int paramnum, char * str)
- stringlen = param_getstr(Cmd, cmdp+1, id);
+ stringlen = param_getstr(Cmd, cmdp+1, id, sizeof(id));
if (stringlen < 2) return -1;
cmdp+=2;
break;
cmdp+=2;\r
break;\r
case 'd':\r
- param_getstr(Cmd, cmdp+1, modulation);\r
+ param_getstr(Cmd, cmdp+1, modulation, sizeof(modulation));\r
cmdp += 2;\r
\r
if ( strcmp(modulation, "FSK" ) == 0) {\r
return 0;
}
-int param_getstr(const char *line, int paramnum, char * str)
+int param_getstr(const char *line, int paramnum, char * str, size_t buffersize)
{
int bg, en;
- if (param_getptr(line, &bg, &en, paramnum)) return 0;
+ if (param_getptr(line, &bg, &en, paramnum)) {
+ return 0;
+ }
+
+ // Prevent out of bounds errors
+ if (en - bg + 1 >= buffersize) {
+ printf("out of bounds error: want %lu bytes have %lu bytes\n", en - bg + 1 + 1, buffersize);
+ return 0;
+ }
memcpy(str, line + bg, en - bg + 1);
str[en - bg + 1] = 0;
int hextobinarray(char *target, char *source)
{
int length, i, count= 0;
+ char* start = source;
char x;
length = strlen(source);
x -= '0';
else if (x >= 'A' && x <= 'F')
x -= 'A' - 10;
- else
+ else {
+ printf("Discovered unknown character %c %d at idx %d of %s\n", x, x, source - start, start);
return 0;
+ }
// output
for(i= 0 ; i < 4 ; ++i, ++count)
*(target++)= (x >> (3 - i)) & 1;
extern int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt);
extern int param_gethex_ex(const char *line, int paramnum, uint8_t * data, int *hexcnt);
extern int param_gethex_to_eol(const char *line, int paramnum, uint8_t * data, int maxdatalen, int *datalen);
-extern int param_getstr(const char *line, int paramnum, char * str);
+extern int param_getstr(const char *line, int paramnum, char * str, size_t buffersize);
extern int hextobinarray( char *target, char *source);
extern int hextobinstring( char *target, char *source);