]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
ADD: a new pwdgen algo Nicknamed C, (Huge props to @Bettse for everything) also...
authoriceman1001 <iceman@iuse.se>
Sat, 9 Jan 2016 16:17:36 +0000 (17:17 +0100)
committericeman1001 <iceman@iuse.se>
Sat, 9 Jan 2016 16:17:36 +0000 (17:17 +0100)
ADD:   BSWAP_32 macro, for changing endianness.

armsrc/util.c
client/cmdhfmfu.c
client/cmdhfmfu.h
client/util.h

index 3d536f396d6205c5d450a88f3cbed62030049b1b..4fffb60e24b089d8c556a919c702cdeef7662c77 100644 (file)
@@ -74,6 +74,7 @@ void rol(uint8_t *data, const size_t len){
     }
     data[len-1] = first;
 }
     }
     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);
 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);
 }
 
        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;
 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);
 }
 
        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};
 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 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;
 }
 
        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;
                                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];
                        
                        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]; 
 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();
 
        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_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);
 
 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,
 
 typedef enum TAGTYPE_UL {
        UNKNOWN       = 0x000000,
index 12f1592974b05b981307053dc196803be4e643f7..39ed51b4c9a4f53dd012804d3bd091c205503015 100644 (file)
 #ifndef MAX
 # define MAX(a, b) (((a) > (b)) ? (a) : (b))
 #endif
 #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
 #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);
 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);
 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