diff --git a/src/core/libs/osnma_msg_receiver.cc b/src/core/libs/osnma_msg_receiver.cc index 39ac24843..8f157414f 100644 --- a/src/core/libs/osnma_msg_receiver.cc +++ b/src/core/libs/osnma_msg_receiver.cc @@ -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(d_osnma_data); + auto osnma_data_ptr = std::make_shared(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& dsm_msg const uint16_t size_m = 13 + l_lk_bytes; std::vector 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 message = MSG; + std::vector 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& dsm_msg << ", TOW=" << static_cast(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(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& dsm_msg << ", WN=" << static_cast(d_osnma_data.d_dsm_kroot_message.wn_k) << ", TOW=" << static_cast(d_osnma_data.d_dsm_kroot_message.towh_k) * 3600 << " received" << std::endl; + // C: NPK verification against Merkle tree root. + std::vector 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 d_mack_message[index + 3] = static_cast(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 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(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(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& { 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 m(5); + + std::vector m(5); // C: ICD - Eq. 23 m[0] = static_cast(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& // otherwise pick d_old_mack_message.back() applicable_key = d_old_mack_message.back().key; std::vector 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->TOW_sf0 << ". Tags added: " << num_tags_added << std::endl; } -} \ No newline at end of file + + // 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 m0) +{ + // TODO concatenate message + // TODO create function for recursively apply hash + + return false; +} diff --git a/src/core/libs/osnma_msg_receiver.h b/src/core/libs/osnma_msg_receiver.h index b07f4177b..89522bc69 100644 --- a/src/core/libs/osnma_msg_receiver.h +++ b/src/core/libs/osnma_msg_receiver.h @@ -65,6 +65,7 @@ private: void read_dsm_header(uint8_t dsm_header); void read_dsm_block(const std::shared_ptr& osnma_msg); void process_dsm_message(const std::vector& dsm_msg, const std::shared_ptr& osnma_msg); + bool verify_dsm_pkr(DSM_PKR_message message, std::vector input_message); void read_mack_block(const std::shared_ptr& osnma_msg); void read_mack_header(); void read_mack_body(); @@ -74,13 +75,16 @@ private: std::unique_ptr d_dsm_reader; std::unique_ptr d_crypto; - std::array, 16> d_dsm_message{}; + std::array, 16> d_dsm_message{}; // C: each dsm[0-15] has 2048 bits std::array, 16> d_dsm_id_received{}; std::array d_number_of_blocks{}; - std::array d_mack_message{}; + std::array 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}; + }; diff --git a/src/core/system_parameters/osnma_data.h b/src/core/system_parameters/osnma_data.h index 890eeb3a5..5f82bb5a8 100644 --- a/src/core/system_parameters/osnma_data.h +++ b/src/core/system_parameters/osnma_data.h @@ -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; };