mirror of
				https://github.com/Proxmark/proxmark3.git
				synced 2025-10-26 22:16:24 +08:00 
			
		
		
		
	CHG: minor code clean up
ADD: added some helper-functions in util.c
This commit is contained in:
		
							parent
							
								
									3af373f352
								
							
						
					
					
						commit
						79544b28ad
					
				
					 4 changed files with 149 additions and 3 deletions
				
			
		|  | @ -514,7 +514,6 @@ int bruteforceDump(uint8_t dump[], size_t dumpsize, uint16_t keytable[]) | |||
|  */ | ||||
| int bruteforceFile(const char *filename, uint16_t keytable[]) | ||||
| { | ||||
| 
 | ||||
| 	FILE *f = fopen(filename, "rb"); | ||||
| 	if(!f) { | ||||
| 		prnlog("Failed to read from file '%s'", filename); | ||||
|  |  | |||
|  | @ -725,7 +725,6 @@ int doTestsWithKnownInputs() | |||
| 
 | ||||
| int readKeyFile(uint8_t key[8]) | ||||
| { | ||||
| 
 | ||||
| 	FILE *f; | ||||
| 	int retval = 1; | ||||
| 	f = fopen("iclass_key.bin", "rb"); | ||||
|  | @ -738,7 +737,6 @@ int readKeyFile(uint8_t key[8]) | |||
| 		fclose(f); | ||||
| 	} | ||||
| 	return retval; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										135
									
								
								client/util.c
									
										
									
									
									
								
							
							
						
						
									
										135
									
								
								client/util.c
									
										
									
									
									
								
							|  | @ -13,6 +13,7 @@ | |||
| #ifndef _WIN32 | ||||
| #include <termios.h> | ||||
| #include <sys/ioctl.h>  | ||||
| 
 | ||||
| int ukbhit(void) | ||||
| { | ||||
|   int cnt = 0; | ||||
|  | @ -112,6 +113,19 @@ char * sprint_hex(const uint8_t * data, const size_t len) { | |||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| char * sprint_bin(const uint8_t * data, const size_t len) { | ||||
| 	 | ||||
| 	int maxLen = ( len > 1024) ? 1024 : len; | ||||
| 	static char buf[1024]; | ||||
| 	char * tmp = buf; | ||||
| 	size_t i; | ||||
| 
 | ||||
| 	for (i=0; i < maxLen; ++i, ++tmp) | ||||
| 		sprintf(tmp, "%u", data[i]); | ||||
| 
 | ||||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| void num_to_bytes(uint64_t n, size_t len, uint8_t* dest) | ||||
| { | ||||
| 	while (len--) { | ||||
|  | @ -131,6 +145,28 @@ uint64_t bytes_to_num(uint8_t* src, size_t len) | |||
| 	return num; | ||||
| } | ||||
| 
 | ||||
| //assumes little endian
 | ||||
| char * printBits(size_t const size, void const * const ptr) | ||||
| { | ||||
|     unsigned char *b = (unsigned char*) ptr;	 | ||||
|     unsigned char byte; | ||||
| 	static char buf[1024]; | ||||
| 	char * tmp = buf; | ||||
|     int i, j; | ||||
| 
 | ||||
|     for (i=size-1;i>=0;i--) | ||||
|     { | ||||
|         for (j=7;j>=0;j--) | ||||
|         { | ||||
|             byte = b[i] & (1<<j); | ||||
|             byte >>= j; | ||||
|             sprintf(tmp, "%u", byte); | ||||
| 			tmp++; | ||||
|         } | ||||
|     } | ||||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| //  -------------------------------------------------------------------------
 | ||||
| //  string parameters lib
 | ||||
| //  -------------------------------------------------------------------------
 | ||||
|  | @ -248,3 +284,102 @@ int param_getstr(const char *line, int paramnum, char * str) | |||
| 	 | ||||
| 	return en - bg + 1; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| The following methods comes from Rfidler sourcecode. | ||||
| https://github.com/ApertureLabsLtd/RFIDler/blob/master/firmware/Pic32/RFIDler.X/src/
 | ||||
| */ | ||||
| 
 | ||||
| // convert hex to sequence of 0/1 bit values
 | ||||
| // returns number of bits converted
 | ||||
| int hextobinarray(char *target, char *source) | ||||
| { | ||||
|     int length, i, count= 0; | ||||
|     char x; | ||||
| 
 | ||||
|     length = strlen(source); | ||||
|     // process 4 bits (1 hex digit) at a time
 | ||||
|     while(length--) | ||||
|     { | ||||
|         x= *(source++); | ||||
|         // capitalize
 | ||||
|         if (x >= 'a' && x <= 'f') | ||||
|             x -= 32; | ||||
|         // convert to numeric value
 | ||||
|         if (x >= '0' && x <= '9') | ||||
|             x -= '0'; | ||||
|         else if (x >= 'A' && x <= 'F') | ||||
|             x -= 'A' - 10; | ||||
|         else | ||||
|             return 0; | ||||
|         // output
 | ||||
|         for(i= 0 ; i < 4 ; ++i, ++count) | ||||
|             *(target++)= (x >> (3 - i)) & 1; | ||||
|     } | ||||
|      | ||||
|     return count; | ||||
| } | ||||
| 
 | ||||
| // convert hex to human readable binary string
 | ||||
| int hextobinstring(char *target, char *source) | ||||
| { | ||||
|     int length; | ||||
| 
 | ||||
|     if(!(length= hextobinarray(target, source))) | ||||
|         return 0; | ||||
|     binarraytobinstring(target, target, length); | ||||
|     return length; | ||||
| } | ||||
| 
 | ||||
| // convert binary array of 0x00/0x01 values to hex (safe to do in place as target will always be shorter than source)
 | ||||
| // return number of bits converted
 | ||||
| int binarraytohex(char *target, char *source, int length) | ||||
| { | ||||
|     unsigned char i, x; | ||||
|     int j = length; | ||||
| 
 | ||||
|     if(j % 4) | ||||
|         return 0; | ||||
| 
 | ||||
|     while(j) | ||||
|     { | ||||
|         for(i= x= 0 ; i < 4 ; ++i) | ||||
|             x +=  ( source[i] << (3 - i)); | ||||
|         sprintf(target,"%X", x); | ||||
|         ++target; | ||||
|         source += 4; | ||||
|         j -= 4; | ||||
|     } | ||||
|     return length; | ||||
| } | ||||
| 
 | ||||
| // convert binary array to human readable binary
 | ||||
| void binarraytobinstring(char *target, char *source,  int length) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     for(i= 0 ; i < length ; ++i) | ||||
|         *(target++)= *(source++) + '0'; | ||||
|     *target= '\0'; | ||||
| } | ||||
| 
 | ||||
| // return parity bit required to match type
 | ||||
| uint8_t GetParity( char *bits, uint8_t type, int length) | ||||
| { | ||||
|     int x; | ||||
| 
 | ||||
|     for(x= 0 ; length > 0 ; --length) | ||||
|         x += bits[length - 1]; | ||||
|     x %= 2; | ||||
| 
 | ||||
|     return x ^ type; | ||||
| } | ||||
| 
 | ||||
| // add HID parity to binary array: EVEN prefix for 1st half of ID, ODD suffix for 2nd half
 | ||||
| void wiegand_add_parity(char *target, char *source, char length) | ||||
| { | ||||
|     *(target++)= GetParity(source, EVEN, length / 2); | ||||
|     memcpy(target, source, length); | ||||
|     target += length; | ||||
|     *(target)= GetParity(source + length / 2, ODD, length / 2); | ||||
| } | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ | |||
| #include <string.h> | ||||
| #include <ctype.h> | ||||
| #include <time.h> | ||||
| #include "data.h" | ||||
| 
 | ||||
| #ifndef MIN | ||||
| # define MIN(a, b) (((a) < (b)) ? (a) : (b)) | ||||
|  | @ -22,6 +23,10 @@ | |||
| #ifndef MAX | ||||
| # define MAX(a, b) (((a) > (b)) ? (a) : (b)) | ||||
| #endif | ||||
| #define TRUE                        1 | ||||
| #define FALSE                       0 | ||||
| #define EVEN                        0 | ||||
| #define ODD                         1 | ||||
| 
 | ||||
| int ukbhit(void); | ||||
| 
 | ||||
|  | @ -33,9 +38,11 @@ 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); | ||||
| 
 | ||||
| void num_to_bytes(uint64_t n, size_t len, uint8_t* dest); | ||||
| uint64_t bytes_to_num(uint8_t* src, size_t len); | ||||
| char * printBits(size_t const size, void const * const ptr); | ||||
| 
 | ||||
| char param_getchar(const char *line, int paramnum); | ||||
| uint8_t param_get8(const char *line, int paramnum); | ||||
|  | @ -45,3 +52,10 @@ uint64_t param_get64ex(const char *line, int paramnum, int deflt, int base); | |||
| int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt); | ||||
| int param_getstr(const char *line, int paramnum, char * str); | ||||
| 
 | ||||
|  int hextobinarray( char *target,  char *source); | ||||
|  int hextobinstring( char *target,  char *source); | ||||
|  int binarraytohex( char *target,  char *source,  int length); | ||||
| void binarraytobinstring(char *target,  char *source,  int length); | ||||
| uint8_t GetParity( char *string, uint8_t type,  int length); | ||||
| void wiegand_add_parity(char *target, char *source, char length); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue