//----------------------------------------------------------------------------- // 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] "); PrintAndLog("Options:"); PrintAndLog(" h This help"); PrintAndLog(" 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; }