kopia lustrzana https://github.com/M17-Project/M17_Implementations
Add Command Line Scanning (WIP);
Seperate Usage From CLI Scan; parse_raw_key_string for key entry reading;pull/29/head
rodzic
9fd6231c90
commit
ffbe510dde
|
@ -27,10 +27,10 @@ uint8_t finished=0;
|
||||||
|
|
||||||
//encryption
|
//encryption
|
||||||
uint8_t encryption=0;
|
uint8_t encryption=0;
|
||||||
int aes_type = 1; //1=AES128, 2=AES192, 3=AES256
|
int aes_type = 1; //1=AES128, 2=AES192, 3=AES256
|
||||||
uint8_t key[32]; //TODO: replace with a `-K` arg key entry
|
uint8_t key[32];
|
||||||
uint8_t iv[16];
|
uint8_t iv[16];
|
||||||
time_t epoch = 1577836800L; //Jan 1, 2020, 00:00:00 UTC
|
time_t epoch = 1577836800L; //Jan 1, 2020, 00:00:00 UTC
|
||||||
|
|
||||||
//Scrambler
|
//Scrambler
|
||||||
uint8_t scr_bytes[16];
|
uint8_t scr_bytes[16];
|
||||||
|
@ -49,7 +49,7 @@ void scrambler_sequence_generator ()
|
||||||
uint32_t lfsr, bit;
|
uint32_t lfsr, bit;
|
||||||
lfsr = scrambler_seed;
|
lfsr = scrambler_seed;
|
||||||
|
|
||||||
//only set if not initially set(first run), it is possible (and observed) that the scrambler_subtype can
|
//only set if not initially set (first run), it is possible (and observed) that the scrambler_subtype can
|
||||||
//change on subsequent passes if the current SEED for the LFSR falls below one of these thresholds
|
//change on subsequent passes if the current SEED for the LFSR falls below one of these thresholds
|
||||||
if (scrambler_subtype == -1)
|
if (scrambler_subtype == -1)
|
||||||
{
|
{
|
||||||
|
@ -60,10 +60,10 @@ void scrambler_sequence_generator ()
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Set Frame Type based on scrambler_subtype value
|
//TODO: Set Frame Type based on scrambler_subtype value
|
||||||
if (debug_mode == 1)
|
if (debug_mode > 1)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\nScrambler Key: %X; Seed: %X; Subtype: %d;", scrambler_key, lfsr, scrambler_subtype);
|
fprintf (stderr, "\nScrambler Key: 0x%06X; Seed: 0x%06X; Subtype: %02d;", scrambler_key, lfsr, scrambler_subtype);
|
||||||
fprintf (stderr, "\n pN: "); //debug
|
fprintf (stderr, "\n pN: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
//run pN sequence with taps specified
|
//run pN sequence with taps specified
|
||||||
|
@ -97,7 +97,7 @@ void scrambler_sequence_generator ()
|
||||||
if (scrambler_subtype == 2) scrambler_seed &= 0xFFFFFF;
|
if (scrambler_subtype == 2) scrambler_seed &= 0xFFFFFF;
|
||||||
else scrambler_seed &= 0xFF;
|
else scrambler_seed &= 0xFF;
|
||||||
|
|
||||||
if (debug_mode == 1)
|
if (debug_mode > 1)
|
||||||
{
|
{
|
||||||
//debug packed bytes
|
//debug packed bytes
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
|
@ -107,6 +107,59 @@ void scrambler_sequence_generator ()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage:\n");
|
||||||
|
fprintf(stderr, "-K - AES Encryption (-K 7777777777777777777777777777777777777777777777777777777777777777),\n");
|
||||||
|
fprintf(stderr, "-k - Scrambler Encryption -k 123456,\n");
|
||||||
|
fprintf(stderr, "-D - Debug Mode,\n");
|
||||||
|
fprintf(stderr, "-h - help / print usage,\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//convert a user string (as hex octets) into a uint8_t array for key
|
||||||
|
void parse_raw_key_string (char * input)
|
||||||
|
{
|
||||||
|
uint8_t * raw = key; //set pointer to the key array
|
||||||
|
|
||||||
|
//since we want this as octets, get strlen value, then divide by two
|
||||||
|
uint16_t len = strlen((const char*)input);
|
||||||
|
|
||||||
|
//if zero is returned, just do two
|
||||||
|
if (len == 0) len = 2;
|
||||||
|
|
||||||
|
//if odd number, then user didn't pass complete octets, but just add one to len value to make it even
|
||||||
|
if (len&1) len++;
|
||||||
|
|
||||||
|
//divide by two to get octet len
|
||||||
|
len /= 2;
|
||||||
|
|
||||||
|
//sanity check, maximum len should not exceed 32 for an AES key
|
||||||
|
if (len > 32) len = 32;
|
||||||
|
|
||||||
|
char octet_char[3];
|
||||||
|
octet_char[2] = 0;
|
||||||
|
uint16_t k = 0;
|
||||||
|
uint16_t i = 0;
|
||||||
|
|
||||||
|
//debug
|
||||||
|
// fprintf (stderr, "\nRaw Len: %d; Raw Octets:", len);
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
strncpy (octet_char, input+k, 2);
|
||||||
|
octet_char[2] = 0;
|
||||||
|
sscanf (octet_char, "%hhX", &raw[i]);
|
||||||
|
|
||||||
|
//debug
|
||||||
|
// fprintf (stderr, " (%s)", octet_char);
|
||||||
|
// fprintf (stderr, " %02X", raw[i]);
|
||||||
|
|
||||||
|
k += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fprintf (stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
//main routine
|
//main routine
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
@ -115,56 +168,68 @@ int main(int argc, char* argv[])
|
||||||
//printf("%d -> %d -> %d\n", 1, intrl_seq[1], intrl_seq[intrl_seq[1]]); //interleaver bijective reciprocality test, f(f(x))=x
|
//printf("%d -> %d -> %d\n", 1, intrl_seq[1], intrl_seq[intrl_seq[1]]); //interleaver bijective reciprocality test, f(f(x))=x
|
||||||
//return 0;
|
//return 0;
|
||||||
|
|
||||||
//test only, delete next two lines later
|
srand(time(NULL)); //random number generator (for IV rand() seed value)
|
||||||
debug_mode = 1;
|
|
||||||
encryption = 2;
|
|
||||||
|
|
||||||
srand(time(NULL)); //seed random number generator
|
|
||||||
memset(key, 0, 32*sizeof(uint8_t));
|
memset(key, 0, 32*sizeof(uint8_t));
|
||||||
memset(iv, 0, 16*sizeof(uint8_t));
|
memset(iv, 0, 16*sizeof(uint8_t));
|
||||||
|
|
||||||
//TODO: Redo args so we can get more than one at the same time
|
//scan command line options for input data (purely optional)
|
||||||
//copy and paste from m17-packet-encode
|
if(argc>=1)
|
||||||
|
|
||||||
//debug mode
|
|
||||||
if(argc>1 && strstr(argv[1], "-D"))
|
|
||||||
{
|
{
|
||||||
debug_mode = 1;
|
for(uint8_t i=1; i<argc; i++)
|
||||||
}
|
|
||||||
|
|
||||||
//encryption init
|
|
||||||
if(argc>1 && strstr(argv[1], "-K"))
|
|
||||||
{
|
|
||||||
//hard coded key
|
|
||||||
for (uint8_t i = 0; i < 32; i++)
|
|
||||||
key[i] = 0x77;
|
|
||||||
|
|
||||||
if (debug_mode == 1)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "\nAES Key:");
|
if(argv[i][0]=='-')
|
||||||
for (uint8_t i = 0; i < 32; i++)
|
|
||||||
{
|
{
|
||||||
if (i == 16)
|
if(argv[i][1]=='K') //-K - AES Encryption
|
||||||
fprintf (stderr, "\n ");
|
{
|
||||||
fprintf (stderr, " %02X", key[i]);
|
|
||||||
|
parse_raw_key_string (argv[i+1]);
|
||||||
|
|
||||||
|
fprintf (stderr, "AES Key:");
|
||||||
|
for (uint8_t i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
if (i == 16)
|
||||||
|
fprintf (stderr, "\n ");
|
||||||
|
fprintf (stderr, " %02X", key[i]);
|
||||||
|
}
|
||||||
|
fprintf (stderr, "\n");
|
||||||
|
|
||||||
|
|
||||||
|
encryption=2; //AES key was passed
|
||||||
|
}
|
||||||
|
else if(argv[i][1]=='k') //-k - Scrambler Encryption
|
||||||
|
{
|
||||||
|
|
||||||
|
parse_raw_key_string (argv[i+1]);
|
||||||
|
scrambler_key = (key[0] << 16) | (key[1] << 8) | (key[2] << 0);
|
||||||
|
|
||||||
|
fprintf (stderr, "Scrambler Key: 0x%06X;", scrambler_key);
|
||||||
|
|
||||||
|
scrambler_seed = scrambler_key; //initialize the seed with the key value
|
||||||
|
|
||||||
|
encryption=1; //Scrambler key was passed
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(argv[i][1]=='D') //-D - Debug Mode
|
||||||
|
{
|
||||||
|
debug_mode=1;
|
||||||
|
}
|
||||||
|
else if(argv[i][1]=='h') //-h - help / usage
|
||||||
|
{
|
||||||
|
usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unknown param detected. Exiting...\n");
|
||||||
|
usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf (stderr, "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
encryption=2; //AES key was passed
|
|
||||||
}
|
|
||||||
|
|
||||||
if(argc>1 && strstr(argv[1], "-k"))
|
|
||||||
{
|
|
||||||
// scrambler_key = atoi(argv[2]); //would prefer to get the hex input, but good enough to test with
|
|
||||||
scrambler_key = 0x123456;
|
|
||||||
scrambler_seed = scrambler_key; //initialize the seed with the key value
|
|
||||||
encryption=1; //Scrambler key was passed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(encryption==2)
|
if(encryption==2)
|
||||||
{
|
{
|
||||||
//TODO: read key
|
|
||||||
for(uint8_t i=0; i<4; i++)
|
for(uint8_t i=0; i<4; i++)
|
||||||
iv[i] = ((uint32_t)(time(NULL)&0xFFFFFFFF)-(uint32_t)epoch) >> (24-(i*8));
|
iv[i] = ((uint32_t)(time(NULL)&0xFFFFFFFF)-(uint32_t)epoch) >> (24-(i*8));
|
||||||
for(uint8_t i=3; i<14; i++)
|
for(uint8_t i=3; i<14; i++)
|
||||||
|
@ -176,13 +241,13 @@ int main(int argc, char* argv[])
|
||||||
//broadcast
|
//broadcast
|
||||||
memset(next_lsf.dst, 0xFF, 6*sizeof(uint8_t));
|
memset(next_lsf.dst, 0xFF, 6*sizeof(uint8_t));
|
||||||
|
|
||||||
//AB1CDE
|
//N0CALL
|
||||||
next_lsf.src[0] = 0x00;
|
next_lsf.src[0] = 0x00;
|
||||||
next_lsf.src[1] = 0x00;
|
next_lsf.src[1] = 0x00;
|
||||||
next_lsf.src[2] = 0x1F;
|
next_lsf.src[2] = 0x4B;
|
||||||
next_lsf.src[3] = 0x24;
|
next_lsf.src[3] = 0x13;
|
||||||
next_lsf.src[4] = 0x5D;
|
next_lsf.src[4] = 0xD1;
|
||||||
next_lsf.src[5] = 0x51;
|
next_lsf.src[5] = 0x06;
|
||||||
|
|
||||||
if (encryption == 2) //AES ENC, 3200 voice
|
if (encryption == 2) //AES ENC, 3200 voice
|
||||||
{
|
{
|
||||||
|
@ -383,9 +448,9 @@ int main(int argc, char* argv[])
|
||||||
//DEBUG:
|
//DEBUG:
|
||||||
|
|
||||||
//AES
|
//AES
|
||||||
//encode debug with -- ./m17-coder-sym -K > float.sym
|
//encode debug with -- ./m17-coder-sym -D -K 7777777777777777777777777777777777777777777777777777777777777777 > float.sym
|
||||||
//decode debug with -- m17-fme -r -f float.sym -v 1 -E '7777777777777777 7777777777777777 7777777777777777 7777777777777777'
|
//decode debug with -- m17-fme -r -f float.sym -v 1 -E '7777777777777777 7777777777777777 7777777777777777 7777777777777777'
|
||||||
|
|
||||||
//Scrambler
|
//Scrambler
|
||||||
//encode debug with -- ./m17-coder-sym -k > scr.sym
|
//encode debug with -- ./m17-coder-sym -D -k 123456 > scr.sym
|
||||||
//decode debug with -- m17-fme -r -f scr.sym -v 1 -e 123456
|
//decode debug with -- m17-fme -r -f scr.sym -v 1 -e 123456
|
||||||
|
|
Ładowanie…
Reference in New Issue