]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
ADD: `analyse nuid` - generates NUID 4byte from a UID 7byte. Mifare Classic Ev1...
authoriceman1001 <iceman@iuse.se>
Fri, 10 Mar 2017 08:48:36 +0000 (09:48 +0100)
committericeman1001 <iceman@iuse.se>
Fri, 10 Mar 2017 08:48:36 +0000 (09:48 +0100)
ref: http://www.gorferay.com/mifare-and-handling-of-uids/

client/cmdanalyse.c
client/cmdanalyse.h
common/iso14443crc.c
common/iso14443crc.h

index a8deb67fa38bd970c4428d4d9d17fb3f68ebe4b6..a7004293679853f511be08e50fb8c0ae0085a8f2 100644 (file)
@@ -22,7 +22,7 @@ int usage_analyse_lcr(void) {
        PrintAndLog("           <bytes>    bytes to calc missing XOR in a LCR");
        PrintAndLog("");
        PrintAndLog("Samples:");
-       PrintAndLog("           analyse lcr 04008064BA");
+       PrintAndLog("      analyse lcr 04008064BA");
        PrintAndLog("expected output: Target (BA) requires final LRC XOR byte value: 5A");
        return 0;
 }
@@ -38,7 +38,7 @@ int usage_analyse_checksum(void) {
        PrintAndLog("           m <mask>   bit mask to limit the outpuyt");
        PrintAndLog("");
        PrintAndLog("Samples:");
-       PrintAndLog("           analyse chksum b 137AF00A0A0D m FF");
+       PrintAndLog("      analyse chksum b 137AF00A0A0D m FF");
        PrintAndLog("expected output: 0x61");
        return 0;
 }
@@ -51,7 +51,7 @@ int usage_analyse_crc(void){
        PrintAndLog("           <bytes>    bytes to calc crc");
        PrintAndLog("");
        PrintAndLog("Samples:");
-       PrintAndLog("           analyse crc 137AF00A0A0D");
+       PrintAndLog("      analyse crc 137AF00A0A0D");
        return 0;
 }
 int usage_analyse_hid(void){
@@ -65,7 +65,19 @@ int usage_analyse_hid(void){
        PrintAndLog("           <bytes>    input bytes");
        PrintAndLog("");
        PrintAndLog("Samples:");
-       PrintAndLog("           analyse hid r 0123456789abcdef");
+       PrintAndLog("      analyse hid r 0123456789abcdef");
+       return 0;
+}
+int usage_analyse_nuid(void){
+       PrintAndLog("Generate 4byte NUID from 7byte UID");
+       PrintAndLog("");
+       PrintAndLog("Usage:  analyse hid [h] <bytes>");
+       PrintAndLog("Options:");
+       PrintAndLog("           h          This help");
+       PrintAndLog("           <bytes>  input bytes (14 hexsymbols)");
+       PrintAndLog("");
+       PrintAndLog("Samples:");
+       PrintAndLog("      analyse nuid 11223344556677");
        return 0;
 }
 
@@ -521,6 +533,53 @@ int CmdAnalyseHid(const char *Cmd){
        return 0;
 }
 
+void generate4bNUID(uint8_t *uid, uint8_t *nuid){
+       uint16_t crc;
+       uint8_t first, second;
+               
+       ComputeCrc14443(CRC_14443_A, uid, 3, &first, &second);
+       nuid[0] |= (second & 0xE0) | 0xF;
+       nuid[1] = first;
+       
+       crc = first;
+       crc |= second << 8;
+       
+       UpdateCrc14443(uid[3], &crc);
+       UpdateCrc14443(uid[4], &crc);
+       UpdateCrc14443(uid[5], &crc);
+       UpdateCrc14443(uid[6], &crc);
+               
+       nuid[2] = (crc >> 8) & 0xFF ;
+       nuid[3] = crc & 0xFF;
+}
+
+int CmdAnalyseNuid(const char *Cmd){
+       uint8_t nuid[4] = {0};  
+       uint8_t uid[7] = {0};
+       int len = 0;
+       char cmdp = param_getchar(Cmd, 0);
+       if (strlen(Cmd) == 0|| cmdp == 'h' || cmdp == 'H') return usage_analyse_nuid();
+
+       /* selftest  UID 040D681AB52281  -> NUID 8F430FEF */
+       if (cmdp == 't' || cmdp == 'T') {
+               memcpy(uid, "\x04\x0d\x68\x1a\xb5\x22\x81", 7);
+               generate4bNUID(uid, nuid);
+               if ( 0 == memcmp(nuid, "\x8f\x43\x0f\xef", 4))
+                       printf("Selftest OK\n");
+               else
+                       printf("Selftest Failed\n");
+               return 0;
+       }
+
+       param_gethex_ex(Cmd, 0, uid, &len);
+       if ( len%2  || len != 14) return usage_analyse_nuid();
+
+       generate4bNUID(uid, nuid);
+       
+       printf("UID  | %s \n", sprint_hex(uid, 7));
+       printf("NUID | %s \n", sprint_hex(nuid, 4));
+       return 0;
+}
 static command_t CommandTable[] = {
        {"help",        CmdHelp,            1, "This help"},
        {"lcr",         CmdAnalyseLCR,          1, "Generate final byte for XOR LRC"},
@@ -531,6 +590,7 @@ static command_t CommandTable[] = {
        {"lfsr",        CmdAnalyseLfsr,         1,      "LFSR tests"},
        {"a",           CmdAnalyseA,            1,      "num bits test"},
        {"hid",         CmdAnalyseHid,          1,      "Permute function from 'heart of darkness' paper"},
+       {"nuid",        CmdAnalyseNuid,         1,      "create NUID from 7byte UID"},
        {NULL, NULL, 0, NULL}
 };
 
index 70e472cdd30b2d05e4f2af4cbda9d3a781070bcb..adef8ce121460406633af55e1ae5efcdd6011037 100644 (file)
 #include "ui.h"                // PrintAndLog
 #include "util.h"
 #include "crc.h"
-#include "../common/iso15693tools.h"
+#include "iso15693tools.h"     //
+#include "iso14443crc.h"       // crc 14a
 #include "tea.h"
-#include "../include/legic_prng.h"
+#include "legic_prng.h"
 #include "loclass/elite_crack.h"
 
 int usage_analyse_lcr(void);
 int usage_analyse_checksum(void);
 int usage_analyse_crc(void);
 int usage_analyse_hid(void);
+int usage_analyse_nuid(void);
 
 int CmdAnalyse(const char *Cmd);
 int CmdAnalyseLCR(const char *Cmd);
@@ -36,4 +38,5 @@ int CmdAnalyseCRC(const char *Cmd);
 int CmdAnalyseTEASelfTest(const char *Cmd);
 int CmdAnalyseLfsr(const char *Cmd);
 int CmdAnalyseHid(const char *Cmd);
+int CmdAnalyseNuid(const char *Cmd);
 #endif
index a6def1a91be2df84675660c67ec636ecc3ba4b55..d07a2871a06a7bc807958406d37fad94f49d6bd1 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "iso14443crc.h"
 
-static unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc)
+unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc)
 {
     ch = (ch ^ (unsigned char) ((*lpwCrc) & 0x00FF));
     ch = (ch ^ (ch << 4));
index 4b1fb7e84eb0fb721c5bfd5ecc844c53e1deb583..9373d951af1a63f028c18526926eff1041f9132e 100644 (file)
@@ -18,6 +18,7 @@
 #define        CRC_14443_B     0xFFFF  /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
 #define CRC_ICLASS     0xE012  /* ICLASS PREFIX */
 
+unsigned short UpdateCrc14443(unsigned char ch, unsigned short *lpwCrc);
 void ComputeCrc14443(int CrcType,
                      const unsigned char *Data, int Length,
                      unsigned char *TransmitFirst,
Impressum, Datenschutz