char token_type[4];
// copy data from proxmark into buffer
- GetFromBigBuf(data_buf,sizeof(data_buf),0);
- WaitForResponse(CMD_ACK,NULL);
-
+ GetFromBigBuf(data_buf, sizeof(data_buf), 0);
+ if ( !WaitForResponseTimeout(CMD_ACK, NULL, 2000)){
+ PrintAndLog("Command execute timeout");
+ return 1;
+ }
+
// Output CDF System area (9 bytes) plus remaining header area (12 bytes)
crc = data_buf[4];
uint32_t calc_crc = CRC8Legic(data_buf, 4);
printf("-------------------------------------\n");
i = 22;
// 64 potential segements
+ // how to detect there is no segments?!?
for ( segmentNum=0; segmentNum<64; segmentNum++ ) {
segment_len = ((data_buf[i+1]^crc)&0x0f) * 256 + (data_buf[i]^crc);
segment_flag = ((data_buf[i+1]^crc)&0xf0)>>4;
if ( hasWRC ) {
PrintAndLog("WRC protected area: (I %d | K %d| WRC %d)", i, k, wrc);
-
- for ( k=i; k < wrc; k++)
- data_buf[k] ^= crc;
-
- //is WRC / 8?
-
- // for ( k=i; k < wrc; k += 8)
+
+ // de-xor? if not zero, assume it needs xoring.
+ if ( data_buf[i] > 0) {
+ for ( k=i; k < wrc; ++k)
+ data_buf[k] ^= crc;
+ }
print_hex_break( data_buf+i, wrc, 16);
i += wrc;
// de-xor? if not zero, assume it needs xoring.
if ( data_buf[i] > 0) {
- for (k=i; k < wrp_len; k++)
+ for (k=i; k < wrp_len; ++k)
data_buf[k] ^= crc;
}
- // for (k=i; k < wrp_len; k += 16) {
-
print_hex_break( data_buf+i, wrp_len, 16);
- // }
i += wrp_len;
+ // does this one work?
if( wrp_len == 8 )
PrintAndLog("Card ID: %2X%02X%02X", data_buf[i-4]^crc, data_buf[i-3]^crc, data_buf[i-2]^crc);
}
- PrintAndLog("Remaining segment payload:");
+ PrintAndLog("Remaining segment payload: (I %d | K %d | Remain LEN %d)", i, k, remain_seg_payload_len);
if ( data_buf[i] > 0 ) {
- for ( k=i; k < remain_seg_payload_len; k++)
+ for ( k=i; k < remain_seg_payload_len; ++k)
data_buf[k] ^= crc;
}
- // for ( k=i; k < remain_seg_payload_len; k++)
print_hex_break( data_buf+i, remain_seg_payload_len, 16);
i += remain_seg_payload_len;
printf("\n-------------------------------------\n");
+
// end with last segment
if (segment_flag & 0x8) return 0;
}
GetFromBigBuf(got, requested, offset);
- WaitForResponse(CMD_ACK, NULL);
+ if ( !WaitForResponseTimeout(CMD_ACK, NULL, 2000)){
+ PrintAndLog("Command execute timeout");
+ return 1;
+ }
for (int j = 0; j < requested; j += 8) {
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
return 0;
}
+//TODO: write a help text (iceman)
int CmdLegicRfSim(const char *Cmd) {
UsbCommand c = {CMD_SIMULATE_TAG_LEGIC_RF, {6,3,0}};
sscanf(Cmd, " %"lli" %"lli" %"lli, &c.arg[0], &c.arg[1], &c.arg[2]);
return 0;
}
+//TODO: write a help text (iceman)
int CmdLegicRfWrite(const char *Cmd) {
UsbCommand c = {CMD_WRITER_LEGIC_RF};
int res = sscanf(Cmd, " 0x%"llx" 0x%"llx, &c.arg[0], &c.arg[1]);