2020-02-22 20:07:00 +00:00
|
|
|
#include "stdio.h"
|
|
|
|
#include "stdint.h"
|
|
|
|
#include "string.h"
|
|
|
|
#include "../libv27/scrambler.h"
|
|
|
|
|
|
|
|
static int show_bin(uint8_t *data1, uint8_t *data2, int len)
|
|
|
|
{
|
|
|
|
int i, j, error = 0;;
|
|
|
|
uint8_t bit1, bit2;
|
|
|
|
|
|
|
|
for (i = 0; i < len; i++) {
|
|
|
|
printf(".");
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
|
bit1 = (data1[i] >> j) & 1;
|
|
|
|
bit2 = (data2[i] >> j) & 1;
|
|
|
|
if (bit1 == bit2)
|
|
|
|
printf("%d", bit1);
|
|
|
|
else {
|
|
|
|
printf("X");
|
|
|
|
error++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int check_repetition(uint8_t *data, int len, int repeat, int start)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
uint8_t b1, b2;
|
|
|
|
|
|
|
|
for (i = start; i < (len * 8 - repeat); i++) {
|
|
|
|
b1 = (data[i >> 3] >> (i & 7)) & 1;
|
|
|
|
b2 = (data[(i+repeat) >> 3] >> ((i+repeat) & 7)) & 1;
|
|
|
|
if (b1 != b2)
|
|
|
|
return i - start + repeat;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
v27scrambler_t scram, descram;
|
|
|
|
|
|
|
|
char message[] = "Jolly Roger~~~~";
|
|
|
|
int len = strlen(message);
|
|
|
|
uint8_t data[len];
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
printf("Message: %s\n", message);
|
|
|
|
|
|
|
|
memcpy(data, message, len);
|
|
|
|
show_bin(data, (uint8_t *)message, len);
|
|
|
|
|
|
|
|
v27_scrambler_init(&scram, 1, 0);
|
|
|
|
v27_scrambler_block(&scram, data, len);
|
|
|
|
|
|
|
|
printf("Scrambled:\n");
|
|
|
|
show_bin(data, data, len);
|
|
|
|
|
|
|
|
v27_scrambler_init(&descram, 1, 1);
|
|
|
|
v27_scrambler_block(&descram, data, len);
|
|
|
|
|
|
|
|
printf("Descramble without corruption?\n");
|
|
|
|
|
|
|
|
ret = show_bin(data, (uint8_t *)message, len);
|
|
|
|
if (ret) {
|
|
|
|
printf("Descrambling failed!\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("Yes!\n");
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
v27_scrambler_init(&scram, 1, 0);
|
|
|
|
v27_scrambler_block(&scram, data, len);
|
|
|
|
|
|
|
|
data[0] = 'B';
|
|
|
|
data[1] = 'U';
|
|
|
|
data[2] = 'G';
|
|
|
|
|
|
|
|
v27_scrambler_init(&descram, 1, 1);
|
|
|
|
v27_scrambler_block(&descram, data, len);
|
|
|
|
|
|
|
|
printf("Descramble with 3 bytes corruption: (should fix itself after 4 bytes)\n");
|
|
|
|
|
|
|
|
show_bin(data, (uint8_t *)message, len);
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
printf("Descramble a scrambled sequence of 8 bit repetitions with V.27: 01111110\n");
|
|
|
|
|
|
|
|
memset(data, 0x7e, len);
|
|
|
|
|
|
|
|
v27_scrambler_init(&descram, 0, 1);
|
|
|
|
v27_scrambler_block(&descram, data, len);
|
|
|
|
|
|
|
|
show_bin(data, (uint8_t *)data, len);
|
|
|
|
|
|
|
|
/* note at position 6 we have no more change towards 8 bit offset */
|
|
|
|
ret = check_repetition(data, len, 8, 6);
|
|
|
|
if (ret) {
|
2021-01-01 21:11:48 +00:00
|
|
|
printf("There's is a change of repetition after %d bits after start %d, please fix!\n", ret, 6);
|
2020-02-22 20:07:00 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("Repetition not detected, good!\n");
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
printf("Descramble a scrambled sequence of 8 bit repetitions with V.27bis/ter: 01111110\n");
|
|
|
|
|
|
|
|
memset(data, 0x7e, len);
|
|
|
|
|
|
|
|
v27_scrambler_init(&descram, 1, 1);
|
|
|
|
v27_scrambler_block(&descram, data, len);
|
|
|
|
|
|
|
|
show_bin(data, (uint8_t *)data, len);
|
|
|
|
|
|
|
|
/* note at position 6 we have no more change towards 8 bit offset */
|
|
|
|
ret = check_repetition(data, len, 8, 6);
|
|
|
|
if (ret != 34) {
|
2021-01-01 21:11:48 +00:00
|
|
|
printf("There's is NO change of repetition after 34 bits, but after %d bits, which should not happen!\n", ret);
|
2020-02-22 20:07:00 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
printf("Repetition detected after %d bits from start %d, good!\n", ret, 6);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|