]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge branch 'master' of https://github.com/iceman1001/proxmark3
authoriceman1001 <iceman@iuse.se>
Sat, 9 Jan 2016 16:20:58 +0000 (17:20 +0100)
committericeman1001 <iceman@iuse.se>
Sat, 9 Jan 2016 16:20:58 +0000 (17:20 +0100)
.travis.yml
armsrc/hitag2.c
armsrc/iclass.c
armsrc/util.c
client/cmdhfmfu.c
client/cmdhfmfu.h
client/cmdlf.c
client/cmdlfhid.c
client/util.h

index 6bbc62fcee65637a222301b303f54aae3b5248ae..bb260aacbc88eb1561fecad030b495cd2b261c7b 100644 (file)
@@ -12,4 +12,4 @@ before_script:
   - sudo apt-get install -y gcc-arm-none-eabi
 
   #make command
-script: make clean && make all UBUNTU_1404_QT4=1
\ No newline at end of file
+script: "make clean && make all UBUNTU_1404_QT4=1"
\ No newline at end of file
index 12bea2e507e209cf80850af1bc830c2ddf48221a..d1005f3c86baad1a099d57e2ff1cf5ec5d594eb3 100644 (file)
@@ -94,7 +94,6 @@ static uint64_t cipher_state;
 #define rotl64(x, n)   ((((u64)(x))<<((n)&63))+(((u64)(x))>>((0-(n))&63)))
 
 // Single bit Hitag2 functions:
-
 #define i4(x,a,b,c,d)  ((u32)((((x)>>(a))&1)+(((x)>>(b))&1)*2+(((x)>>(c))&1)*4+(((x)>>(d))&1)*8))
 
 static const u32 ht2_f4a = 0x2C79;             // 0010 1100 0111 1001
@@ -103,7 +102,7 @@ static const u32 ht2_f5c = 0x7907287B;      // 0111 1001 0000 0111 0010 1000 0111 101
 
 static u32 _f20 (const u64 x)
 {
-       u32                                     i5;
+       u32     i5;
 
        i5 = ((ht2_f4a >> i4 (x, 1, 2, 4, 5)) & 1)* 1
           + ((ht2_f4b >> i4 (x, 7,11,13,14)) & 1)* 2
@@ -116,8 +115,8 @@ static u32 _f20 (const u64 x)
 
 static u64 _hitag2_init (const u64 key, const u32 serial, const u32 IV)
 {
-       u32                                     i;
-       u64                                     x = ((key & 0xFFFF) << 32) + serial;
+       u32     i;
+       u64     x = ((key & 0xFFFF) << 32) + serial;
 
        for (i = 0; i < 32; i++)
        {
@@ -129,7 +128,7 @@ static u64 _hitag2_init (const u64 key, const u32 serial, const u32 IV)
 
 static u64 _hitag2_round (u64 *state)
 {
-       u64                                     x = *state;
+       u64 x = *state;
 
        x = (x >>  1) +
         ((((x >>  0) ^ (x >>  2) ^ (x >>  3) ^ (x >>  6)
@@ -153,7 +152,7 @@ static u64 _hitag2_round (u64 *state)
 
 static u32 _hitag2_byte (u64 * x)
 {
-       u32                                     i, c;
+       u32     i, c;
 
        for (i = 0, c = 0; i < 8; i++) c += (u32) _hitag2_round (x) << (i^7);
        return c;
index 38ccf5a444c9b1e2d56a6af4fbea4067f2da3819..2dff8a4e7246d4cef8cee4c0ee589ae50c1abd11 100644 (file)
@@ -426,10 +426,11 @@ static RAMFUNC int ManchesterDecoding(int v)
                                        Demod.state = DEMOD_UNSYNCD;
                                        error = 0x88;
                                }
-
+                               
+                               // TODO: use this error value to print?  Ask Holiman.
+                               // 2016-01-08 iceman
                        }
                        error = 0;
-
                }
        }
        else {
index 3d536f396d6205c5d450a88f3cbed62030049b1b..4fffb60e24b089d8c556a919c702cdeef7662c77 100644 (file)
@@ -74,6 +74,7 @@ void rol(uint8_t *data, const size_t len){
     }
     data[len-1] = first;
 }
+
 void lsl (uint8_t *data, size_t len) {
     for (size_t n = 0; n < len - 1; n++) {
         data[n] = (data[n] << 1) | (data[n+1] >> 7);
@@ -421,7 +422,6 @@ void StartCountSspClk()
        while (AT91C_BASE_TC0->TC_CV < 0xFFF0);
 }
 
-
 uint32_t RAMFUNC GetCountSspClk(){
        uint32_t tmp_count;
        tmp_count = (AT91C_BASE_TC2->TC_CV << 16) | AT91C_BASE_TC0->TC_CV;
index 7aa16b89eb86f2bedb49c8477d9d541c61ab9503..7567efb8be8760de4043fe186195ecea02cf930f 100644 (file)
@@ -100,6 +100,25 @@ uint32_t ul_ev1_pwdgenB(uint8_t* uid) {
        return (uint32_t)bytes_to_num(pwd, 4);
 }
 
+// Certain pwd generation algo nickname C.
+uint32_t ul_ev1_pwdgenC(uint8_t* uid){
+       uint32_t pwd = 0;
+       uint8_t base[] = {
+               0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28,
+               0x63, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72,
+               0x69, 0x67, 0x68, 0x74, 0x20, 0x4c, 0x45, 0x47,
+               0x4f, 0x20, 0x32, 0x30, 0x31, 0x34, 0xaa, 0xaa
+       };
+
+       memcpy(base, uid, 7);
+
+       for (int i = 0; i < 32; i += 4) {
+               uint32_t b = *(uint32_t *)(base + i);
+               pwd = b + ROTR(pwd, 25) + ROTR(pwd, 10) - pwd;
+       }
+       return BSWAP_32(pwd);
+}
+
 void ul_ev1_pwdgen_selftest(){
        
        uint8_t uid1[] = {0x04,0x11,0x12,0x11,0x12,0x11,0x10};
@@ -109,6 +128,10 @@ void ul_ev1_pwdgen_selftest(){
        uint8_t uid2[] = {0x04,0x1f,0x98,0xea,0x1e,0x3e,0x81};          
        uint32_t pwd2 = ul_ev1_pwdgenB(uid2);
        PrintAndLog("UID | %s | %08X | %s", sprint_hex(uid2,7), pwd2, (pwd2 == 0x5fd37eca)?"OK":"->5fd37eca<--");
+
+       uint8_t uid3[] = {0x04,0x62, 0xB6, 0x8A, 0xB4, 0x42, 0x80};
+       uint32_t pwd3 = ul_ev1_pwdgenC(uid3);
+       PrintAndLog("UID | %s | %08X | %s", sprint_hex(uid3,7), pwd3, (pwd3 == 0x5a349515)?"OK":"->5a349515<--");
        return;
 }
 
@@ -915,6 +938,14 @@ int CmdHF14AMfUInfo(const char *Cmd){
                                PrintAndLog("Found a default password: %s || Pack: %02X %02X",sprint_hex(key, 4), pack[0], pack[1]);
                        }
                        if (!ul_auth_select( &card, tagtype, hasAuthKey, authkeyptr, pack, sizeof(pack))) return -1;
+
+                       // test pwd gen C
+                       num_to_bytes( ul_ev1_pwdgenC(card.uid), 4, key);
+                       len = ulev1_requestAuthentication(key, pack, sizeof(pack));
+                       if (len >= 1) {
+                               PrintAndLog("Found a default password: %s || Pack: %02X %02X",sprint_hex(key, 4), pack[0], pack[1]);
+                       }
+                       if (!ul_auth_select( &card, tagtype, hasAuthKey, authkeyptr, pack, sizeof(pack))) return -1;                    
                        
                        for (uint8_t i = 0; i < KEYS_PWD_COUNT; ++i ) {
                                key = default_pwd_pack[i];
@@ -1876,7 +1907,6 @@ int CmdHF14AMfucSetUid(const char *Cmd){
 int CmdHF14AMfuGenDiverseKeys(const char *Cmd){
 
        uint8_t uid[4]; 
-       
        char cmdp = param_getchar(Cmd, 0);
        if (strlen(Cmd) == 0  || cmdp == 'h' || cmdp == 'H') return usage_hf_mfu_gendiverse();
 
index 621d5c0b4e31d2a4a4866a9f0e5d3de858644294..36240c2e7b64ae1172dce806ca187fa24a4d5d1c 100644 (file)
@@ -32,11 +32,13 @@ int usage_hf_mfu_sim(void);
 int usage_hf_mfu_ucauth(void);
 int usage_hf_mfu_ucsetpwd(void);
 int usage_hf_mfu_ucsetuid(void);
-int  usage_hf_mfu_gendiverse(void);
+int usage_hf_mfu_gendiverse(void);
 
 int CmdHFMFUltra(const char *Cmd);
 
 uint32_t ul_ev1_pwdgenA(uint8_t* uid);
+uint32_t ul_ev1_pwdgenA(uint8_t* uid);
+uint32_t ul_ev1_pwdgenC(uint8_t* uid);
 
 typedef enum TAGTYPE_UL {
        UNKNOWN       = 0x000000,
index 3f89e6efddb030e2ab7cb36afd96a7772dff7b4f..20c13958e3b62dde2c780e4bbac04fc5068ecd8c 100644 (file)
@@ -89,43 +89,43 @@ int usage_lf_config(void) {
        return 0;
 }
 int usage_lf_simfsk(void) {
-  PrintAndLog("Usage: lf simfsk [c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>]");
-  PrintAndLog("Options:        ");
-  PrintAndLog("       h              This help");
-  PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
-  PrintAndLog("       i              invert data");
-  PrintAndLog("       H <fcHigh>     Manually set the larger Field Clock");
-  PrintAndLog("       L <fcLow>      Manually set the smaller Field Clock");
-  //PrintAndLog("       s              TBD- -to enable a gap between playback repetitions - default: no gap");
-  PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
-  PrintAndLog("\n  NOTE: if you set one clock manually set them all manually");
-  return 0;
+       PrintAndLog("Usage: lf simfsk [c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>]");
+       PrintAndLog("Options:        ");
+       PrintAndLog("       h              This help");
+       PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
+       PrintAndLog("       i              invert data");
+       PrintAndLog("       H <fcHigh>     Manually set the larger Field Clock");
+       PrintAndLog("       L <fcLow>      Manually set the smaller Field Clock");
+       //PrintAndLog("       s              TBD- -to enable a gap between playback repetitions - default: no gap");
+       PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
+       PrintAndLog("\n  NOTE: if you set one clock manually set them all manually");
+       return 0;
 }
 int usage_lf_simask(void) {
-  PrintAndLog("Usage: lf simask [c <clock>] [i] [b|m|r] [s] [d <raw hex to sim>]");
-  PrintAndLog("Options:        ");
-  PrintAndLog("       h              This help");
-  PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
-  PrintAndLog("       i              invert data");
-  PrintAndLog("       b              sim ask/biphase");
-  PrintAndLog("       m              sim ask/manchester - Default");
-  PrintAndLog("       r              sim ask/raw");
-  PrintAndLog("       s              TBD- -to enable a gap between playback repetitions - default: no gap");
-  PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
-  return 0;
+       PrintAndLog("Usage: lf simask [c <clock>] [i] [b|m|r] [s] [d <raw hex to sim>]");
+       PrintAndLog("Options:        ");
+       PrintAndLog("       h              This help");
+       PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
+       PrintAndLog("       i              invert data");
+       PrintAndLog("       b              sim ask/biphase");
+       PrintAndLog("       m              sim ask/manchester - Default");
+       PrintAndLog("       r              sim ask/raw");
+       PrintAndLog("       s              TBD- -to enable a gap between playback repetitions - default: no gap");
+       PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
+       return 0;
 }
 int usage_lf_simpsk(void) {
-  PrintAndLog("Usage: lf simpsk [1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>]");
-  PrintAndLog("Options:        ");
-  PrintAndLog("       h              This help");
-  PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
-  PrintAndLog("       i              invert data");
-  PrintAndLog("       1              set PSK1 (default)");
-  PrintAndLog("       2              set PSK2");
-  PrintAndLog("       3              set PSK3");
-  PrintAndLog("       r <carrier>    2|4|8 are valid carriers: default = 2");
-  PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
-  return 0;
+       PrintAndLog("Usage: lf simpsk [1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>]");
+       PrintAndLog("Options:        ");
+       PrintAndLog("       h              This help");
+       PrintAndLog("       c <clock>      Manually set clock - can autodetect if using DemodBuffer");
+       PrintAndLog("       i              invert data");
+       PrintAndLog("       1              set PSK1 (default)");
+       PrintAndLog("       2              set PSK2");
+       PrintAndLog("       3              set PSK3");
+       PrintAndLog("       r <carrier>    2|4|8 are valid carriers: default = 2");
+       PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
+       return 0;
 }
 int usage_lf_find(void){
     PrintAndLog("Usage:  lf search <0|1> [u]");
@@ -511,16 +511,15 @@ int CmdIndalaClone(const char *Cmd)
 
 int CmdLFSetConfig(const char *Cmd)
 {
-
        uint8_t divisor =  0;//Frequency divisor
        uint8_t bps = 0; // Bits per sample
        uint8_t decimation = 0; //How many to keep
        bool averaging = 1; // Defaults to true
        bool errors = FALSE;
-       int trigger_threshold =-1;//Means no change
+       int trigger_threshold = -1;//Means no change
        uint8_t unsigned_trigg = 0;
 
-       uint8_t cmdp =0;
+       uint8_t cmdp = 0;
        while(param_getchar(Cmd, cmdp) != 0x00)
        {
                switch(param_getchar(Cmd, cmdp))
@@ -563,22 +562,18 @@ int CmdLFSetConfig(const char *Cmd)
                }
                if(errors) break;
        }
-       if(cmdp == 0)
-       {
-               errors = 1;// No args
-       }
+
+       // No args
+       if (cmdp == 0) errors = 1;
 
        //Validations
-       if(errors)
-       {
-               return usage_lf_config();
-       }
+       if (errors) return usage_lf_config();
+       
        //Bps is limited to 8, so fits in lower half of arg1
-       if(bps >> 8) bps = 8;
+       if (bps >> 4) bps = 8;
+
+       sample_config config = { decimation, bps, averaging, divisor, trigger_threshold };
 
-       sample_config config = {
-               decimation,bps,averaging,divisor,trigger_threshold
-       };
        //Averaging is a flag on high-bit of arg[1]
        UsbCommand c = {CMD_SET_LF_SAMPLING_CONFIG};
        memcpy(c.d.asBytes,&config,sizeof(sample_config));
index 61084c0b9da5aa4634ec84151e6f8361c4b30604..b9d4b75e9067b78fa4af8f08a5985ac8de6c389a 100644 (file)
@@ -30,7 +30,7 @@ int usage_hid_wiegand(){
        PrintAndLog("       facilitynum - Facility number");
        PrintAndLog("       cardnum             - Card number");
        PrintAndLog("Examples:");
-       PrintAndLog("      lf hid wiegand 26 0 304 2001");
+       PrintAndLog("      lf hid wiegand 26 0 101 2001");
        return 0;
 }
 
@@ -230,8 +230,8 @@ static void calc37H(uint64_t cn, uint32_t *hi, uint32_t *lo){
 }
 static void calc40(uint64_t cn, uint32_t *hi, uint32_t *lo){
        cn = (cn & 0xFFFFFFFFFF);
-       *lo = (uint32_t)((cn & 0xFFFFFFFF) << 1 ); 
-       *hi = (uint32_t) (cn >> 31);  
+       *lo = ((cn & 0xFFFFFFFF) << 1 ); 
+       *hi = (cn >> 31);  
 }
 
 int CmdHIDWiegand(const char *Cmd)
@@ -284,13 +284,12 @@ int CmdHIDWiegand(const char *Cmd)
                }
                case 40 : {
                        calc40(cn, &hi, &lo);
-                       PrintAndLog("%x  %x", hi, lo);
                        break;
                }
                case 44 : { break; }
                case 84 : { break; }
        }
-       PrintAndLog("HID %d bit | FC: %d CN: %d | Wiegand Code: %08X%08X", fmtlen, fc, cn, hi, lo);
+       PrintAndLog("HID %d bit | FC: %d CN: %lld | Wiegand Code: %08X%08X", fmtlen, fc, cn, hi, lo);
        return 0;
 }
 
index 12f1592974b05b981307053dc196803be4e643f7..39ed51b4c9a4f53dd012804d3bd091c205503015 100644 (file)
 #ifndef MAX
 # define MAX(a, b) (((a) > (b)) ? (a) : (b))
 #endif
+#ifndef BSWAP_32
+#define BSWAP_32(x) \
+     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
+      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
+#endif
 #define TRUE                        1
 #define FALSE                       0
 #define EVEN                        0
@@ -40,9 +45,9 @@ void AddLogCurrentDT(char *fileName);
 void FillFileNameByUID(char *fileName, uint8_t * uid, char *ext, int byteCount);
 
 void print_hex(const uint8_t * data, const size_t len);
-char * sprint_hex(const uint8_t * data, const size_t len);
-char * sprint_bin(const uint8_t * data, const size_t len);
-char * sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks);
+char *sprint_hex(const uint8_t * data, const size_t len);
+char *sprint_bin(const uint8_t * data, const size_t len);
+char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks);
 char *sprint_hex_ascii(const uint8_t *data, const size_t len);
 
 void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
Impressum, Datenschutz