X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/6c283951062aaad9d0d1ba8670b02895047be438..680433820190cca9441042cb835fb0d229f674a3:/client/cmdanalyse.c diff --git a/client/cmdanalyse.c b/client/cmdanalyse.c index 6a8e5bc0..fb084f43 100644 --- a/client/cmdanalyse.c +++ b/client/cmdanalyse.c @@ -8,6 +8,7 @@ // Analyse bytes commands //----------------------------------------------------------------------------- #include "cmdanalyse.h" +#include "nonce2key/nonce2key.h" static int CmdHelp(const char *Cmd); @@ -124,6 +125,29 @@ static uint8_t calcSumNibbleSubOnes( uint8_t* bytes, uint8_t len, uint32_t mask) return ~calcSumNibbleSub(bytes, len, mask); } +// measuring LFSR maximum length +int CmdAnalyseLfsr(const char *Cmd){ + + uint16_t start_state = 0; /* Any nonzero start state will work. */ + uint16_t lfsr = start_state; + //uint32_t period = 0; + + uint8_t iv = param_get8ex(Cmd, 0, 0, 16); + uint8_t find = param_get8ex(Cmd, 1, 0, 16); + + printf("LEGIC LFSR IV 0x%02X: \n", iv); + printf(" bit# | lfsr | ^0x40 | 0x%02X ^ lfsr \n",find); + + for (uint8_t i = 0x01; i < 0x30; i += 1) { + //period = 0; + legic_prng_init(iv); + legic_prng_forward(i); + lfsr = legic_prng_get_bits(12); + + printf(" %02X | %03X | %03X | %03X \n",i, lfsr, 0x40 ^ lfsr, find ^ lfsr); + } + return 0; +} int CmdAnalyseLCR(const char *Cmd) { uint8_t data[50]; char cmdp = param_getchar(Cmd, 0); @@ -176,7 +200,16 @@ int CmdAnalyseCRC(const char *Cmd) { PrintAndLog("LEGIC: CRC8 : %X (0xC6 expected)", legic8); PrintAndLog("MAXIM: CRC8 : %X (0xA1 expected)", CRC8Maxim(dataStr, sizeof(dataStr))); PrintAndLog("DNP : CRC16: %X (0x82EA expected)", CRC16_DNP(dataStr, sizeof(dataStr))); - PrintAndLog("CCITT: CRC16: %X (0xE5CC expected)", CRC16_CCITT(dataStr, sizeof(dataStr))); + PrintAndLog("CCITT: CRC16: %X (0xE5CC expected)", CRC16_CCITT(dataStr, sizeof(dataStr))); + + PrintAndLog("ICLASS org: CRC16: %X (0x expected)",iclass_crc16( (char*)dataStr, sizeof(dataStr))); + PrintAndLog("ICLASS ice: CRC16: %X (0x expected)",CRC16_ICLASS(dataStr, sizeof(dataStr))); + + + + uint8_t dataStr1234[] = { 0x1,0x2,0x3,0x4}; + PrintAndLog("ISO15693 org: : CRC16: %X (0xF0B8 expected)", Iso15693Crc(dataStr1234, sizeof(dataStr1234))); + PrintAndLog("ISO15693 ice: : CRC16: %X (0xF0B8 expected)", CRC16_Iso15693(dataStr1234, sizeof(dataStr1234))); free(data); return 0; @@ -188,6 +221,7 @@ int CmdAnalyseCHKSUM(const char *Cmd){ uint32_t mask = 0xFF; bool errors = false; int len = 0; + memset(data, 0x0, sizeof(data)); while(param_getchar(Cmd, cmdp) != 0x00) { switch(param_getchar(Cmd, cmdp)) { @@ -239,6 +273,59 @@ int CmdAnalyseDates(const char *Cmd){ PrintAndLog("To be implemented. Feel free to contribute!"); return 0; } +int CmdAnalyseTEASelfTest(const char *Cmd){ + + uint8_t v[8], v_le[8]; + memset(v, 0x00, sizeof(v)); + memset(v_le, 0x00, sizeof(v_le)); + uint8_t* v_ptr = v_le; + + uint8_t cmdlen = strlen(Cmd); + cmdlen = ( sizeof(v)<<2 < cmdlen ) ? sizeof(v)<<2 : cmdlen; + + if ( param_gethex(Cmd, 0, v, cmdlen) > 0 ){ + PrintAndLog("can't read hex chars, uneven? :: %u", cmdlen); + return 1; + } + + SwapEndian64ex(v , 8, 4, v_ptr); + + // ENCRYPTION KEY: + uint8_t key[16] = {0x55,0xFE,0xF6,0x30,0x62,0xBF,0x0B,0xC1,0xC9,0xB3,0x7C,0x34,0x97,0x3E,0x29,0xFB }; + uint8_t keyle[16]; + uint8_t* key_ptr = keyle; + SwapEndian64ex(key , sizeof(key), 4, key_ptr); + + PrintAndLog("TEST LE enc| %s", sprint_hex(v_ptr, 8)); + + tea_decrypt(v_ptr, key_ptr); + PrintAndLog("TEST LE dec | %s", sprint_hex_ascii(v_ptr, 8)); + + tea_encrypt(v_ptr, key_ptr); + tea_encrypt(v_ptr, key_ptr); + PrintAndLog("TEST enc2 | %s", sprint_hex_ascii(v_ptr, 8)); + + return 0; +} + +int CmdAnalyseA(const char *Cmd){ + +// uid(2e086b1a) nt(230736f6) par(0000000000000000) ks(0b0008000804000e) nr(000000000) +// uid(2e086b1a) nt(230736f6) par(0000000000000000) ks(0e0b0e0b090c0d02) nr(000000001) +// uid(2e086b1a) nt(230736f6) par(0000000000000000) ks(0e05060e01080b08) nr(000000002) + uint32_t uid = 0x2e086b1a, nt = 0x230736f6, nr = 0x000000001; + uint64_t ks_list = 0x0e0b0e0b090c0d02, r_key = 0; + + nonce2key_ex(0, 0 , uid, nt, nr, ks_list, &r_key); + + nr = 0x000000002; + ks_list = 0x0e05060e01080b08; + nonce2key_ex(0, 0 , uid, nt, nr, ks_list, &r_key); + + printf("Found valid key: %012"llx" \n", r_key); + return 0; +} + static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, @@ -246,6 +333,9 @@ static command_t CommandTable[] = { {"crc", CmdAnalyseCRC, 1, "Stub method for CRC evaluations"}, {"chksum", CmdAnalyseCHKSUM, 1, "Checksum with adding, masking and one's complement"}, {"dates", CmdAnalyseDates, 1, "Look for datestamps in a given array of bytes"}, + {"tea", CmdAnalyseTEASelfTest, 1, "Crypto TEA test"}, + {"lfsr", CmdAnalyseLfsr, 1, "LFSR tests"}, + {"a", CmdAnalyseA, 1, "num bits test"}, {NULL, NULL, 0, NULL} };