int error;
static struct termios Otty, Ntty;
- tcgetattr( 0, &Otty);
+ if ( tcgetattr( 0, &Otty) == -1) return -1;
Ntty = Otty;
- Ntty.c_iflag = 0; /* input mode */
- Ntty.c_oflag = 0; /* output mode */
- Ntty.c_lflag &= ~ICANON; /* raw mode */
- Ntty.c_cc[VMIN] = CMIN; /* minimum time to wait */
- Ntty.c_cc[VTIME] = CTIME; /* minimum characters to wait for */
+ Ntty.c_iflag = 0; /* input mode */
+ Ntty.c_oflag = 0; /* output mode */
+ Ntty.c_lflag &= ~ICANON; /* raw mode */
+ Ntty.c_cc[VMIN] = CMIN; /* minimum time to wait */
+ Ntty.c_cc[VTIME] = CTIME; /* minimum characters to wait for */
if (0 == (error = tcsetattr(0, TCSANOW, &Ntty))) {
error += ioctl(0, FIONREAD, &cnt);
}
// printing and converting functions
-
-void print_hex(const uint8_t * data, const size_t len)
-{
+void print_hex(const uint8_t * data, const size_t len) {
size_t i;
-
- for (i=0; i < len; i++)
+ for (i=0; i < len; ++i)
printf("%02x ", data[i]);
+ printf("\n");
+}
+void print_hex_break(const uint8_t *data, const size_t len, uint8_t breaks) {
+
+ int rownum = 0;
+ printf("[%02d] | ", rownum);
+ for (int i = 0; i < len; ++i) {
+ printf("%02X ", data[i]);
+
+ // check if a line break is needed
+ if ( breaks > 0 && !((i+1) % breaks) && (i+1 < len) ) {
+ ++rownum;
+ printf("\n[%02d] | ", rownum);
+ }
+ }
printf("\n");
}
size_t in_index = 0;
// loop through the out_index to make sure we don't go too far
- for (size_t out_index=0; out_index < max_len; out_index++) {
+ for (size_t out_index=0; out_index < max_len-2; out_index++) {
// set character
- sprintf(tmp++, "%u", data[in_index]);
+ sprintf(tmp++, "%u", (unsigned int) data[in_index]);
// check if a line break is needed and we have room to print it in our array
if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
// increment and print line break
char *sprint_hex_ascii(const uint8_t *data, const size_t len) {
static char buf[1024];
- memset(buf, 0x00, 1024);
char *tmp = buf;
- sprintf(tmp, "%s| %s", sprint_hex(data, len) , data);
+ memset(buf, 0x00, 1024);
+ size_t max_len = (len > 1010) ? 1010 : len;
+ sprintf(tmp, "%s| %s", sprint_hex(data, max_len) , data);
return buf;
}
void num_to_bytes(uint64_t n, size_t len, uint8_t* dest)
uint8_t GetParity( uint8_t *bits, uint8_t type, int length)
{
int x;
-
- for(x= 0 ; length > 0 ; --length)
+ for( x = 0 ; length > 0 ; --length)
x += bits[length - 1];
x %= 2;
-
return x ^ type;
}
return tmp;
}
-// RotateLeft - Ultralight, Desfire
-void rol(uint8_t *data, const size_t len){
+// RotateLeft - Ultralight, Desfire, works on byte level
+// 00-01-02 >> 01-02-00
+void rol(uint8_t *data, const size_t len){
uint8_t first = data[0];
for (size_t i = 0; i < len-1; i++) {
data[i] = data[i+1];
}
data[len-1] = first;
+}
+
+uint32_t SwapBits(uint32_t value, int nrbits) {
+ uint32_t newvalue = 0;
+ for(int i = 0; i < nrbits; i++) {
+ newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
+ }
+ return newvalue;
}
\ No newline at end of file