More patches from en4rab to the hexsamples, plus patches to legicsave and legicdecode (also by en4rab).

This commit is contained in:
martin.holst@gmail.com 2013-07-12 20:03:31 +00:00
commit 4961e292aa
2 changed files with 62 additions and 81 deletions

View file

@ -393,46 +393,43 @@ int CmdGrid(const char *Cmd)
int CmdHexsamples(const char *Cmd) int CmdHexsamples(const char *Cmd)
{ {
int n; int i, j;
int requested = 0; int requested = 0;
int offset = 0; int offset = 0;
sscanf(Cmd, "%i %i", &requested, &offset); char string_buf[25];
char* string_ptr = string_buf;
int delivered = 0;
uint8_t got[40000]; uint8_t got[40000];
/* round up to nearest 8 bytes so the printed data is all valid */ sscanf(Cmd, "%i %i", &requested, &offset);
if (requested < 8) {
/* if no args send something */
if (requested == 0) {
requested = 8; requested = 8;
} }
if (requested % 8 != 0) {
int remainder = requested % 8;
requested = requested + 8 - remainder;
}
if (offset + requested > sizeof(got)) { if (offset + requested > sizeof(got)) {
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000"); PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000");
return 0; return 0;
} else {
n = requested;
} }
GetFromBigBuf(got,n,offset); GetFromBigBuf(got,requested,offset);
WaitForResponse(CMD_ACK,NULL); WaitForResponse(CMD_ACK,NULL);
for (int j = 0; j < n; j += 8) { i = 0;
PrintAndLog("%02x %02x %02x %02x %02x %02x %02x %02x", for (j = 0; j < requested; j++) {
sample_buf[j+0], i++;
sample_buf[j+1], string_ptr += sprintf(string_ptr, "%02x ", got[j]);
sample_buf[j+2], if (i == 8) {
sample_buf[j+3], *(string_ptr - 1) = '\0'; // remove the trailing space
sample_buf[j+4], PrintAndLog("%s", string_buf);
sample_buf[j+5], string_buf[0] = '\0';
sample_buf[j+6], string_ptr = string_buf;
sample_buf[j+7] i = 0;
); }
delivered += 8; if (j == requested - 1 && string_buf[0] != '\0') { // print any remaining bytes
if (delivered >= requested) *(string_ptr - 1) = '\0';
break; PrintAndLog("%s", string_buf);
string_buf[0] = '\0';
}
} }
return 0; return 0;
} }

View file

@ -52,35 +52,20 @@ int CmdHelp(const char *Cmd)
*/ */
int CmdLegicDecode(const char *Cmd) int CmdLegicDecode(const char *Cmd)
{ {
int h, i, j, k, n; int i, j, k, n;
int segment_len = 0; int segment_len = 0;
int segment_flag = 0; int segment_flag = 0;
int stamp_len = 0; int stamp_len = 0;
int crc = 0; int crc = 0;
int wrp = 0; int wrp = 0;
int wrc = 0; int wrc = 0;
int data_buf[1032]; // receiver buffer uint8_t data_buf[1024]; // receiver buffer
char out_string[3076]; // just use big buffer - bad practice char out_string[3076]; // just use big buffer - bad practice
char token_type[4]; char token_type[4];
int delivered = 0;
h = 0;
// copy data from proxmark into buffer // copy data from proxmark into buffer
for (i = 0; i < 256; i += 12, h += 48) { GetFromBigBuf(data_buf,sizeof(data_buf),0);
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; WaitForResponse(CMD_ACK,NULL);
SendCommand(&c);
WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
for (j = 0; j < 48; j += 8) {
for (k = 0; k < 8; k++) {
data_buf[h+j+k] = sample_buf[j+k];
}
delivered += 8;
if (delivered >= 1024)
break;
}
}
// Output CDF System area (9 bytes) plus remaining header area (12 bytes) // Output CDF System area (9 bytes) plus remaining header area (12 bytes)
@ -264,24 +249,27 @@ int CmdLegicLoad(const char *Cmd)
int CmdLegicSave(const char *Cmd) int CmdLegicSave(const char *Cmd)
{ {
int n;
int requested = 1024; int requested = 1024;
int offset = 0; int offset = 0;
char filename[1024];
sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
if (offset % 4 != 0) {
PrintAndLog("Offset must be a multiple of 4");
return 0;
}
offset = offset/4;
int delivered = 0; int delivered = 0;
char filename[1024];
uint8_t got[1024];
sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
/* If no length given save entire legic read buffer */
/* round up to nearest 8 bytes so the saved data can be used with legicload */
if (requested == 0) { if (requested == 0) {
n = 12; requested = 1024;
requested = 12; }
} else { if (requested % 8 != 0) {
n = requested/4; int remainder = requested % 8;
requested = requested + 8 - remainder;
}
if (offset + requested > sizeof(got)) {
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 1024");
return 0;
} }
FILE *f = fopen(filename, "w"); FILE *f = fopen(filename, "w");
@ -290,25 +278,21 @@ int CmdLegicSave(const char *Cmd)
return -1; return -1;
} }
for (int i = offset; i < n+offset; i += 12) { GetFromBigBuf(got,requested,offset);
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; WaitForResponse(CMD_ACK,NULL);
SendCommand(&c);
WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL); for (int j = 0; j < requested; j += 8) {
for (int j = 0; j < 48; j += 8) { fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n", got[j+0],
sample_buf[j+0], got[j+1],
sample_buf[j+1], got[j+2],
sample_buf[j+2], got[j+3],
sample_buf[j+3], got[j+4],
sample_buf[j+4], got[j+5],
sample_buf[j+5], got[j+6],
sample_buf[j+6], got[j+7]
sample_buf[j+7] );
); delivered += 8;
delivered += 8;
if (delivered >= requested)
break;
}
if (delivered >= requested) if (delivered >= requested)
break; break;
} }