mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-14 03:03:14 +08:00
64 lines
2.1 KiB
C
64 lines
2.1 KiB
C
//-----------------------------------------------------------------------------
|
|
// Copyright (C) 2016 iceman
|
|
//
|
|
// 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.
|
|
//-----------------------------------------------------------------------------
|
|
// Analyse bytes commands
|
|
//-----------------------------------------------------------------------------
|
|
#include "cmdanalyse.h"
|
|
|
|
static int CmdHelp(const char *Cmd);
|
|
|
|
int usage_analyse_lcr(void) {
|
|
PrintAndLog("Specifying the bytes of a UID with a known LRC will find the last byte value");
|
|
PrintAndLog("needed to generate that LRC with a rolling XOR. All bytes should be specified in HEX.");
|
|
PrintAndLog("");
|
|
PrintAndLog("Usage: analyse lcr [h] <bytes>");
|
|
PrintAndLog("Options:");
|
|
PrintAndLog(" h This help");
|
|
PrintAndLog(" <bytes> bytes to calc missing XOR in a LCR");
|
|
PrintAndLog("");
|
|
PrintAndLog("Samples:");
|
|
PrintAndLog(" analyse lcr 04008064BA");
|
|
PrintAndLog("expected output: Target (BA) requires final LRC XOR byte value: 5A");
|
|
return 0;
|
|
}
|
|
static uint8_t calculateLRC( uint8_t* bytes, uint8_t len) {
|
|
uint8_t LRC = 0;
|
|
for (uint8_t i = 0; i < len; i++)
|
|
LRC ^= bytes[i];
|
|
return LRC;
|
|
}
|
|
|
|
int CmdAnalyseLCR(const char *Cmd) {
|
|
uint8_t data[50];
|
|
char cmdp = param_getchar(Cmd, 0);
|
|
if (strlen(Cmd) == 0|| cmdp == 'h' || cmdp == 'H') return usage_analyse_lcr();
|
|
|
|
int len = 0;
|
|
param_gethex_ex(Cmd, 0, data, &len);
|
|
if ( len%2 ) return usage_analyse_lcr();
|
|
len >>= 1;
|
|
uint8_t finalXor = calculateLRC(data, len);
|
|
PrintAndLog("Target [%02X] requires final LRC XOR byte value: 0x%02X",data[len-1] ,finalXor);
|
|
return 0;
|
|
}
|
|
|
|
static command_t CommandTable[] = {
|
|
{"help", CmdHelp, 1, "This help"},
|
|
{"lcr", CmdAnalyseLCR, 0, "Generate final byte for XOR LRC"},
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
int CmdAnalyse(const char *Cmd) {
|
|
clearCommandBuffer();
|
|
CmdsParse(CommandTable, Cmd);
|
|
return 0;
|
|
}
|
|
|
|
int CmdHelp(const char *Cmd) {
|
|
CmdsHelp(CommandTable);
|
|
return 0;
|
|
}
|