Add More Options

Serpen'tera' Privacy now supports 10/32/64 character modes (have to use ncurses terminal to enter 32 or 64 char values)
NXDN Scrambler LFSR
Odd and End Terminal Tweaks
This commit is contained in:
lwvmobile 2022-08-26 21:54:54 -04:00 committed by GitHub
parent 2f05bfacfa
commit 837bfac5f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 548 additions and 190 deletions

View File

@ -460,6 +460,10 @@ typedef struct
unsigned long long int payload_miP;
int p25vc;
unsigned long long int K;
unsigned long long int K1;
unsigned long long int K2;
unsigned long long int K3;
unsigned long long int K4;
int menuopen;
unsigned int debug_audio_errors;
@ -848,6 +852,7 @@ void ProcessUnifiedData(dsd_opts * opts, dsd_state * state, uint8_t info[196], u
//LFSR code courtesy of https://github.com/mattames/LFSR/
int LFSR(dsd_state * state);
void LFSRN (char * BufferIn, char * BufferOut, dsd_state * state);
void Hamming_7_4_init();
void Hamming_7_4_encode(unsigned char *origBits, unsigned char *encodedBits);

View File

@ -374,10 +374,23 @@ void dmrBS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -391,10 +404,23 @@ void dmrBS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -413,10 +439,23 @@ void dmrBS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
if (state->DMRvcR == 0 && state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -430,10 +469,23 @@ void dmrBS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
if (state->DMRvcR == 0 && state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -718,11 +770,24 @@ void dmrBSBootstrap (dsd_opts * opts, dsd_state * state)
fprintf (stderr, "%s", KNRM);
}
if ( (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68) )
if ( (state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68) )
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -738,11 +803,24 @@ void dmrBSBootstrap (dsd_opts * opts, dsd_state * state)
fprintf (stderr, "%s", KNRM);
}
if ( (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68) )
if ( (state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68) )
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");

View File

@ -372,10 +372,23 @@ void dmrMS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -390,10 +403,23 @@ void dmrMS (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
fprintf (stderr, "%s", KNRM);
}
fprintf (stderr, "\n");
@ -459,6 +485,7 @@ void dmrMS (dsd_opts * opts, dsd_state * state)
state->dmr_stereo = 0;
state->dmr_ms_mode = 0;
state->dmr_ms_rc = 0;
state->DMRvcL = 0;
}
@ -632,13 +659,26 @@ void dmrMSBootstrap (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if ( (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fid == 0x68) )
if ( (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->DMRvcR == 0 && state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fid == 0x68) )
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf (stderr, "%s", KNRM);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
}
fprintf (stderr, "%s", KNRM);
fprintf (stderr, "\n");
}
else
@ -651,13 +691,26 @@ void dmrMSBootstrap (dsd_opts * opts, dsd_state * state)
fprintf(stderr, " PrK %lld", state->K);
fprintf (stderr, "%s", KNRM);
}
if ( (state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fid == 0x68) )
if ( (state->DMRvcL == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68) ||
(state->DMRvcR == 0 && state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fid == 0x68) )
{
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf (stderr, "%s", KNRM);
fprintf(stderr, " SPT %016llX", state->K1);
if (state->K2 != 0)
{
fprintf(stderr, " %016llX", state->K2);
}
if (state->K3 != 0)
{
fprintf(stderr, " %016llX", state->K3);
}
if (state->K4 != 0)
{
fprintf(stderr, " %016llX", state->K4);
}
}
fprintf (stderr, "%s", KNRM);
fprintf (stderr, "\n");
}

View File

@ -114,68 +114,148 @@ if (state->currentslot == 1 && state->K > 0 && state->dmr_soR & 0x40 && state->p
}
}
if (state->currentslot == 0 && state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->currentslot == 0 && state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
int pos = 0;
unsigned long long int k1 = state->K1;
unsigned long long int k2 = state->K2;
unsigned long long int k3 = state->K3;
unsigned long long int k4 = state->K4;
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %010llX", k1);
int T_Key[256] = {0};
int pN[882] = {0};
int len = 0;
if (k2 == 0)
{
len = 39;
k1 = k1 << 24;
}
if (k2 != 0)
{
len = 127;
fprintf(stderr, " %016llX", k2);
}
if (k4 != 0)
{
len = 255;
fprintf(stderr, " %016llX", k3);
fprintf(stderr, " %016llX", k4);
}
fprintf (stderr, "%s", KNRM);
k = state->H;
unsigned long long int msb = 0;
for (i = 0; i < 64; i++)
{
T_Key[i] = ( ((k1 << i) & 0x8000000000000000) >> 63 );
T_Key[i+64] = ( ((k2 << i) & 0x8000000000000000) >> 63 );
T_Key[i+128] = ( ((k3 << i) & 0x8000000000000000) >> 63 );
T_Key[i+192] = ( ((k4 << i) & 0x8000000000000000) >> 63 );
}
k = k << 8;
k = k | ((k >> 40) & 0xFF);
for (i = 0; i < 882; i++)
{
pN[i] = T_Key[pos];
pos++;
if (pos > len)
{
pos = 0;
}
}
for(Frame = 0; Frame < 6; Frame++)
pos = 0;
for(Frame = 0; Frame < 6; Frame++)
{
for(i = 0; i < 3; i++)
{
for(j = 0; j < 48; j++)
for(j = 0; j < 49; j++)
{
x = ( ((k << j) & 0x800000000000) >> 47 );
TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= x;
}
k = k << 1;
msb = (k >> 32) & 0xFFFF;
k = (k << 8) & 0xFFFFFFFF0000;
k = k | msb;
TSVoiceSupFrameL->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= pN[pos];
pos++;
}
}
}
}
if (state->currentslot == 1 && state->H > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
if (state->currentslot == 1 && state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
{
int pos = 0;
unsigned long long int k1 = state->K1;
unsigned long long int k2 = state->K2;
unsigned long long int k3 = state->K3;
unsigned long long int k4 = state->K4;
fprintf (stderr, "\n");
fprintf (stderr, "%s", KYEL);
fprintf(stderr, " T10 %010llX", state->H);
fprintf(stderr, " SPT %010llX", k1);
int T_Key[256] = {0};
int pN[882] = {0};
int len = 0;
if (k2 == 0)
{
len = 39;
k1 = k1 << 24;
}
if (k2 != 0)
{
len = 127;
fprintf(stderr, " %016llX", k2);
}
if (k4 != 0)
{
len = 255;
fprintf(stderr, " %016llX", k3);
fprintf(stderr, " %016llX", k4);
}
fprintf (stderr, "%s", KNRM);
k = state->H;
unsigned long long int msb = 0;
for (i = 0; i < 64; i++)
{
T_Key[i] = ( ((k1 << i) & 0x8000000000000000) >> 63 );
T_Key[i+64] = ( ((k2 << i) & 0x8000000000000000) >> 63 );
T_Key[i+128] = ( ((k3 << i) & 0x8000000000000000) >> 63 );
T_Key[i+192] = ( ((k4 << i) & 0x8000000000000000) >> 63 );
}
k = k << 8;
k = k | ((k >> 40) & 0xFF);
for (i = 0; i < 882; i++)
{
pN[i] = T_Key[pos];
pos++;
if (pos > len)
{
pos = 0;
}
}
for(Frame = 0; Frame < 6; Frame++)
pos = 0;
for(Frame = 0; Frame < 6; Frame++)
{
for(i = 0; i < 3; i++)
{
for(j = 0; j < 48; j++)
for(j = 0; j < 49; j++)
{
x = ( ((k << j) & 0x800000000000) >> 47 );
TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= x;
}
k = k << 1;
msb = (k >> 32) & 0xFFFF;
k = (k << 8) & 0xFFFFFFFF0000;
k = k | msb;
TSVoiceSupFrameR->TimeSlotAmbeVoiceFrame[Frame].AmbeBit[i][j] ^= pN[pos];
pos++;
}
}
}
}
if (state->currentslot == 0)

View File

@ -32,8 +32,6 @@ char * getTimeL(void) //get pretty hh:mm:ss timestamp
return curr;
}
//getDate has a bug that affects writing to file using fopen 32-bit Ubuntu OS, need to look into
//increasing array size causes date to not print in Linux builds, but fixes cygwin bug, so reverting to 99 until a better fix is worked out.
char * getDateL(void) {
char datename[120]; //increased to 200 to fix 32-bit Ubuntu/Cygwin when fopen file printing to lrrp.txt
char * curr2;
@ -2199,10 +2197,8 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19
state->payload_algid = 0;
state->payload_keyid = 0;
state->payload_mi = 0;
// state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions;
//state->dmr_fid = 0;
//state->dmr_so = 0; //leave disabled so will persist to aid in muting or unmuting when required
state->dmr_fid = 0;
state->dmr_so = 0;
state->lastsrc = 0;
state->lasttg = 0;
@ -2212,10 +2208,8 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19
state->payload_algidR = 0;
state->payload_keyidR = 0;
state->payload_miR = 0;
// state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions;
//state->dmr_fidR = 0;
//state->dmr_soR = 0;
state->dmr_fidR = 0;
state->dmr_soR = 0;
state->lastsrcR = 0;
state->lasttgR = 0;
@ -2230,21 +2224,6 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19
fprintf(stderr, "FID=0x%02X SVC=0x%02X", TSVoiceSupFrame->FullLC.FeatureSetID, TSVoiceSupFrame->FullLC.ServiceOptions);
fprintf (stderr, "%s ", KNRM);
if (TSVoiceSupFrame->FullLC.FullLinkControlOpcode == 0) //other opcodes may convey callsigns, names, etc.
{
if (state->currentslot == 0)
{
// state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions;
//zero out src and tgt here as well, or will that cause issues with ncurses terminal and per call?
}
if (state->currentslot == 1)
{
// state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions;
//zero out src and tgt here as well, or will that cause issues with ncurses terminal and per call?
}
}
}
else if(IrrecoverableErrors == 0)
{
@ -2254,20 +2233,7 @@ void ProcessDmrTerminaisonLC(dsd_opts * opts, dsd_state * state, uint8_t info[19
fprintf(stderr, "FID=0x%02X SVC=0x%02X", TSVoiceSupFrame->FullLC.FeatureSetID, TSVoiceSupFrame->FullLC.ServiceOptions);
fprintf(stderr, "RAS (FEC OK/CRC ERR)"); //tlc
fprintf (stderr, "%s ", KNRM);
if (TSVoiceSupFrame->FullLC.FullLinkControlOpcode == 0) //other opcodes may convey callsigns, names, etc.
{
if (state->currentslot == 0)
{
// state->dmr_fid = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_so = TSVoiceSupFrame->FullLC.ServiceOptions;
}
if (state->currentslot == 1)
{
// state->dmr_fidR = TSVoiceSupFrame->FullLC.FeatureSetID;
// state->dmr_soR = TSVoiceSupFrame->FullLC.ServiceOptions;
}
}
}
else {} //fprintf(stderr, "\n(FEC FAIL/CRC ERR)");
@ -2660,13 +2626,10 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state)
{
fprintf (stderr, "%s", KCYN);
fprintf (stderr, "\nFull Voice Burst Payload ");
//for (i = 0; i < 8; i++)
for (i = 0; i < 10; i++)
{
fprintf (stderr, "[%02X]", LC_DataBytes[i]); //amateur DMR hams seem to use this area to send callsigns and names using 04,05,06,07 opcodes
fprintf (stderr, "[%02X]", LC_DataBytes[i]);
}
// fprintf(stderr, "\n");
// fprintf(stderr, "CRC extracted = 0x%04X - CRC computed = 0x%04X - ", CRCExtracted, CRCComputed);
fprintf (stderr, "%s", KNRM);
@ -2677,7 +2640,7 @@ void ProcessVoiceBurstSync(dsd_opts * opts, dsd_state * state)
//LFSR code courtesy of https://github.com/mattames/LFSR/
int LFSR(dsd_state * state)
{
//int lfsr = 0;
int lfsr = 0;
if (state->currentslot == 0)
{
@ -2686,14 +2649,12 @@ int LFSR(dsd_state * state)
else lfsr = state->payload_miR;
uint8_t cnt = 0;
//fprintf(stderr, "\nInitial Value:- 0x%08x\n", lfsr);
for(cnt=0;cnt<32;cnt++)
{
// Polynomial is C(x) = x^32 + x^4 + x^2 + 1
int bit = ((lfsr >> 31) ^ (lfsr >> 3) ^ (lfsr >> 1)) & 0x1;
lfsr = (lfsr << 1) | (bit);
//fprintf(stderr, "\nshift #%i, 0x%08x\n", (cnt+1), lfsr);
}
if (state->currentslot == 0)
{

View File

@ -480,6 +480,10 @@ initState (dsd_state * state)
state->K = 0;
state->R = 0;
state->H = 0;
state->K1 = 0;
state->K2 = 0;
state->K3 = 0;
state->K4 = 0;
state->dmr_stereo = 0;
state->dmrburstL = 17; //initialize at higher value than possible
@ -621,9 +625,6 @@ usage ()
printf (" (default=36)\n");
printf (" -M <num> Min/Max buffer size for QPSK decision point tracking\n");
printf (" (default=15)\n");
// printf (" -n Reset P25 Heuristics and initState variables on mixed signal decoding\n");
// printf (" Helps when decoding mixed signal types (P25P1) at same time\n");
// printf (" (WiP! May Cause Slow Memory Leak or System Hang - Experimental)\n");
printf (" -T Enable DMR TDMA Stereo Voice (Two Slot Dual Voices)\n");
printf (" This feature will open two streams for slot 1 voice and slot 2 voice\n");
printf (" May Cause Skipping or sync issues if bad signal/errors\n");
@ -634,7 +635,10 @@ usage ()
printf ("\n");
printf (" -K <dec> Manually Enter DMRA Privacy Key (Decimal Value of Key Number)\n");
printf ("\n");
printf (" -H <hex> Manually Enter 'Tera 10 Privacy Key (40-Bit/10-Char Hex Value)\n");
printf (" -H <hex> Manually Enter **tera 10 Privacy Key (40-Bit/10-Char Hex Value)\n");
printf (" (32/64-Char values can only be entered in the NCurses Terminal)\n");
printf (" -R <dec> Manually Enter NXDN 4800 EHR Scrambler Key Value \n");
printf (" \n");
printf ("\n");
exit (0);
}
@ -953,6 +957,21 @@ main (int argc, char **argv)
}
break;
case 'R':
sscanf (optarg, "%lld", &state.R);
if (state.R > 0x7FFF)
{
state.R = 0x7FFF;
}
// opts.dmr_mute_encL = 0;
// opts.dmr_mute_encR = 0;
if (state.R == 0)
{
// opts.dmr_mute_encL = 1;
// opts.dmr_mute_encR = 1;
}
break;
case 'H':
sscanf (optarg, "%llX", &state.H);
if (state.H > 0xFFFFFFFFFF)
@ -966,6 +985,7 @@ main (int argc, char **argv)
opts.dmr_mute_encL = 1;
opts.dmr_mute_encR = 1;
}
state.K1 = state.H; //shim
break;
case 'G': //Set rtl device gain
@ -1099,10 +1119,10 @@ main (int argc, char **argv)
opts.serial_dev[1023] = '\0';
break;
case 'R':
sscanf (optarg, "%d", &opts.resume);
fprintf (stderr,"Enabling scan resume after %i TDULC frames\n", opts.resume);
break;
// case 'R':
// sscanf (optarg, "%d", &opts.resume);
// fprintf (stderr,"Enabling scan resume after %i TDULC frames\n", opts.resume);
// break;
case 'f':
if (optarg[0] == 'a')

View File

@ -202,6 +202,23 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
mbe_demodulateAmbe3600x2450Data (ambe_fr);
state->errs2 += mbe_eccAmbe3600x2450Data (ambe_fr, ambe_d);
if (state->nxdn_cipher_type == 0x01 && state->R > 0) //reuse R for scrambler key
{
if (state->payload_miN == 0)
{
state->payload_miN = state->R;
}
char ambe_temp[49];
for (short int i = 0; i < 49; i++)
{
ambe_temp[i] = ambe_d[i];
ambe_d[i] = 0;
}
LFSRN(ambe_temp, ambe_d, state);
}
mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str,
ambe_d, state->cur_mp, state->prev_mp, state->prev_mp_enhanced, opts->uvquality);
@ -239,34 +256,60 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
}
}
if (state->currentslot == 0 && state->H > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
if (state->K1 > 0 && state->dmr_so & 0x40 && state->payload_keyid == 0 && state->dmr_fid == 0x68)
{
unsigned long long int msb = 0;
if (state->DMRvcL == 0)
{
state->HYTL = state->H;
k = state->H;
k = k << 8;
k = k | ((k >> 40) & 0xFF);
state->HYTL = k;
int pos = 0;
unsigned long long int k1 = state->K1;
unsigned long long int k2 = state->K2;
unsigned long long int k3 = state->K3;
unsigned long long int k4 = state->K4;
int T_Key[256] = {0};
int pN[882] = {0};
int len = 0;
if (k2 == 0)
{
len = 39;
k1 = k1 << 24;
}
if (k2 != 0)
{
len = 127;
}
if (k4 != 0)
{
len = 255;
}
k = state->HYTL;
for(short int j = 0; j < 48; j++)
{
x = ( ((k << j) & 0x800000000000) >> 47 );
ambe_d[j] ^= x;
}
for (i = 0; i < 64; i++)
{
T_Key[i] = ( ((k1 << i) & 0x8000000000000000) >> 63 );
T_Key[i+64] = ( ((k2 << i) & 0x8000000000000000) >> 63 );
T_Key[i+128] = ( ((k3 << i) & 0x8000000000000000) >> 63 );
T_Key[i+192] = ( ((k4 << i) & 0x8000000000000000) >> 63 );
}
k = k << 1;
msb = (k >> 32) & 0xFFFF; //new MSB
k = (k << 8) & 0xFFFFFFFF0000;
k = k | msb;
for (i = 0; i < 882; i++)
{
pN[i] = T_Key[pos];
pos++;
if (pos > len)
{
pos = 0;
}
}
state->HYTL = k;
pos = state->DMRvcL * 49;
for(i = 0; i < 49; i++)
{
ambe_d[i] ^= pN[pos];
pos++;
}
state->DMRvcL++;
}
mbe_processAmbe2450Dataf (state->audio_out_temp_buf, &state->errs, &state->errs2, state->err_str,
@ -289,7 +332,6 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
mbe_demodulateAmbe3600x2450Data (ambe_fr);
state->errs2R += mbe_eccAmbe3600x2450Data (ambe_fr, ambe_d);
if (state->K > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x10)
{
k = Pr[state->K];
@ -301,34 +343,60 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
}
}
if (state->H > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
if (state->K1 > 0 && state->dmr_soR & 0x40 && state->payload_keyidR == 0 && state->dmr_fidR == 0x68)
{
unsigned long long int msb = 0;
if (state->DMRvcR == 0)
{
state->HYTR = state->H;
k = state->H;
k = k << 8;
k = k | ((k >> 40) & 0xFF);
state->HYTR = k;
int pos = 0;
unsigned long long int k1 = state->K1;
unsigned long long int k2 = state->K2;
unsigned long long int k3 = state->K3;
unsigned long long int k4 = state->K4;
int T_Key[256] = {0};
int pN[882] = {0};
int len = 0;
if (k2 == 0)
{
len = 39;
k1 = k1 << 24;
}
if (k2 != 0)
{
len = 127;
}
if (k4 != 0)
{
len = 255;
}
k = state->HYTR;
for(short int j = 0; j < 48; j++)
{
x = ( ((k << j) & 0x800000000000) >> 47 );
ambe_d[j] ^= x;
}
for (i = 0; i < 64; i++)
{
T_Key[i] = ( ((k1 << i) & 0x8000000000000000) >> 63 );
T_Key[i+64] = ( ((k2 << i) & 0x8000000000000000) >> 63 );
T_Key[i+128] = ( ((k3 << i) & 0x8000000000000000) >> 63 );
T_Key[i+192] = ( ((k4 << i) & 0x8000000000000000) >> 63 );
}
k = k << 1;
msb = (k >> 32) & 0xFFFF;
k = (k << 8) & 0xFFFFFFFF0000;
k = k | msb;
for (i = 0; i < 882; i++)
{
pN[i] = T_Key[pos];
pos++;
if (pos > len)
{
pos = 0;
}
}
state->HYTR = k;
pos = state->DMRvcR * 49;
for(i = 0; i < 49; i++)
{
ambe_d[i] ^= pN[pos];
pos++;
}
state->DMRvcR++;
}
mbe_processAmbe2450Dataf (state->audio_out_temp_bufR, &state->errsR, &state->errs2R, state->err_strR,

View File

@ -206,10 +206,10 @@ char *choices[] = {
"Decode NXDN96",
"Decode X2-TDMA*",
"Toggle Signal Inversion",
"Privacy Key Entry", //spacer
"Privacy Key Entry",
"Reset Call History",
"Enable Payloads to Console",
"Disable Payloads to Console",
"Toggle Payloads to Console",
" ", //spacer
"Input & Output Options",
"LRRP Data to File",
"Exit DSD-FME",
@ -802,16 +802,15 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
{
state->payload_keyid = 0;
state->payload_keyidR = 0;
// state->K = 0;
// state->H = 0;
short int option = 0;
entry_win = newwin(9, WIDTH+6, starty+10, startx+10);
entry_win = newwin(10, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, "Key Type Selection");
mvwprintw(entry_win, 3, 2, " ");
mvwprintw(entry_win, 4, 2, "1 - DMRA Privacy ");
mvwprintw(entry_win, 5, 2, "2 - 'Tera Privacy ");
mvwprintw(entry_win, 6, 3, " ");
mvwprintw(entry_win, 4, 2, "1 - DMRA Privacy ");
mvwprintw(entry_win, 5, 2, "2 - **tera Privacy ");
mvwprintw(entry_win, 6, 2, "3 - NXDN Scrambler ");
mvwprintw(entry_win, 7, 3, " ");
echo();
refresh();
wscanw(entry_win, "%d", &option);
@ -820,6 +819,7 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
opts->dmr_mute_encR = 0;
if (option == 1)
{
state->K = 0;
entry_win = newwin(6, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, "DMRA Privacy Key Number (DEC):");
@ -835,21 +835,71 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
}
if (option == 2)
{
entry_win = newwin(6, WIDTH+6, starty+10, startx+10);
state->K1 = 0;
state->K2 = 0;
state->K3 = 0;
state->K4 = 0;
state->H = 0;
entry_win = newwin(7, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, "'Tera 10 Key Value (HEX):");
mvwprintw(entry_win, 3, 3, " ");
mvwprintw(entry_win, 2, 2, " Enter **tera BP Key Value (HEX) ");
mvwprintw(entry_win, 3, 2, " 10 Char or First 16 for 32/64");
mvwprintw(entry_win, 4, 3, " ");
echo();
refresh();
wscanw(entry_win, "%llX", &state->H);
noecho();
if (state->H > 0xFFFFFFFFFF)
state->K1 = state->H;
entry_win = newwin(7, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, " Enter **tera BP Key Value 2 (HEX) ");
mvwprintw(entry_win, 3, 2, " Second 16 Chars or Zero");
mvwprintw(entry_win, 4, 3, " ");
echo();
refresh();
wscanw(entry_win, "%llX", &state->K2);
noecho();
entry_win = newwin(7, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, " Enter **tera BP Key Value 3 (HEX) ");
mvwprintw(entry_win, 3, 2, " Third 16 Chars or Zero");
mvwprintw(entry_win, 4, 3, " ");
echo();
refresh();
wscanw(entry_win, "%llX", &state->K3);
noecho();
entry_win = newwin(7, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, " Enter **tera BP Key Value 4 (HEX) ");
mvwprintw(entry_win, 3, 2, " Fourth 16 Chars or Zero");
mvwprintw(entry_win, 4, 3, " ");
echo();
refresh();
wscanw(entry_win, "%llX", &state->K4);
noecho();
}
if (option == 3)
{
state->R = 0;
entry_win = newwin(6, WIDTH+6, starty+10, startx+10);
box (entry_win, 0, 0);
mvwprintw(entry_win, 2, 2, "NXDN Scrambler Key Value (DEC):");
mvwprintw(entry_win, 3, 3, " ");
echo();
refresh();
wscanw(entry_win, "%lld", &state->R);
noecho();
if (state->K > 0x7FFF)
{
state->H = 0xFFFFFFFFFF;
state->K = 0x7FFF;
}
}
if (state->K == 0 && state->H == 0)
if (state->K == 0 && state->K1 == 0)
{
opts->dmr_mute_encL = 1;
opts->dmr_mute_encR = 1;
@ -1156,15 +1206,22 @@ void ncursesMenu (dsd_opts * opts, dsd_state * state)
}
}
if (choice == 15) //turn on payload printing
if (choice == 15) //toggle payload printing
{
opts->payload = 1;
fprintf(stderr, "Payload on\n");
if (opts->payload == 0)
{
opts->payload = 1;
fprintf(stderr, "Payload on\n");
}
else
{
opts->payload = 0;
fprintf(stderr, "Payload Off\n");
}
}
if (choice == 16) //turn off payload printing
if (choice == 16)
{
opts->payload = 0;
fprintf(stderr, "Payload Off\n");
}
if (choice == 18)
{
@ -1746,6 +1803,14 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
printw ("Scrambler ");
attroff(COLOR_PAIR(2));
attron(COLOR_PAIR(3));
if (state->R != 0)
{
//printw ("\n| ");
attron(COLOR_PAIR(1));
printw ("KEY VALUE: [%05lld] ", state->R );
printw ("SEED: [%04llX]", state->payload_miN);
attron(COLOR_PAIR(3));
}
}
if (state->nxdn_cipher_type == 0x2 && state->carrier == 1)
{
@ -1855,7 +1920,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
if(state->dmrburstL == 16 && state->payload_algid == 0 && state->H > 0 && state->dmr_fid == 0x68 && ((state->dmr_so & 0xCF) == 0x40) )
{
attron(COLOR_PAIR(1));
printw ("**'Tera Pr Key [%010llX] ", state->H);
printw ("**tera Pr Key [%010llX] ", state->H);
attroff(COLOR_PAIR(1));
attron(COLOR_PAIR(3));
}
@ -1963,7 +2028,7 @@ ncursesPrinter (dsd_opts * opts, dsd_state * state)
if(state->dmrburstR == 16 && state->payload_algidR == 0 && state->H > 0 && ((state->dmr_soR & 0xCF) == 0x40) && state->dmr_fidR == 0x68)
{
attron(COLOR_PAIR(1));
printw ("**'Tera Pr Key [%010llX] ", state->H);
printw ("**tera Pr Key [%010llX] ", state->H);
attroff(COLOR_PAIR(1));
attron(COLOR_PAIR(3));
}

View File

@ -775,10 +775,17 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message)
{
fprintf(stderr, "Key ID %u - ", KeyID & 0xFF);
//fprintf (stderr, "%s", KNRM);
fprintf (stderr, "%s", KNRM);
//state->nxdn_key = (KeyID & 0xFF);
}
if (state->nxdn_cipher_type == 0x01 && state->R > 0) //scrambler
{
fprintf (stderr, "%s", KYEL);
fprintf(stderr, "Value: %05lld", state->R);
fprintf (stderr, "%s", KNRM);
}
if(state->NxdnElementsContent.VCallCrcIsGood)
{
if ( (SourceUnitID & 0xFFFF) > 0 )
@ -790,15 +797,6 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message)
}
//fprintf(stderr, "(CRC OK) ");
}
//set enc bit here so we can tell playSynthesizedVoice whether or not to play enc traffic
if (state->nxdn_cipher_type != 0)
{
state->dmr_encL = 1;
}
if (state->nxdn_cipher_type == 0)
{
state->dmr_encL = 0;
}
//fprintf(stderr, " (OK) - ");
else
{
@ -806,6 +804,15 @@ void NXDN_decode_VCALL(dsd_opts * opts, dsd_state * state, uint8_t * Message)
fprintf(stderr, "(CRC ERR) ");
fprintf (stderr, "%s", KNRM);
}
//set enc bit here so we can tell playSynthesizedVoice whether or not to play enc traffic
if (state->nxdn_cipher_type != 0)
{
state->dmr_encL = 1;
}
if (state->nxdn_cipher_type == 0 || state->R != 0)
{
state->dmr_encL = 0;
}
//fprintf(stderr, "\nFull Message = %016llX ", FullMessage);
} /* End NXDN_decode_VCALL() */
@ -1662,7 +1669,24 @@ void ProcessNxdnRTCHFrame(dsd_opts * opts, dsd_state * state, uint8_t Inverted)
}
} /* End ProcessNxdnRTCHFrame() */
void LFSRN(char * BufferIn, char * BufferOut, dsd_state * state)
{
int i;
int lfsr;
int pN[49] = {0};
int bit = 0;
lfsr = state->payload_miN & 0x7FFF;
for (i = 0; i < 49; i++)
{
pN[i] = lfsr & 0x1;
bit = ( (lfsr >> 1) ^ (lfsr >> 0) ) & 1;
lfsr = ( (lfsr >> 1 ) | (bit << 14) );
BufferOut[i] = BufferIn[i] ^ pN[i];
}
state->payload_miN = lfsr & 0x7FFF;
}
/* End of file */

View File

@ -159,6 +159,10 @@ void processNXDNVoice (dsd_opts * opts, dsd_state * state)
if(PartOfFrame == 3)
{
/* Reset all CRCs of the SACCH */
if (state->R > 0 && state->nxdn_cipher_type == 0x1)
{
state->payload_miN = state->R;
}
for(i = 0; i < 4; i++) state->NxdnSacchRawPart[i].CrcIsGood = 0;
}