Add urh
This commit is contained in:
Binary file not shown.
@ -0,0 +1,54 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, len = strlen(argv[2]);
|
||||
|
||||
if (argc>2)
|
||||
{
|
||||
if (argv[1][0]=='d')
|
||||
for(i = 0; i < len; i++)
|
||||
switch(i % 12)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 8:
|
||||
case 9:
|
||||
putchar(argv[2][i]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else
|
||||
for(i = 0; i < len; i++)
|
||||
switch(i % 8)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 3:
|
||||
case 4:
|
||||
case 6:
|
||||
putchar(argv[2][i]);
|
||||
break;
|
||||
case 2:
|
||||
case 5:
|
||||
putchar(argv[2][i]);
|
||||
if(argv[2][i] == '0') putchar('1');
|
||||
else putchar('0');
|
||||
break;
|
||||
case 7:
|
||||
putchar(argv[2][i]);
|
||||
if(i < len - 1)
|
||||
printf("01");
|
||||
}
|
||||
|
||||
}
|
||||
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
|
||||
|
||||
return 0;
|
||||
}
|
BIN
Software/Universal Radio Hacker/data/decodings/homematic
Normal file
BIN
Software/Universal Radio Hacker/data/decodings/homematic
Normal file
Binary file not shown.
102
Software/Universal Radio Hacker/data/decodings/homematic.c
Normal file
102
Software/Universal Radio Hacker/data/decodings/homematic.c
Normal file
@ -0,0 +1,102 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
byte str2byte(char str[8])
|
||||
{
|
||||
int ret = 0, i;
|
||||
for(i = 0; i < 8; i++)
|
||||
if (str[i]=='1') ret |= (1<<(7-i));
|
||||
return ret;
|
||||
}
|
||||
|
||||
void print_binary(byte inpt)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 8; i++)
|
||||
if (inpt & (1<<(7-i))) putchar('1');
|
||||
else putchar('0');
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, max, offset;
|
||||
byte dec[256]={0}, enc[256]={0};
|
||||
char string[2048]={0};
|
||||
|
||||
offset = 8; // Preamble + Sync
|
||||
|
||||
if (argc>2)
|
||||
{
|
||||
if (argv[1][0]=='d')
|
||||
{
|
||||
if (strlen(argv[2]) > 256*8 || strlen(argv[2]) < 4) return -1;
|
||||
memcpy(string, argv[2], strlen(argv[2]));
|
||||
|
||||
for (i = 0; i < strlen(string)-3; i+=8)
|
||||
enc[i/8] = str2byte(&string[i]);
|
||||
max = i/8;
|
||||
memcpy(&dec, &enc, 256);
|
||||
|
||||
/*
|
||||
* byte[] Dec = new byte[Enc.Length];
|
||||
* Dec[0] = Enc[0]; //Packet length
|
||||
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
|
||||
* int j;
|
||||
* for (j = 2; j < Dec[0]; j++)
|
||||
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
|
||||
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
|
||||
*/
|
||||
|
||||
dec[offset+0] = enc[offset+0];
|
||||
|
||||
dec[offset+1] = (~enc[offset+1])^0x89;
|
||||
for(i = offset + 2; i < max - 3; i++)
|
||||
dec[i] = (enc[i-1]+0xdc) ^ enc[i];
|
||||
dec[i] = enc[i] ^ dec[offset+2];
|
||||
|
||||
dec[max-1]=0; // Set CRC to 0x0000
|
||||
dec[max-2]=0;
|
||||
|
||||
for(i = 0; i < max; i++)
|
||||
print_binary(dec[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strlen(argv[2]) > 256*8 || strlen(argv[2]) < 4) return -1;
|
||||
memcpy(string, argv[2], strlen(argv[2]));
|
||||
|
||||
for (i = 0; i < strlen(string)-3; i+=8)
|
||||
dec[i/8] = str2byte(&string[i]);
|
||||
max = i/8;
|
||||
memcpy(&enc, &dec, 256);
|
||||
|
||||
/*
|
||||
* byte[] Dec = new byte[Enc.Length];
|
||||
* Dec[0] = Enc[0]; //Packet length
|
||||
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
|
||||
* int j;
|
||||
* for (j = 2; j < Dec[0]; j++)
|
||||
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
|
||||
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
|
||||
*/
|
||||
|
||||
enc[offset+0] = dec[offset+0];
|
||||
|
||||
enc[offset+1] = ~(dec[offset+1]^0x89);
|
||||
for(i = offset + 2; i < max - 3; i++)
|
||||
enc[i] = (enc[i-1]+0xdc) ^ dec[i];
|
||||
enc[i] = dec[i] ^ dec[offset+2];
|
||||
|
||||
enc[max-1]=0; // Set CRC to 0x0000
|
||||
enc[max-2]=0;
|
||||
|
||||
for(i = 0; i < max; i++)
|
||||
print_binary(enc[i]);
|
||||
}
|
||||
}
|
||||
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
|
||||
|
||||
return 0;
|
||||
}
|
Binary file not shown.
@ -0,0 +1,239 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define SHORTEN_PREAMBLE_TO_32 0
|
||||
|
||||
typedef unsigned char byte;
|
||||
typedef unsigned short uint16;
|
||||
|
||||
uint16 crc(byte *data, int len)
|
||||
{
|
||||
byte i, x, crcdata;
|
||||
uint16 crcReg = 0xFFFF;
|
||||
for (x = 0; x < len; x++)
|
||||
{
|
||||
crcdata = data[x];
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (((crcReg & 0x8000) >> 8) ^ (crcdata & 0x80))
|
||||
crcReg = (crcReg << 1) ^ 0x8005;
|
||||
else
|
||||
crcReg = (crcReg << 1);
|
||||
crcdata <<= 1;
|
||||
}
|
||||
}
|
||||
return crcReg;
|
||||
}
|
||||
|
||||
byte str2byte(char str[8])
|
||||
{
|
||||
int ret = 0, i;
|
||||
for(i = 0; i < 8; i++)
|
||||
if (str[i]=='1') ret |= (1<<(7-i));
|
||||
return ret;
|
||||
}
|
||||
|
||||
void print_binary(byte inpt)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 8; i++)
|
||||
if (inpt & (1<<(7-i))) putchar('1');
|
||||
else putchar('0');
|
||||
}
|
||||
|
||||
void print_preamble_nibbles(int count)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < count; i++)
|
||||
printf("1010");
|
||||
}
|
||||
|
||||
int find_preamble_start_in_bit(char *string, int len)
|
||||
{
|
||||
char homematic_sync[] = "11101001110010101110100111001010";
|
||||
for(int i = 0, j = 0; i < len; i++)
|
||||
{
|
||||
if(string[i] == homematic_sync[j])
|
||||
{
|
||||
j++;
|
||||
if(j == 32 && i>= 63) return i-63;
|
||||
}
|
||||
else j = 0;
|
||||
}
|
||||
return -1; //not found
|
||||
}
|
||||
|
||||
void xor_lfsr(char *string)
|
||||
{
|
||||
int i, j, x, len = strlen(string);
|
||||
byte polynomial[9] = {0, 0, 0, 1, 0, 0, 0, 0, 1};
|
||||
byte lfsr_state[9];
|
||||
byte first_bit;
|
||||
|
||||
// Init with 8x 1 Bit
|
||||
memset(lfsr_state, 1, 9);
|
||||
for(j = 0; j < 8; j++)
|
||||
if(string[j]=='1')
|
||||
string[j]='0';
|
||||
else
|
||||
string[j]='1';
|
||||
|
||||
for(x = 8; x < len-7; x += 8)
|
||||
{
|
||||
for(i = 0; i < 8; i++)
|
||||
{
|
||||
first_bit = 255;
|
||||
for(j = 8; j >= 0; j--)
|
||||
if(polynomial[j] && lfsr_state[j])
|
||||
{
|
||||
if(first_bit == 255)
|
||||
first_bit = 1;
|
||||
else
|
||||
first_bit = (first_bit==1) ? 0 : 1;
|
||||
}
|
||||
if(first_bit == 255)
|
||||
first_bit = 0;
|
||||
|
||||
// Clock
|
||||
for(j = 8; j >= 0; j--)
|
||||
lfsr_state[j] = lfsr_state[j-1];
|
||||
lfsr_state[0] = first_bit;
|
||||
}
|
||||
|
||||
// Xor
|
||||
for(j = 0; j < 8; j++)
|
||||
if(lfsr_state[j+1] == 1)
|
||||
if(string[x+j]=='1')
|
||||
string[x+j]='0';
|
||||
else
|
||||
string[x+j]='1';
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, j, max, offset, len, preamble_additional_length;
|
||||
byte dec[1024]={0}, enc[1024]={0}, crc_ok;
|
||||
char string[65536]={0};
|
||||
uint16 crcvalue;
|
||||
offset = 8; // Preamble + Sync
|
||||
|
||||
// Copy data (argv[2]) to string if length is ok, shorten to multiple of 8 bit
|
||||
if (strlen(argv[2]) > 8192*8 || strlen(argv[2]) < 4) return -1;
|
||||
len = strlen(argv[2]);
|
||||
|
||||
i = find_preamble_start_in_bit(argv[2], len);
|
||||
if(i < 0) return 0; // preamble+sync not found or wrong length
|
||||
preamble_additional_length = i;
|
||||
|
||||
len = (len-i)-(len-i)%8;
|
||||
memcpy(string, argv[2]+i, len);
|
||||
|
||||
if (argc>2)
|
||||
{
|
||||
if (argv[1][0]=='d')
|
||||
{
|
||||
// Apply datawhitening
|
||||
xor_lfsr(string+64);
|
||||
|
||||
// Pack to bytes
|
||||
for (i = 0; i < strlen(string)-3; i+=8)
|
||||
enc[i/8] = str2byte(&string[i]);
|
||||
max = i/8;
|
||||
memcpy(&dec, &enc, 1024);
|
||||
|
||||
// Check CRC
|
||||
crcvalue = crc(&dec[8], max-2-8);
|
||||
crc_ok = 0;
|
||||
if( ((crcvalue >> 8) & 0xFF) == dec[max-2] && (crcvalue & 0xFF) == dec[max-1]) crc_ok = 1;
|
||||
|
||||
/*
|
||||
* byte[] Dec = new byte[Enc.Length];
|
||||
* Dec[0] = Enc[0]; //Packet length
|
||||
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
|
||||
* int j;
|
||||
* for (j = 2; j < Dec[0]; j++)
|
||||
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
|
||||
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
|
||||
*/
|
||||
|
||||
// Decrypt
|
||||
dec[offset+0] = enc[offset+0];
|
||||
dec[offset+1] = (~enc[offset+1])^0x89;
|
||||
for(i = offset + 2; i < max - 3; i++)
|
||||
dec[i] = (enc[i-1]+0xdc) ^ enc[i];
|
||||
dec[i] = enc[i] ^ dec[offset+2];
|
||||
|
||||
// Recompute CRC and overwrite with FAKE-CRC, if CRC was OK before
|
||||
if(crc_ok)
|
||||
{
|
||||
crcvalue = crc(&dec[8], max-2-8);
|
||||
dec[max-1] = crcvalue & 0xFF;
|
||||
dec[max-2] = (crcvalue >> 8) & 0xFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
dec[max-1] = 0x0F; // Set magic code for wrong CRC
|
||||
dec[max-2] = 0xD0;
|
||||
}
|
||||
|
||||
// Prepend preamble longer than 32 bits
|
||||
if(0 == SHORTEN_PREAMBLE_TO_32 && preamble_additional_length > 0)
|
||||
print_preamble_nibbles(preamble_additional_length/4);
|
||||
|
||||
for(i = 0; i < max; i++)
|
||||
print_binary(dec[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pack to bytes
|
||||
for (i = 0; i < strlen(string)-3; i+=8)
|
||||
dec[i/8] = str2byte(&string[i]);
|
||||
max = i/8;
|
||||
memcpy(&enc, &dec, 1024);
|
||||
|
||||
/*
|
||||
* byte[] Dec = new byte[Enc.Length];
|
||||
* Dec[0] = Enc[0]; //Packet length
|
||||
* Dec[1] = (byte)((~Enc[1]) ^ 0x89);
|
||||
* int j;
|
||||
* for (j = 2; j < Dec[0]; j++)
|
||||
* Dec[j] = (byte)((Enc[j-1] + 0xdc) ^ Enc[j]);
|
||||
* Dec[j] = (byte)(Enc[j] ^ Dec[2]);
|
||||
*/
|
||||
|
||||
// Encrypt
|
||||
enc[offset+0] = dec[offset+0];
|
||||
enc[offset+1] = ~(dec[offset+1])^0x89;
|
||||
for(i = offset + 2; i < max - 3; i++)
|
||||
enc[i] = (enc[i-1]+0xdc) ^ dec[i];
|
||||
enc[i] = dec[i] ^ dec[offset+2];
|
||||
|
||||
// Overwrite with correct CRC
|
||||
crcvalue = crc(&enc[8], max-2-8);
|
||||
enc[max-1] = crcvalue & 0xFF;
|
||||
enc[max-2] = (crcvalue >> 8) & 0xFF;
|
||||
|
||||
// Convert to string
|
||||
memset(string, 0, 65536);
|
||||
for(i = 0; i < max; i++)
|
||||
{
|
||||
for(j = 0; j < 8; j++)
|
||||
if(enc[i] & (1<<(7-j))) string[i*8+j]='1';
|
||||
else string[i*8+j]='0';
|
||||
}
|
||||
// Apply datawhitening
|
||||
xor_lfsr(string+64);
|
||||
|
||||
// Prepend preamble longer than 32 bits
|
||||
if(0 == SHORTEN_PREAMBLE_TO_32 && preamble_additional_length > 0) // Add preamble longer than 32 bits
|
||||
print_preamble_nibbles(preamble_additional_length/4);
|
||||
|
||||
// Print bits and duplicate last bit
|
||||
printf("%s%c\n", string, string[strlen(string)-1]);
|
||||
}
|
||||
}
|
||||
else printf("Usage: %s <d/e> <bit sequence>\n\td - decode\n\te - encode\n\tbit sequence as string of 0 and 1.\n", argv[0]);
|
||||
|
||||
return 0;
|
||||
}
|
BIN
Software/Universal Radio Hacker/data/decodings/test
Normal file
BIN
Software/Universal Radio Hacker/data/decodings/test
Normal file
Binary file not shown.
47
Software/Universal Radio Hacker/data/decodings/test.c
Normal file
47
Software/Universal Radio Hacker/data/decodings/test.c
Normal file
@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i, count, what;
|
||||
if(argc>2)
|
||||
{
|
||||
if(argv[1][0]=='d')
|
||||
{
|
||||
for(i = 0; i < strlen(argv[2]); i++)
|
||||
if(argv[2][i] == '0') printf("000");
|
||||
else printf("11");
|
||||
}
|
||||
else
|
||||
{
|
||||
count = 0;
|
||||
what = -1;
|
||||
for(i = 0; i < strlen(argv[2]); i++)
|
||||
{
|
||||
if(argv[2][i] == '0')
|
||||
{
|
||||
if(what == 1) count = 0;
|
||||
what = 0;
|
||||
count++;
|
||||
if(count == 3)
|
||||
{
|
||||
putchar('0');
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(what == 0) count = 0;
|
||||
what = 1;
|
||||
count++;
|
||||
if(count == 2)
|
||||
{
|
||||
putchar('1');
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
2
Software/Universal Radio Hacker/data/decodings/test.sh
Normal file
2
Software/Universal Radio Hacker/data/decodings/test.sh
Normal file
@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
echo "$1$1"
|
Reference in New Issue
Block a user