#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
#include "proxmark3.h"
#include "cmdlf.h"
#include "lfdemod.h" // for psk2TOpsk1
#include "cmdlfcotag.h" // for COTAG menu
#include "cmdlfvisa2000.h" // for VISA2000 menu
#include "cmdlfindala.h" // for indala menu
+#include "cmdlfgproxii.h"// for gproxii menu
+#include "cmdlffdx.h" // for fdx-b menu
+#include "cmdlfparadox.h"// for paradox menu
+#include "cmdlfnexwatch.h"//for nexwatch menu
+#include "cmdlfjablotron.h" //for jablotron menu
+#include "cmdlfnoralsy.h"// for noralsy menu
+#include "cmdlfsecurakey.h"//for securakey menu
bool g_lf_threshold_set = false;
static int CmdHelp(const char *Cmd);
PrintAndLog("Options: ");
PrintAndLog(" h This help");
PrintAndLog(" s silent run no printout");
- PrintAndLog("This function takes no arguments. ");
+ PrintAndLog(" [# samples] # samples to collect (optional)");
PrintAndLog("Use 'lf config' to set parameters.");
return 0;
}
return 0;
}
+bool lf_read(bool silent, uint32_t samples) {
+ if (offline) return false;
+ UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {silent,samples,0}};
+ clearCommandBuffer();
+ //And ship it to device
+ SendCommand(&c);
+
+ UsbCommand resp;
+ if (g_lf_threshold_set) {
+ WaitForResponse(CMD_ACK,&resp);
+ } else {
+ if ( !WaitForResponseTimeout(CMD_ACK,&resp,2500) ) {
+ PrintAndLog("command execution time out");
+ return false;
+ }
+ }
+ getSamples(resp.arg[0], silent);
+
+ return true;
+}
+
int CmdLFRead(const char *Cmd)
{
- if (offline) return 0;
uint8_t cmdp = 0;
- bool arg1 = false;
+ bool silent = false;
if (param_getchar(Cmd, cmdp) == 'h')
{
return usage_lf_read();
}
- if (param_getchar(Cmd, cmdp) == 's') arg1 = true; //suppress print
- //And ship it to device
- UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
- clearCommandBuffer();
- SendCommand(&c);
- if (g_lf_threshold_set) {
- WaitForResponse(CMD_ACK,NULL);
- } else {
- if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
- PrintAndLog("command execution time out");
- return 1;
- }
+ if (param_getchar(Cmd, cmdp) == 's') {
+ silent = true; //suppress print
+ cmdp++;
}
- return 0;
+ uint32_t samples = param_get32ex(Cmd, cmdp, 0, 10);
+ return lf_read(silent, samples);
}
int CmdLFSnoop(const char *Cmd)
clearCommandBuffer();
SendCommand(&c);
WaitForResponse(CMD_ACK,NULL);
+ getSamples(0, true);
+
return 0;
}
//check for em4x05/em4x69 chips first
save_restoreGB(1);
+ save_restoreDB(1);
if ((!offline && (cmdp != '1')) && EM4x05Block0Test(&wordData)) {
PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nTry lf em 4x05... commands\n");
save_restoreGB(0);
+ save_restoreDB(0);
return 1;
}
//TODO check for t55xx chip...
+ if ((!offline && (cmdp != '1')) && tryDetectP1(true)) {
+ PrintAndLog("\nValid T55xx Chip Found\nTry lf t55xx ... commands\n");
+ save_restoreGB(0);
+ save_restoreDB(0);
+ return 1;
+ }
save_restoreGB(0);
- return 1;
+ save_restoreDB(0);
+ return 0;
}
//by marshmellow
return 0;
}
- if (!offline && (cmdp != '1')){
- CmdLFRead("s");
- getSamples("30000",false);
+ if (!offline && (cmdp != '1')) {
+ lf_read(true, 30000);
} else if (GraphTraceLen < minLength) {
PrintAndLog("Data in Graphbuffer was too small.");
return 0;
return 1;
}
ans=CmdCOTAGRead("");
- if (ans>0){
+ if (ans>0) {
PrintAndLog("\nValid COTAG ID Found!");
return 1;
}
return 0;
}
+ // TODO test for modulation then only test formats that use that modulation
+
ans=CmdFSKdemodIO("");
if (ans>0) {
PrintAndLog("\nValid IO Prox ID Found!");
return CheckChipType(cmdp);
}
- ans=CmdFDXBdemodBI("");
+ ans=CmdFdxDemod(""); //biphase
if (ans>0) {
PrintAndLog("\nValid FDX-B ID Found!");
return CheckChipType(cmdp);
}
- ans=EM4x50Read("", false);
+ ans=EM4x50Read("", false); //ask
if (ans>0) {
PrintAndLog("\nValid EM4x50 ID Found!");
return 1;
- }
+ }
+
+ ans=CmdJablotronDemod("");
+ if (ans>0) {
+ PrintAndLog("\nValid Jablotron ID Found!");
+ return CheckChipType(cmdp);
+ }
+
+ ans=CmdNoralsyDemod("");
+ if (ans>0) {
+ PrintAndLog("\nValid Noralsy ID Found!");
+ return CheckChipType(cmdp);
+ }
+
+ ans=CmdSecurakeyDemod("");
+ if (ans>0) {
+ PrintAndLog("\nValid Securakey ID Found!");
+ return CheckChipType(cmdp);
+ }
ans=CmdVikingDemod("");
if (ans>0) {
PrintAndLog("\nValid Viking ID Found!");
return CheckChipType(cmdp);
- }
+ }
- ans=CmdIndalaDecode("");
+ ans=CmdIndalaDecode(""); //psk
if (ans>0) {
PrintAndLog("\nValid Indala ID Found!");
return CheckChipType(cmdp);
}
PrintAndLog("\nNo Known Tags Found!\n");
- if (testRaw=='u' || testRaw=='U'){
+ if (testRaw=='u' || testRaw=='U') {
ans=CheckChipType(cmdp);
//test unknown tag formats (raw mode)0
PrintAndLog("\nChecking for Unknown tags:\n");
ans=AutoCorrelate(4000, false, false);
if (ans > 0) PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
ans=GetFskClock("",false,false);
- if (ans != 0){ //fsk
+ if (ans != 0) { //fsk
ans=FSKrawDemod("",true);
if (ans>0) {
PrintAndLog("\nUnknown FSK Modulated Tag Found!");
- return 1;
+ return CheckChipType(cmdp);;
}
}
bool st = true;
if (ans>0) {
PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!");
PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'");
- return 1;
+ return CheckChipType(cmdp);;
}
ans=CmdPSK1rawDemod("");
if (ans>0) {
PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'");
PrintAndLog("\nCould also be PSK3 - [currently not supported]");
- PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod");
- return 1;
+ PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod'");
+ return CheckChipType(cmdp);;
}
+ ans = CheckChipType(cmdp);
PrintAndLog("\nNo Data Found!\n");
}
return 0;
static command_t CommandTable[] =
{
{"help", CmdHelp, 1, "This help"},
- {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
- {"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"},
- {"em", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
- {"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
- {"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"},
- {"io", CmdLFIO, 1, "{ ioProx tags... }"},
- {"indala", CmdLFINDALA, 1, "{ Indala tags... }"},
- {"presco", CmdLFPresco, 1, "{ Presco RFIDs... }"},
- {"pcf7931", CmdLFPCF7931, 1, "{ PCF7931 RFIDs... }"},
+ {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
+ {"cotag", CmdLFCOTAG, 1, "{ COTAG CHIPs... }"},
+ {"em", CmdLFEM4X, 1, "{ EM4X CHIPs & RFIDs... }"},
+ {"fdx", CmdLFFdx, 1, "{ FDX-B RFIDs... }"},
+ {"gproxii", CmdLF_G_Prox_II, 1, "{ G Prox II RFIDs... }"},
+ {"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
+ {"hitag", CmdLFHitag, 1, "{ Hitag CHIPs... }"},
+ {"io", CmdLFIO, 1, "{ ioProx RFIDs... }"},
+ {"indala", CmdLFINDALA, 1, "{ Indala RFIDs... }"},
+ {"jablotron", CmdLFJablotron, 1, "{ Jablotron RFIDs... }"},
+ {"nexwatch", CmdLFNexWatch, 1, "{ NexWatch RFIDs... }"},
+ {"noralsy", CmdLFNoralsy, 1, "{ Noralsy RFIDs... }"},
+ {"paradox", CmdLFParadox, 1, "{ Paradox RFIDs... }"},
+ {"presco", CmdLFPresco, 1, "{ Presco RFIDs... }"},
+ {"pcf7931", CmdLFPCF7931, 1, "{ PCF7931 CHIPs... }"},
{"pyramid", CmdLFPyramid, 1, "{ Farpointe/Pyramid RFIDs... }"},
- {"t55xx", CmdLFT55XX, 1, "{ T55xx RFIDs... }"},
- {"ti", CmdLFTI, 1, "{ TI RFIDs... }"},
- {"viking", CmdLFViking, 1, "{ Viking tags... }"},
- {"visa2000", CmdLFVisa2k, 1, "{ Visa2000 RFIDs...}"},
+ {"securakey", CmdLFSecurakey, 1, "{ Securakey RFIDs... }"},
+ {"t55xx", CmdLFT55XX, 1, "{ T55xx CHIPs... }"},
+ {"ti", CmdLFTI, 1, "{ TI CHIPs... }"},
+ {"viking", CmdLFViking, 1, "{ Viking RFIDs... }"},
+ {"visa2000", CmdLFVisa2k, 1, "{ Visa2000 RFIDs... }"},
{"cmdread", CmdLFCommandRead, 0, "<d period> <z period> <o period> <c command> ['H'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'H' for 134)"},
{"config", CmdLFSetConfig, 0, "Set config for LF sampling, bit/sample, decimation, frequency"},
{"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"},