mirror of
https://github.com/lwvmobile/dsd-fme.git
synced 2026-11-15 02:07:24 -05:00
M17 - Add Nonce to Encoder;
This commit is contained in:
102
src/m17.c
102
src/m17.c
@@ -880,8 +880,42 @@ const int8_t symbol_map[4] = {+1, +3, -1, -3};
|
|||||||
void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//TODO: Standard IP Framing
|
||||||
|
uint8_t magic[4] = {0x4D, 0x31, 0x37, 0x20}; UNUSED(magic);
|
||||||
|
uint8_t sid[2]; memset (sid, 0, sizeof(sid)); UNUSED(sid);
|
||||||
|
|
||||||
//TODO: Finish creating audio of the encoded signal
|
//TODO: Finish creating audio of the encoded signal
|
||||||
|
|
||||||
|
//NONCE
|
||||||
|
time_t ts = time(NULL); //timestamp since epoch / "Unix Time"
|
||||||
|
srand(ts); //randomizer seed based on timestamp
|
||||||
|
|
||||||
|
//Stream ID value
|
||||||
|
sid[0] = rand() & 0xFF;
|
||||||
|
sid[1] = rand() & 0xFF;
|
||||||
|
|
||||||
|
//initialize a nonce (if ENC is required in future)
|
||||||
|
uint8_t nonce[14]; memset (nonce, 0, sizeof(nonce));
|
||||||
|
//32bit LSB of the timestamp
|
||||||
|
nonce[0] = (ts >> 24) & 0xFF;
|
||||||
|
nonce[1] = (ts >> 16) & 0xFF;
|
||||||
|
nonce[2] = (ts >> 8) & 0xFF;
|
||||||
|
nonce[3] = (ts >> 0) & 0xFF;
|
||||||
|
//64-bit of rnd data
|
||||||
|
nonce[4] = rand() & 0xFF;
|
||||||
|
nonce[5] = rand() & 0xFF;
|
||||||
|
nonce[6] = rand() & 0xFF;
|
||||||
|
nonce[7] = rand() & 0xFF;
|
||||||
|
nonce[8] = rand() & 0xFF;
|
||||||
|
nonce[9] = rand() & 0xFF;
|
||||||
|
nonce[10] = rand() & 0xFF;
|
||||||
|
nonce[11] = rand() & 0xFF;
|
||||||
|
//The last two octets are the CTR_HIGH value (upper 16 bits of the frame number),
|
||||||
|
//but you would need to talk non-stop for over 20 minutes to roll it, so just using rnd
|
||||||
|
//also, using zeroes seems like it may be a security issue, so using rnd as a base
|
||||||
|
nonce[12] = rand() & 0xFF;
|
||||||
|
nonce[13] = rand() & 0xFF;
|
||||||
|
|
||||||
//Enable frame, TX and Ncurses Printer
|
//Enable frame, TX and Ncurses Printer
|
||||||
opts->frame_m17 = 1;
|
opts->frame_m17 = 1;
|
||||||
state->m17encoder_tx = 1;
|
state->m17encoder_tx = 1;
|
||||||
@@ -903,6 +937,11 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
short sample = 0; //individual audio sample from source
|
short sample = 0; //individual audio sample from source
|
||||||
size_t nsam = 160; //number of samples to be read in (default is for codec2 3200 bps)
|
size_t nsam = 160; //number of samples to be read in (default is for codec2 3200 bps)
|
||||||
|
|
||||||
|
//debug print nonce
|
||||||
|
// fprintf (stderr, " nonce:");
|
||||||
|
// for (i = 0; i < 14; i++)
|
||||||
|
// fprintf (stderr, " %02X", nonce[i]);
|
||||||
|
|
||||||
#ifdef USE_CODEC2
|
#ifdef USE_CODEC2
|
||||||
nsam = codec2_samples_per_frame(state->codec2_3200);
|
nsam = codec2_samples_per_frame(state->codec2_3200);
|
||||||
#endif
|
#endif
|
||||||
@@ -935,8 +974,11 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
lsf_fi = (lsf_dt << 1) + (lsf_et << 3) + (lsf_es << 5) + (lsf_cn << 7) + (lsf_rs << 11);
|
lsf_fi = (lsf_dt << 1) + (lsf_et << 3) + (lsf_es << 5) + (lsf_cn << 7) + (lsf_rs << 11);
|
||||||
for (i = 0; i < 16; i++) m17_lsf[96+i] = (lsf_fi >> 15-i) & 1;
|
for (i = 0; i < 16; i++) m17_lsf[96+i] = (lsf_fi >> 15-i) & 1;
|
||||||
|
|
||||||
//TODO: Only encode CSD if not a reserved value
|
|
||||||
//Convert base40 CSD to numerical values (lifted from libM17)
|
//Convert base40 CSD to numerical values (lifted from libM17)
|
||||||
|
|
||||||
|
//Only if not already set as numerical value
|
||||||
|
if (dst == 0)
|
||||||
|
{
|
||||||
for(i = strlen((const char*)d40)-1; i >= 0; i--)
|
for(i = strlen((const char*)d40)-1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
for(j = 0; j < 40; j++)
|
for(j = 0; j < 40; j++)
|
||||||
@@ -945,10 +987,13 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
{
|
{
|
||||||
dst=dst*40+j;
|
dst=dst*40+j;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (src == 0)
|
||||||
|
{
|
||||||
for(i = strlen((const char*)s40)-1; i >= 0; i--)
|
for(i = strlen((const char*)s40)-1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
for(j = 0; j < 40; j++)
|
for(j = 0; j < 40; j++)
|
||||||
@@ -957,6 +1002,7 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
{
|
{
|
||||||
src=src*40+j;
|
src=src*40+j;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -966,6 +1012,20 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
for (i = 0; i < 48; i++) m17_lsf[i] = (dst >> 47ULL-(unsigned long long int)i) & 1;
|
for (i = 0; i < 48; i++) m17_lsf[i] = (dst >> 47ULL-(unsigned long long int)i) & 1;
|
||||||
for (i = 0; i < 48; i++) m17_lsf[i+48] = (src >> 47ULL-(unsigned long long int)i) & 1;
|
for (i = 0; i < 48; i++) m17_lsf[i+48] = (src >> 47ULL-(unsigned long long int)i) & 1;
|
||||||
|
|
||||||
|
//load the nonce from packed bytes to a bitwise iv array
|
||||||
|
uint8_t iv[112]; memset(iv, 0, sizeof(iv));
|
||||||
|
k = 0;
|
||||||
|
for (j = 0; j < 14; j++)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
iv[k++] = (nonce[j] >> 7-i)&1;
|
||||||
|
}
|
||||||
|
//if AES enc employed, insert the iv into LSF
|
||||||
|
if (lsf_et == 2)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 112; i++) m17_lsf[i+112] = iv[i];
|
||||||
|
}
|
||||||
|
|
||||||
//pack and compute the CRC16 for LSF
|
//pack and compute the CRC16 for LSF
|
||||||
uint16_t crc_cmp = 0;
|
uint16_t crc_cmp = 0;
|
||||||
uint8_t lsf_packed[30];
|
uint8_t lsf_packed[30];
|
||||||
@@ -1283,13 +1343,25 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
|
|
||||||
//TODO: symbols to audio
|
//TODO: symbols to audio
|
||||||
|
|
||||||
|
//TODO: Send via Standard IP Framing
|
||||||
|
|
||||||
//increment lich_cnt, reset on 6
|
//increment lich_cnt, reset on 6
|
||||||
lich_cnt++;
|
lich_cnt++;
|
||||||
if (lich_cnt == 6) lich_cnt = 0;
|
if (lich_cnt == 6) lich_cnt = 0;
|
||||||
|
|
||||||
//increment frame sequency number, trunc to maximum value
|
//increment frame sequency number, trunc to maximum value, roll nonce if needed
|
||||||
fsn++;
|
fsn++;
|
||||||
fsn &= 0x7FFF;
|
if (fsn > 0x7FFF)
|
||||||
|
{
|
||||||
|
fsn = 0;
|
||||||
|
nonce[13]++;
|
||||||
|
if (nonce[13] > 0xFF)
|
||||||
|
{
|
||||||
|
nonce[13] = 0; //roll over to zero of exceeds 0xFF
|
||||||
|
nonce[12]++;
|
||||||
|
nonce[12] &= 0xFF; //trunc for potential rollover (doesn't spill over)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} //end if (state->m17encoder_tx)
|
} //end if (state->m17encoder_tx)
|
||||||
|
|
||||||
@@ -1299,6 +1371,30 @@ void encodeM17STR(dsd_opts * opts, dsd_state * state)
|
|||||||
fsn = 0;
|
fsn = 0;
|
||||||
state->carrier = 0;
|
state->carrier = 0;
|
||||||
state->synctype = -1;
|
state->synctype = -1;
|
||||||
|
|
||||||
|
//update randomizer seed and SID
|
||||||
|
srand(ts); //randomizer seed based on time
|
||||||
|
|
||||||
|
//update Stream ID
|
||||||
|
sid[0] = rand() & 0xFF;
|
||||||
|
sid[1] = rand() & 0xFF;
|
||||||
|
|
||||||
|
//update nonce
|
||||||
|
nonce[0] = (ts >> 24) & 0xFF;
|
||||||
|
nonce[1] = (ts >> 16) & 0xFF;
|
||||||
|
nonce[2] = (ts >> 8) & 0xFF;
|
||||||
|
nonce[3] = (ts >> 0) & 0xFF;
|
||||||
|
nonce[4] = rand() & 0xFF;
|
||||||
|
nonce[5] = rand() & 0xFF;
|
||||||
|
nonce[6] = rand() & 0xFF;
|
||||||
|
nonce[7] = rand() & 0xFF;
|
||||||
|
nonce[8] = rand() & 0xFF;
|
||||||
|
nonce[9] = rand() & 0xFF;
|
||||||
|
nonce[10] = rand() & 0xFF;
|
||||||
|
nonce[11] = rand() & 0xFF;
|
||||||
|
nonce[12] = rand() & 0xFF;
|
||||||
|
nonce[13] = rand() & 0xFF;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//refresh ncurses printer, if enabled
|
//refresh ncurses printer, if enabled
|
||||||
|
|||||||
Reference in New Issue
Block a user