ADD: 'lf search' - added @marshmellow42 's hitag2 identification

This commit is contained in:
iceman1001 2017-01-20 10:09:06 +01:00
commit 69784c3801
3 changed files with 67 additions and 8 deletions

View file

@ -698,6 +698,42 @@ static bool hitag2_test_auth_attempts(byte_t* rx, const size_t rxlen, byte_t* tx
return true; return true;
} }
static bool hitag2_read_uid(byte_t* rx, const size_t rxlen, byte_t* tx, size_t* txlen) {
// Reset the transmission frame length
*txlen = 0;
// Try to find out which command was send by selecting on length (in bits)
switch (rxlen) {
// No answer, try to resurrect
case 0: {
// Just starting or if there is no answer
*txlen = 5;
memcpy(tx,"\xc0",nbytes(*txlen));
} break;
// Received UID
case 32: {
// Check if we received answer tag (at)
if (bAuthenticating) {
bAuthenticating = false;
} else {
// Store the received block
memcpy(tag.sectors[blocknr],rx,4);
blocknr++;
}
if (blocknr > 0) {
//DbpString("Read successful!");
bSuccessful = true;
return false;
}
} break;
// Unexpected response
default: {
Dbprintf("Uknown frame length: %d",rxlen);
return false;
} break;
}
return true;
}
void SnoopHitag(uint32_t type) { void SnoopHitag(uint32_t type) {
int frame_count; int frame_count;
@ -1129,7 +1165,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
clear_trace(); clear_trace();
set_tracing(TRUE); set_tracing(TRUE);
DbpString("Starting Hitag reader family"); //DbpString("Starting Hitag reader family");
// Check configuration // Check configuration
switch(htf) { switch(htf) {
@ -1171,7 +1207,13 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
bQuiet = false; bQuiet = false;
bCrypto = false; bCrypto = false;
} break; } break;
case RHT2F_UID_ONLY: {
blocknr = 0;
bQuiet = false;
bCrypto = false;
bAuthenticating = false;
bQuitTraceFull = true;
} break;
default: { default: {
Dbprintf("Error, unknown function: %d",htf); Dbprintf("Error, unknown function: %d",htf);
set_tracing(FALSE); set_tracing(FALSE);
@ -1229,23 +1271,23 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
// hitagS settings // hitagS settings
reset_sof = 1; reset_sof = 1;
t_wait = 200; t_wait = 200;
DbpString("Configured for hitagS reader"); //DbpString("Configured for hitagS reader");
} else if (htf < 20) { } else if (htf < 20) {
// hitag1 settings // hitag1 settings
reset_sof = 1; reset_sof = 1;
t_wait = 200; t_wait = 200;
DbpString("Configured for hitag1 reader"); //DbpString("Configured for hitag1 reader");
} else if (htf < 30) { } else if (htf < 30) {
// hitag2 settings // hitag2 settings
reset_sof = 4; reset_sof = 4;
t_wait = HITAG_T_WAIT_2; t_wait = HITAG_T_WAIT_2;
DbpString("Configured for hitag2 reader"); //DbpString("Configured for hitag2 reader");
} else { } else {
Dbprintf("Error, unknown hitag reader type: %d",htf); Dbprintf("Error, unknown hitag reader type: %d",htf);
set_tracing(FALSE); set_tracing(FALSE);
return; return;
} }
uint8_t attempt_count=0;
while(!bStop && !BUTTON_PRESS()) { while(!bStop && !BUTTON_PRESS()) {
// Watchdog hit // Watchdog hit
WDT_HIT(); WDT_HIT();
@ -1280,6 +1322,11 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
case RHT2F_TEST_AUTH_ATTEMPTS: { case RHT2F_TEST_AUTH_ATTEMPTS: {
bStop = !hitag2_test_auth_attempts(rx,rxlen,tx,&txlen); bStop = !hitag2_test_auth_attempts(rx,rxlen,tx,&txlen);
} break; } break;
case RHT2F_UID_ONLY: {
bStop = !hitag2_read_uid(rx, rxlen, tx, &txlen);
attempt_count++; //attempt 3 times to get uid then quit
if (!bStop && attempt_count == 3) bStop = true;
} break;
default: { default: {
Dbprintf("Error, unknown function: %d",htf); Dbprintf("Error, unknown function: %d",htf);
set_tracing(FALSE); set_tracing(FALSE);
@ -1326,6 +1373,8 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
bSkip = true; bSkip = true;
tag_sof = reset_sof; tag_sof = reset_sof;
response = 0; response = 0;
//Dbprintf("DEBUG: Waiting to receive frame");
uint32_t errorCount = 0;
// Receive frame, watch for at most T0*EOF periods // Receive frame, watch for at most T0*EOF periods
while (AT91C_BASE_TC1->TC_CV < T0*HITAG_T_WAIT_MAX) { while (AT91C_BASE_TC1->TC_CV < T0*HITAG_T_WAIT_MAX) {
@ -1375,10 +1424,13 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
rxlen++; rxlen++;
} }
} else { } else {
//Dbprintf("DEBUG: Wierd2");
errorCount++;
// Ignore wierd value, is to small to mean anything // Ignore wierd value, is to small to mean anything
} }
} }
//if we saw over 100 wierd values break it probably isn't hitag...
if (errorCount >100) break;
// We can break this loop if we received the last bit from a frame // We can break this loop if we received the last bit from a frame
if (AT91C_BASE_TC1->TC_CV > T0*HITAG_T_EOF) { if (AT91C_BASE_TC1->TC_CV > T0*HITAG_T_EOF) {
if (rxlen>0) break; if (rxlen>0) break;
@ -1390,7 +1442,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
Dbprintf("DONE: frame received: %d",frame_count); // Dbprintf("DONE: frame received: %d",frame_count);
cmd_send(CMD_ACK,bSuccessful,0,0,(byte_t*)tag.sectors,48); cmd_send(CMD_ACK,bSuccessful,0,0,(byte_t*)tag.sectors,48);
set_tracing(FALSE); set_tracing(FALSE);
} }

View file

@ -1119,6 +1119,12 @@ int CmdLFfind(const char *Cmd) {
} }
// TIdemod? // TIdemod?
if (!offline && (cmdp != '1')){
ans=CmdLFHitagReader("26");
if (ans==0) {
return 1;
}
}
PrintAndLog("\nNo Known Tags Found!\n"); PrintAndLog("\nNo Known Tags Found!\n");
if (testRaw=='u' || testRaw=='U'){ if (testRaw=='u' || testRaw=='U'){

View file

@ -22,6 +22,7 @@ typedef enum {
RHT2F_AUTHENTICATE = 22, RHT2F_AUTHENTICATE = 22,
RHT2F_CRYPTO = 23, RHT2F_CRYPTO = 23,
RHT2F_TEST_AUTH_ATTEMPTS = 25, RHT2F_TEST_AUTH_ATTEMPTS = 25,
RHT2F_UID_ONLY = 26
} hitag_function; } hitag_function;
typedef struct { typedef struct {