]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdcrc.c
begin reveng add-ons for lua
[proxmark3-svn] / client / cmdcrc.c
index 22eed561826dbb90ed84d55c8dd939cfa8d1b10e..28d2cde0d24011be3bb48d52ce1e01d2af9c47ad 100644 (file)
 // CRC Calculations from the software reveng commands
 //-----------------------------------------------------------------------------
 
+#include <stdlib.h>
+#ifdef _WIN32
+#  include <io.h>
+#  include <fcntl.h>
+#  ifndef STDIN_FILENO
+#    define STDIN_FILENO 0
+#  endif /* STDIN_FILENO */
+#endif /* _WIN32 */
+
 #include <stdio.h>
 #include <string.h>
+//#include <stdlib.h>
+//#include <ctype.h>
 #include "cmdmain.h"
-#include "cmdparser.h"
 #include "cmdcrc.h"
 #include "reveng/reveng.h"
-//#include "reveng/cli.h"
-static int CmdHelp(const char *Cmd);
+#include "ui.h"
+#include "util.h"
 
-int CmdCrcCalc(const char *Cmd)
-{
-       int argc = 0;
-       char Cmd2[CMD_BUFFER_SIZE] = {0x00};
-       char *argv[3];
+#define MAX_ARGS 20
 
-       for (int i = 0; i < 50; i++)
-               if (Cmd[i]==0x00) argc=i;
+int split(char *str, char *arr[MAX_ARGS]){
+       int beginIndex = 0;
+       int endIndex;
+       int maxWords = MAX_ARGS;
+       int wordCnt = 0;
+
+       while(1){
+               while(isspace(str[beginIndex])){
+                       ++beginIndex;
+               }
+               if(str[beginIndex] == '\0')
+                       break;
+                       endIndex = beginIndex;
+               while (str[endIndex] && !isspace(str[endIndex])){
+                       ++endIndex;
+               }
+               int len = endIndex - beginIndex;
+               char *tmp = calloc(len + 1, sizeof(char));
+               memcpy(tmp, &str[beginIndex], len);
+               arr[wordCnt++] = tmp;
+               //PrintAndLog("cnt: %d, %s",wordCnt-1, arr[wordCnt-1]);
+               beginIndex = endIndex;
+               if (wordCnt == maxWords)
+                       break;
+       }
+       return wordCnt;
+}
 
-       memcpy(Cmd2, Cmd, argc);
-       argv[1]=Cmd2;
+int CmdCrc(const char *Cmd)
+{
+       char name[] = {"reveng "};
+       char Cmd2[50 + 7];
+       memcpy(Cmd2, name, 7);
+       memcpy(Cmd2 + 7, Cmd, 50);
+       char *argv[MAX_ARGS];
+       int argc = split(Cmd2, argv);
+       //PrintAndLog("argc: %d, %s %s Cmd: %s",argc, argv[0], Cmd2, Cmd);
        reveng_main(argc, argv);
+       for(int i = 0; i < argc; ++i){
+               //puts(arr[i]);
+               free(argv[i]);
+       }
+
        return 0;
 }
 
-static command_t CommandTable[] = 
-{
-       {"help",        CmdHelp,        1, "This help"},
-       {"calc",        CmdCrcCalc,     1, "{ Calculate CRC's }"},
-       {NULL, NULL, 0, NULL}
-};
+int GetModels(char *Models[], int *count, uint32_t *width){
+       /* default values */
+       static model_t model = {
+               PZERO,          /* no CRC polynomial, user must specify */
+               PZERO,          /* Init = 0 */
+               P_BE,           /* RefIn = false, RefOut = false, plus P_RTJUST setting in reveng.h */
+               PZERO,          /* XorOut = 0 */
+               PZERO,          /* check value unused */
+               NULL            /* no model name */
+       };
+       //int ibperhx = 8, obperhx = 8;
+       //int rflags = 0, uflags = 0; /* search and UI flags */
 
-int CmdCrc(const char *Cmd)
-{
-  CmdsParse(CommandTable, Cmd);
-  return 0; 
+       //unsigned long width = 0UL;
+       //int c, mode = 0, args, psets, pass;
+       //poly_t apoly, crc, qpoly = PZERO, *apolys, *pptr = NULL, *qptr = NULL;
+       //model_t pset = model, *candmods, *mptr;
+       //char *string;
+
+       //myname = argv[0];
+
+       /* stdin must be binary */
+       #ifdef _WIN32
+               _setmode(STDIN_FILENO, _O_BINARY);
+       #endif /* _WIN32 */
+
+       SETBMP();
+       
+       //pos=0;
+       //optind=1;
+
+       if (*width == 0) { //reveng -D
+               *count = mcount();
+               //PrintAndLog("Count: %d",*count);
+               if(!*count){
+                       PrintAndLog("no preset models available");
+                       return 0;
+               }
+               for(int mode = 0; mode < *count; ++mode) {
+                       mbynum(&model, mode);
+                       mcanon(&model);
+                       size_t size = (model.name && *model.name) ? strlen(model.name) : 6;
+                       //PrintAndLog("Size: %d, %s",size,model.name);
+                       char *tmp = calloc(size+1, sizeof(char));
+                       if (tmp==NULL){
+                               PrintAndLog("out of memory?");
+                               return 0;
+                       }
+                       memcpy(tmp, model.name, size);
+                       Models[mode] = tmp;
+                       //ufound(&model);
+               }
+       } else { //reveng -s
+
+       }
+       //PrintAndLog("DONE");
+       return 1;
 }
 
-int CmdHelp(const char *Cmd)
-{
-  CmdsHelp(CommandTable);
-  return 0;
+//test call to GetModels
+int CmdrevengTest(const char *Cmd){
+       char *Models[80];
+       int count = 0;
+       uint32_t width = 0;
+       int ans = GetModels(Models, &count, &width);
+       if (!ans) return 0;
+       
+       PrintAndLog("Count: %d",count);
+       for (int i = 0; i < count; i++){
+               PrintAndLog("Model %d: %s",i,Models[i]);
+               free(Models[i]);
+       }
+       return 1;
 }
Impressum, Datenschutz