1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-04-09 12:16:46 +00:00

Comments and questions | verify_dsm_pkr() structure

This commit is contained in:
cesaaargm 2023-12-03 15:50:16 +01:00
parent ab81fdaca9
commit ba357ebd9c
3 changed files with 45 additions and 19 deletions

View File

@ -110,9 +110,9 @@ void osnma_msg_receiver::msg_handler_osnma(const pmt::pmt_t& msg)
}
// Send the resulting decoded NMA data (if available) to PVT
if (d_new_data == true)
if (d_new_data == true) // TODO where is it set to true?
{
auto osnma_data_ptr = std::make_shared<OSNMA_data>(d_osnma_data);
auto osnma_data_ptr = std::make_shared<OSNMA_data>(d_osnma_data); // C: why create new object and pass it empty to Pvt?
this->message_port_pub(pmt::mp("OSNMA_to_PVT"), pmt::make_any(osnma_data_ptr));
d_new_data = false;
// d_osnma_data = OSNMA_data();
@ -302,12 +302,12 @@ void osnma_msg_receiver::process_dsm_message(const std::vector<uint8_t>& dsm_msg
const uint16_t size_m = 13 + l_lk_bytes;
std::vector<uint8_t> MSG;
MSG.reserve(size_m + l_ds_bytes + 1);
MSG.push_back(osnma_msg->hkroot[0]);
MSG.push_back(osnma_msg->hkroot[0]); // C: NMA header
for (uint16_t i = 1; i < size_m; i++)
{
MSG.push_back(dsm_msg[i]);
}
std::vector<uint8_t> message = MSG;
std::vector<uint8_t> message = MSG; // C: MSG == M || DS from ICD. Eq. 7
for (uint16_t k = 0; k < l_ds_bytes; k++)
{
MSG.push_back(d_osnma_data.d_dsm_kroot_message.ds[k]);
@ -344,16 +344,20 @@ void osnma_msg_receiver::process_dsm_message(const std::vector<uint8_t>& dsm_msg
<< ", TOW=" << static_cast<uint32_t>(d_osnma_data.d_dsm_kroot_message.towh_k) * 3600;
if (authenticated)
{
std::cout << " authenticated" << std::endl;
std::cout << " authenticated" << std::endl; // C: proceed with Tesla chain key verification.
}
else
{
std::cout << " validated" << std::endl;
std::cout << " validated" << std::endl; // C: Kroot not verified => retrieve it again
}
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 and Public Key Status is " << d_dsm_reader->get_cpks_status(d_osnma_data.d_nma_header.cpks) << std::endl;
}
else
{
std::cout << "Galileo OSNMA: Error computing padding bits." << std::endl;
}
}
}
else if (d_osnma_data.d_dsm_header.dsm_id >= 12 && d_osnma_data.d_dsm_header.dsm_id < 16)
@ -411,6 +415,9 @@ void osnma_msg_receiver::process_dsm_message(const std::vector<uint8_t>& dsm_msg
<< ", 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
<< " received" << std::endl;
// C: NPK verification against Merkle tree root.
std::vector<uint8_t> m_0;
d_public_key_verified = verify_dsm_pkr(d_osnma_data.d_dsm_pkr_message, m_0);
}
}
else
@ -434,7 +441,7 @@ void osnma_msg_receiver::read_mack_block(const std::shared_ptr<OSNMA_msg>& osnma
d_mack_message[index + 3] = static_cast<uint8_t>(value & 0x000000FF);
index = index + 4;
}
if (d_osnma_data.d_dsm_kroot_message.ts != 0)
if (d_osnma_data.d_dsm_kroot_message.ts != 0) // C: 4 ts < ts < 10
{
read_mack_header();
read_mack_body();
@ -444,7 +451,7 @@ void osnma_msg_receiver::read_mack_block(const std::shared_ptr<OSNMA_msg>& osnma
void osnma_msg_receiver::read_mack_header()
{
{ // C: still to review computations.
uint8_t lt_bits = 0;
const auto it = OSNMA_TABLE_11.find(d_osnma_data.d_dsm_kroot_message.ts);
if (it != OSNMA_TABLE_11.cend())
@ -453,7 +460,7 @@ void osnma_msg_receiver::read_mack_header()
}
if (lt_bits == 0)
{
return;
return; // C: TODO if Tag length is 0, what is the action? no verification possible of NavData for sure.
}
uint16_t macseq = 0;
uint8_t cop = 0;
@ -526,8 +533,8 @@ void osnma_msg_receiver::read_mack_body()
{
return;
}
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);
uint16_t nt = std::floor((480.0 - float(lk_bits)) / (float(lt_bits) + 16.0)); // C: compute number of tags
d_osnma_data.d_mack_message.tag_and_info = std::vector<MACK_tag_and_info>(nt - 1); // C: nt - 1?
for (uint16_t k = 0; k < (nt - 1); k++)
{
uint64_t tag = 0;
@ -680,11 +687,14 @@ void osnma_msg_receiver::process_mack_message(const std::shared_ptr<OSNMA_msg>&
{
d_old_mack_message.push_back(d_osnma_data.d_mack_message);
// MACSEQ validation
// MACSEQ validation - case no FLX Tags
uint32_t GST_SF = osnma_msg->TOW_sf0;
// C: TODO check ADKD-MACLT for match, also identify which tags are FLX
// C: TODO if Tag_x FLX => MACSEQ, otherwise ___ ?
// Are there flexible tags?
std::vector<uint8_t> m(5);
std::vector<uint8_t> m(5); // C: ICD - Eq. 23
m[0] = static_cast<uint8_t>(osnma_msg->PRN); // PRN_A
m[1] = ((GST_SF & 0xF000) >> 24);
m[2] = ((GST_SF & 0x0F00) >> 16);
@ -696,11 +706,11 @@ void osnma_msg_receiver::process_mack_message(const std::shared_ptr<OSNMA_msg>&
// otherwise pick d_old_mack_message.back()
applicable_key = d_old_mack_message.back().key;
std::vector<uint8_t> mac;
if (d_osnma_data.d_dsm_kroot_message.mf == 0)
if (d_osnma_data.d_dsm_kroot_message.mf == 0) // C: HMAC-SHA-256
{
mac = d_crypto->computeHMAC_SHA_256(applicable_key, m);
}
else if (d_osnma_data.d_dsm_kroot_message.mf == 1)
else if (d_osnma_data.d_dsm_kroot_message.mf == 1) // C: CMAC-AES
{
mac = d_crypto->computeCMAC_AES(applicable_key, m);
}
@ -719,4 +729,16 @@ void osnma_msg_receiver::process_mack_message(const std::shared_ptr<OSNMA_msg>&
<< osnma_msg->TOW_sf0 << ". Tags added: "
<< num_tags_added << std::endl;
}
}
// C: TODO - for each tag in tag_and_info[] && until l_t_verified <= L_t_min
// C: TODO - tag = trunc(l_t, mac(applicable_key,m))
// C: TODO - where m = (PRNd || PRNa || GSTsf || CTR || NMAS || NavData || P)
}
bool osnma_msg_receiver::verify_dsm_pkr(DSM_PKR_message message, std::vector<uint8_t> m0)
{
// TODO concatenate message
// TODO create function for recursively apply hash
return false;
}

View File

@ -65,6 +65,7 @@ private:
void read_dsm_header(uint8_t dsm_header);
void read_dsm_block(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);
bool verify_dsm_pkr(DSM_PKR_message message, std::vector<uint8_t> input_message);
void read_mack_block(const std::shared_ptr<OSNMA_msg>& osnma_msg);
void read_mack_header();
void read_mack_body();
@ -74,13 +75,16 @@ private:
std::unique_ptr<OSNMA_DSM_Reader> d_dsm_reader;
std::unique_ptr<Gnss_Crypto> d_crypto;
std::array<std::array<uint8_t, 256>, 16> d_dsm_message{};
std::array<std::array<uint8_t, 256>, 16> d_dsm_message{}; // C: each dsm[0-15] has 2048 bits
std::array<std::array<uint8_t, 16>, 16> d_dsm_id_received{};
std::array<uint16_t, 16> d_number_of_blocks{};
std::array<uint8_t, 60> d_mack_message{};
std::array<uint8_t, 60> d_mack_message{}; // C: 480 b
OSNMA_data d_osnma_data{};
bool d_new_data{false};
bool d_public_key_verified{false};
bool d_kroot_verified{false};
};

View File

@ -68,7 +68,7 @@ class MACK_tag_and_info
{
public:
MACK_tag_and_info() = default;
uint64_t tag;
uint64_t tag; // C: 20-40 bits
MACK_tag_info tag_info;
};