+\r
+ memset(writeData, 0x00, sizeof(writeData));\r
+ }\r
+ return 0;\r
+}\r
+\r
+int CmdT55xxBruteForce(const char *Cmd) {\r
+\r
+ // load a default pwd file.\r
+ char buf[9];\r
+ char filename[FILE_PATH_SIZE]={0};\r
+ int keycnt = 0;\r
+ uint8_t stKeyBlock = 20;\r
+ uint8_t *keyBlock = NULL, *p;\r
+ keyBlock = calloc(stKeyBlock, 6);\r
+ if (keyBlock == NULL) return 1;\r
+\r
+ uint32_t start_password = 0x00000000; //start password\r
+ uint32_t end_password = 0xFFFFFFFF; //end password\r
+ bool found = false;\r
+\r
+ char cmdp = param_getchar(Cmd, 0);\r
+ if (cmdp == 'h' || cmdp == 'H') return usage_t55xx_bruteforce();\r
+\r
+ if (cmdp == 'i' || cmdp == 'I') {\r
+\r
+ int len = strlen(Cmd+2);\r
+ if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
+ memcpy(filename, Cmd+2, len);\r
+\r
+ FILE * f = fopen( filename , "r");\r
+\r
+ if ( !f ) {\r
+ PrintAndLog("File: %s: not found or locked.", filename);\r
+ free(keyBlock);\r
+ return 1;\r
+ }\r
+\r
+ while( fgets(buf, sizeof(buf), f) ){\r
+ if (strlen(buf) < 8 || buf[7] == '\n') continue;\r
+\r
+ while (fgetc(f) != '\n' && !feof(f)) ; //goto next line\r
+\r
+ //The line start with # is comment, skip\r
+ if( buf[0]=='#' ) continue;\r
+\r
+ if (!isxdigit(buf[0])){\r
+ PrintAndLog("File content error. '%s' must include 8 HEX symbols", buf);\r
+ continue;\r
+ }\r
+ \r
+ buf[8] = 0;\r
+\r
+ if ( stKeyBlock - keycnt < 2) {\r
+ p = realloc(keyBlock, 6*(stKeyBlock+=10));\r
+ if (!p) {\r
+ PrintAndLog("Cannot allocate memory for defaultKeys");\r
+ free(keyBlock);\r
+ return 2;\r
+ }\r
+ keyBlock = p;\r
+ }\r
+ memset(keyBlock + 4 * keycnt, 0, 4);\r
+ num_to_bytes(strtoll(buf, NULL, 16), 4, keyBlock + 4*keycnt);\r
+ PrintAndLog("chk custom pwd[%2d] %08X", keycnt, bytes_to_num(keyBlock + 4*keycnt, 4));\r
+ keycnt++;\r
+ memset(buf, 0, sizeof(buf));\r