mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-30 11:38:38 -07: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[])
|
int bruteforceFile(const char *filename, uint16_t keytable[])
|
||||||
{
|
{
|
||||||
|
|
||||||
FILE *f = fopen(filename, "rb");
|
FILE *f = fopen(filename, "rb");
|
||||||
if(!f) {
|
if(!f) {
|
||||||
prnlog("Failed to read from file '%s'", filename);
|
prnlog("Failed to read from file '%s'", filename);
|
||||||
|
|
|
@ -725,7 +725,6 @@ int doTestsWithKnownInputs()
|
||||||
|
|
||||||
int readKeyFile(uint8_t key[8])
|
int readKeyFile(uint8_t key[8])
|
||||||
{
|
{
|
||||||
|
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int retval = 1;
|
int retval = 1;
|
||||||
f = fopen("iclass_key.bin", "rb");
|
f = fopen("iclass_key.bin", "rb");
|
||||||
|
@ -738,7 +737,6 @@ int readKeyFile(uint8_t key[8])
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
135
client/util.c
135
client/util.c
|
@ -13,6 +13,7 @@
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
int ukbhit(void)
|
int ukbhit(void)
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
@ -112,6 +113,19 @@ char * sprint_hex(const uint8_t * data, const size_t len) {
|
||||||
return buf;
|
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)
|
void num_to_bytes(uint64_t n, size_t len, uint8_t* dest)
|
||||||
{
|
{
|
||||||
while (len--) {
|
while (len--) {
|
||||||
|
@ -131,6 +145,28 @@ uint64_t bytes_to_num(uint8_t* src, size_t len)
|
||||||
return num;
|
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
|
// string parameters lib
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
@ -248,3 +284,102 @@ int param_getstr(const char *line, int paramnum, char * str)
|
||||||
|
|
||||||
return en - bg + 1;
|
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 <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include "data.h"
|
||||||
|
|
||||||
#ifndef MIN
|
#ifndef MIN
|
||||||
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
# define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
@ -22,6 +23,10 @@
|
||||||
#ifndef MAX
|
#ifndef MAX
|
||||||
# define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
# define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
#define EVEN 0
|
||||||
|
#define ODD 1
|
||||||
|
|
||||||
int ukbhit(void);
|
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);
|
void print_hex(const uint8_t * data, const size_t len);
|
||||||
char * sprint_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);
|
void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
|
||||||
uint64_t bytes_to_num(uint8_t* src, size_t len);
|
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);
|
char param_getchar(const char *line, int paramnum);
|
||||||
uint8_t param_get8(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_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt);
|
||||||
int param_getstr(const char *line, int paramnum, char * str);
|
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
Add a link
Reference in a new issue