Standalone mode: Adding Legic Prime read/sim run

This commit adds a standalone mode for Legic Prime.
It reads and simulates a Legic tag.
Tested with MIM1024 tags.
MIM256 and MIM512 should work to. We just read the data and for simulating
we pretend to be a MIM1024 card.

Co-authored-by: Stefanie Hofmann <>
This commit is contained in:
Uli Heilmeier 2020-02-25 22:24:16 +01:00
commit 8c8a86cb83
5 changed files with 93 additions and 3 deletions

View file

@ -0,0 +1,81 @@
//-----------------------------------------------------------------------------
// Stefanie Hofmann, 2020
// Uli Heilmeier, 2020
//
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
// at your option, any later version. See the LICENSE.txt file for the text of
// the license.
//-----------------------------------------------------------------------------
// main code for Legic Prime read/sim
//-----------------------------------------------------------------------------
#include "standalone.h"
#include "proxmark3_arm.h"
#include "appmain.h"
#include "fpgaloader.h"
#include "util.h"
#include "dbprint.h"
#include "ticks.h"
#include "legicrf.h"
#include "legicrfsim.h"
void ModInfo(void) {
DbpString(" HF Legic Prime standalone ");
}
// Searching for Legic card until found and read.
// Simulating recorded Legic Prime card.
// C = Searching
// A, B, C = Reading
// A, D = Simulating
void RunMod(){
StandAloneMode();
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
Dbprintf(">> HF Legic Prime Read/Simulate Started <<");
int read_success;
for(;;){
WDT_HIT();
//exit from hf_legic, send usbcommand
if(data_available()) break;
//Was our button held down or pressed?
int button_pressed = BUTTON_HELD(280);
if(button_pressed != BUTTON_HOLD) continue;
LED_A_OFF();
LED_B_OFF();
LED_C_ON();
LED_D_OFF();
WAIT_BUTTON_RELEASED();
//record
DbpString("[=] start recording");
//search for legic card until reading successfull or button pressed
do{
LED_C_ON();
SpinDelay(1000);
// We don't care if we read a MIM256, MIM512 or MIM1024
// we just read 1024 bytes
LegicRfReader(0, 1024, 0x55);
read_success = check_success();
}while(read_success == 0 && !BUTTON_PRESS());
//simulate if read successfully
if(read_success == 1){
LED_A_OFF();
LED_B_OFF();
LED_C_OFF();
LED_D_ON();
// The read data is migrated to a MIM1024 card
LegicRfSimulate(2);
}else{
LEDsoff();
WAIT_BUTTON_RELEASED();
}
}
}