1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-10-30 22:56:22 +00:00

Read MACK key

This commit is contained in:
Carles Fernandez 2023-06-13 13:36:30 +02:00
parent 7ca6c42f7b
commit 9479f14552
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
3 changed files with 74 additions and 22 deletions

View File

@ -305,7 +305,7 @@ void osnma_msg_receiver::process_dsm_message(const std::vector<uint8_t>& dsm_msg
{ {
MSG.push_back(dsm_msg[i]); MSG.push_back(dsm_msg[i]);
} }
std::vector<uint8_t> message = MSG;
for (uint16_t k = 0; k < l_ds_bytes; k++) for (uint16_t k = 0; k < l_ds_bytes; k++)
{ {
MSG.push_back(d_osnma_data.d_dsm_kroot_message.ds[k]); MSG.push_back(d_osnma_data.d_dsm_kroot_message.ds[k]);
@ -334,12 +334,20 @@ void osnma_msg_receiver::process_dsm_message(const std::vector<uint8_t>& dsm_msg
// check DS signature // check DS signature
if (d_osnma_data.d_dsm_kroot_message.p_dk == p_dk_truncated) if (d_osnma_data.d_dsm_kroot_message.p_dk == p_dk_truncated)
{ {
bool authenticated = d_crypto->verify_signature(message, d_osnma_data.d_dsm_kroot_message.ds);
LOG(WARNING) << "OSNMA: DSM-KROOT message received ok."; LOG(WARNING) << "OSNMA: DSM-KROOT message received ok.";
std::cout << "Galileo OSNMA: KROOT with CID=" << static_cast<uint32_t>(d_osnma_data.d_nma_header.cid) std::cout << "Galileo OSNMA: KROOT with CID=" << static_cast<uint32_t>(d_osnma_data.d_nma_header.cid)
<< ", PKID=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.pkid) << ", PKID=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.pkid)
<< ", WN=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.wn_k) << ", WN=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.wn_k)
<< ", TOW=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.towh_k) * 3600 << ", TOW=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.towh_k) * 3600;
<< " validated" << std::endl; if (authenticated)
{
std::cout << " authenticated" << std::endl;
}
else
{
std::cout << " validated" << std::endl;
}
std::cout << "Galileo OSNMA: NMA Status is " << d_dsm_reader->get_nmas_status(d_osnma_data.d_nma_header.nmas) << ", " std::cout << "Galileo OSNMA: NMA Status is " << d_dsm_reader->get_nmas_status(d_osnma_data.d_nma_header.nmas) << ", "
<< "Chain in force is " << static_cast<uint32_t>(d_osnma_data.d_nma_header.cid) << ", " << "Chain in force is " << static_cast<uint32_t>(d_osnma_data.d_nma_header.cid) << ", "
<< "Chain and Public Key Status is " << d_dsm_reader->get_cpks_status(d_osnma_data.d_nma_header.cpks) << std::endl; << "Chain and Public Key Status is " << d_dsm_reader->get_cpks_status(d_osnma_data.d_nma_header.cpks) << std::endl;
@ -428,9 +436,8 @@ void osnma_msg_receiver::read_mack_block(const std::shared_ptr<OSNMA_msg>& osnma
if (d_osnma_data.d_dsm_kroot_message.ts != 0) if (d_osnma_data.d_dsm_kroot_message.ts != 0)
{ {
read_mack_header(); read_mack_header();
read_mack_info_and_tags(); read_mack_body();
read_mack_key(); d_old_mack_message = d_osnma_data.d_mack_message;
read_mack_padding();
} }
} }
@ -496,7 +503,7 @@ void osnma_msg_receiver::read_mack_header()
} }
void osnma_msg_receiver::read_mack_info_and_tags() void osnma_msg_receiver::read_mack_body()
{ {
uint8_t lt_bits = 0; uint8_t lt_bits = 0;
const auto it = OSNMA_TABLE_11.find(d_osnma_data.d_dsm_kroot_message.ts); const auto it = OSNMA_TABLE_11.find(d_osnma_data.d_dsm_kroot_message.ts);
@ -518,7 +525,7 @@ void osnma_msg_receiver::read_mack_info_and_tags()
{ {
return; return;
} }
uint16_t nt = std::floor((480.0 + float(lk_bits)) / (float(lt_bits) + 16.0)); uint16_t nt = std::floor((480.0 - float(lk_bits)) / (float(lt_bits) + 16.0));
d_osnma_data.d_mack_message.tag_and_info = std::vector<MACK_tag_and_info>(nt - 1); d_osnma_data.d_mack_message.tag_and_info = std::vector<MACK_tag_and_info>(nt - 1);
for (uint16_t k = 0; k < (nt - 1); k++) for (uint16_t k = 0; k < (nt - 1); k++)
{ {
@ -537,6 +544,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += d_mack_message[6 + step]; PRN_d += d_mack_message[6 + step];
ADKD += ((d_mack_message[7 + step] & 0xF0) >> 4); ADKD += ((d_mack_message[7 + step] & 0xF0) >> 4);
cop += (d_mack_message[7 + step] & 0x0F); cop += (d_mack_message[7 + step] & 0x0F);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = d_mack_message[8 + step + j];
}
}
} }
else else
{ {
@ -547,6 +562,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += (d_mack_message[6 + step] & 0xF0) >> 4; PRN_d += (d_mack_message[6 + step] & 0xF0) >> 4;
ADKD += (d_mack_message[6 + step] & 0x0F); ADKD += (d_mack_message[6 + step] & 0x0F);
cop += (d_mack_message[7 + step] & 0xF0) >> 4; cop += (d_mack_message[7 + step] & 0xF0) >> 4;
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = ((d_mack_message[7 + step + j] & 0x0F) << 4) + ((d_mack_message[8 + step + j] & 0xF0) >> 4);
}
}
} }
} }
else if (lt_bits == 24) else if (lt_bits == 24)
@ -557,6 +580,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += d_mack_message[8 + k * 5]; PRN_d += d_mack_message[8 + k * 5];
ADKD += ((d_mack_message[9 + k * 5] & 0xF0) >> 4); ADKD += ((d_mack_message[9 + k * 5] & 0xF0) >> 4);
cop += (d_mack_message[9 + k * 5] & 0x0F); cop += (d_mack_message[9 + k * 5] & 0x0F);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = d_mack_message[10 + k * 5 + j];
}
}
} }
else if (lt_bits == 28) else if (lt_bits == 28)
{ {
@ -570,6 +601,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += d_mack_message[9 + step]; PRN_d += d_mack_message[9 + step];
ADKD += ((d_mack_message[10 + step] & 0xF0) >> 4); ADKD += ((d_mack_message[10 + step] & 0xF0) >> 4);
cop += (d_mack_message[10 + step] & 0x0F); cop += (d_mack_message[10 + step] & 0x0F);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = d_mack_message[11 + step + j];
}
}
} }
else else
{ {
@ -581,6 +620,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += ((d_mack_message[9 + step] & 0xF0) >> 4); PRN_d += ((d_mack_message[9 + step] & 0xF0) >> 4);
ADKD += (d_mack_message[9 + step] & 0x0F); ADKD += (d_mack_message[9 + step] & 0x0F);
cop += ((d_mack_message[10 + step] & 0xF0) >> 4); cop += ((d_mack_message[10 + step] & 0xF0) >> 4);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = ((d_mack_message[10 + step + j] & 0x0F) << 4) + ((d_mack_message[11 + step + j] & 0xF0) >> 4);
}
}
} }
} }
else if (lt_bits == 32) else if (lt_bits == 32)
@ -592,6 +639,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += d_mack_message[10 + k * 6]; PRN_d += d_mack_message[10 + k * 6];
ADKD += ((d_mack_message[11 + k * 6] & 0xF0) >> 4); ADKD += ((d_mack_message[11 + k * 6] & 0xF0) >> 4);
cop += (d_mack_message[11 + k * 6] & 0x0F); cop += (d_mack_message[11 + k * 6] & 0x0F);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = d_mack_message[12 + k * 6 + j];
}
}
} }
else if (lt_bits == 40) else if (lt_bits == 40)
{ {
@ -603,6 +658,14 @@ void osnma_msg_receiver::read_mack_info_and_tags()
PRN_d += d_mack_message[12 + k * 7]; PRN_d += d_mack_message[12 + k * 7];
ADKD += ((d_mack_message[13 + k * 7] & 0xF0) >> 4); ADKD += ((d_mack_message[13 + k * 7] & 0xF0) >> 4);
cop += (d_mack_message[13 + k * 7] & 0x0F); cop += (d_mack_message[13 + k * 7] & 0x0F);
if (k == (nt - 2))
{
d_osnma_data.d_mack_message.key = std::vector<uint8_t>(d_osnma_data.d_dsm_kroot_message.kroot.size());
for (size_t j = 0; j < d_osnma_data.d_dsm_kroot_message.kroot.size(); j++)
{
d_osnma_data.d_mack_message.key[j] = d_mack_message[14 + k * 7 + j];
}
}
} }
d_osnma_data.d_mack_message.tag_and_info[k].tag = tag; d_osnma_data.d_mack_message.tag_and_info[k].tag = tag;
d_osnma_data.d_mack_message.tag_and_info[k].tag_info.PRN_d = PRN_d; d_osnma_data.d_mack_message.tag_and_info[k].tag_info.PRN_d = PRN_d;
@ -610,13 +673,3 @@ void osnma_msg_receiver::read_mack_info_and_tags()
d_osnma_data.d_mack_message.tag_and_info[k].tag_info.cop = cop; d_osnma_data.d_mack_message.tag_and_info[k].tag_info.cop = cop;
} }
} }
void osnma_msg_receiver::read_mack_key()
{
}
void osnma_msg_receiver::read_mack_padding()
{
}

View File

@ -67,9 +67,9 @@ private:
void process_dsm_message(const std::vector<uint8_t>& dsm_msg, const std::shared_ptr<OSNMA_msg>& osnma_msg); void process_dsm_message(const std::vector<uint8_t>& dsm_msg, const std::shared_ptr<OSNMA_msg>& osnma_msg);
void read_mack_header(); void read_mack_header();
void read_mack_info_and_tags(); void read_mack_body();
void read_mack_key();
void read_mack_padding(); MACK_message d_old_mack_message;
std::unique_ptr<OSNMA_DSM_Reader> d_dsm_reader; std::unique_ptr<OSNMA_DSM_Reader> d_dsm_reader;
std::unique_ptr<Gnss_Crypto> d_crypto; std::unique_ptr<Gnss_Crypto> d_crypto;

View File

@ -116,7 +116,6 @@ public:
MACK_header header; MACK_header header;
std::vector<MACK_tag_and_info> tag_and_info; std::vector<MACK_tag_and_info> tag_and_info;
std::vector<uint8_t> key; std::vector<uint8_t> key;
std::vector<uint8_t> padding;
}; };
/*! /*!