20 #ifndef GNSS_SDR_OSNMA_MSG_RECEIVER_H 21 #define GNSS_SDR_OSNMA_MSG_RECEIVER_H 23 #define FRIEND_TEST(test_case_name, test_name) \ 24 friend class test_case_name##_##test_name##_Test 30 #include <gnuradio/block.h> 51 using osnma_msg_receiver_sptr = gnss_shared_ptr<osnma_msg_receiver>;
53 osnma_msg_receiver_sptr osnma_msg_receiver_make(
const std::string& pemFilePath,
const std::string& merkleFilePath,
bool strict_mode =
false);
71 friend osnma_msg_receiver_sptr osnma_msg_receiver_make(
const std::string& pemFilePath,
const std::string& merkleFilePath,
bool strict_mode);
72 osnma_msg_receiver(
const std::string& crtFilePath,
const std::string& merkleFilePath,
bool strict_mode);
74 void process_osnma_message(
const std::shared_ptr<OSNMA_msg>& osnma_msg);
75 void read_nma_header(uint8_t nma_header);
76 void read_dsm_header(uint8_t dsm_header);
77 void read_dsm_block(
const std::shared_ptr<OSNMA_msg>& osnma_msg);
78 void process_dsm_block(
const std::shared_ptr<OSNMA_msg>& osnma_msg);
79 void process_dsm_message(
const std::vector<uint8_t>& dsm_msg,
const uint8_t& nma_header);
80 void read_and_process_mack_block(
const std::shared_ptr<OSNMA_msg>& osnma_msg);
81 void read_mack_header();
82 void read_mack_body();
83 void process_mack_message();
84 void remove_verified_tags();
85 void control_tags_awaiting_verify_size();
86 void send_data_to_pvt(
const std::vector<OSNMA_NavData>& data);
88 bool verify_tesla_key(std::vector<uint8_t>& key, uint32_t TOW);
89 bool verify_tag(
Tag& tag)
const;
90 bool tag_has_nav_data_available(
const Tag& t)
const;
91 bool tag_has_key_available(
const Tag& t)
const;
92 bool store_dsm_kroot(
const std::vector<uint8_t>& dsm,
const uint8_t nma_header)
const;
94 std::pair<std::vector<uint8_t>, uint8_t> parse_dsm_kroot()
const;
95 std::vector<uint8_t> get_merkle_tree_leaves(
const DSM_PKR_message& dsm_pkr_message)
const;
96 std::vector<uint8_t> compute_merkle_root(
const DSM_PKR_message& dsm_pkr_message,
const std::vector<uint8_t>& m_i)
const;
97 std::vector<uint8_t> build_message(
Tag& tag)
const;
98 std::vector<uint8_t> hash_chain(uint32_t num_of_hashes_needed,
const std::vector<uint8_t>& key, uint32_t GST_SFi,
const uint8_t lk_bytes)
const;
99 std::vector<MACK_tag_and_info> verify_macseq(
const MACK_message& mack);
101 std::map<uint32_t, std::map<uint32_t, OSNMA_NavData>> d_satellite_nav_data;
102 std::map<uint32_t, std::vector<uint8_t>> d_tesla_keys;
103 std::multimap<uint32_t, Tag> d_tags_awaiting_verify;
105 std::vector<uint8_t> d_new_public_key;
106 std::vector<uint8_t> d_tags_to_verify{0, 4, 12};
107 std::vector<MACK_message> d_macks_awaiting_MACSEQ_verification;
109 std::array<std::array<uint8_t, 256>, 16> d_dsm_message{};
110 std::array<std::array<uint8_t, 16>, 16> d_dsm_id_received{};
111 std::array<uint16_t, 16> d_number_of_blocks{};
112 std::array<uint8_t, 60> d_mack_message{};
114 std::unique_ptr<Gnss_Crypto> d_crypto;
115 std::unique_ptr<OSNMA_DSM_Reader> d_dsm_reader;
116 std::unique_ptr<Osnma_Helper> d_helper;
117 std::unique_ptr<OSNMA_NavDataManager> d_nav_data_manager;
121 uint32_t d_last_received_GST{0};
123 uint32_t d_GST_Rx{0};
124 uint32_t d_last_verified_key_GST{0};
126 uint32_t d_GST_SIS{};
127 uint32_t d_GST_PKR_PKREV_start{};
128 uint32_t d_GST_PKR_AM_start{};
129 uint32_t d_GST_chain_renewal_start{};
130 uint32_t d_GST_chain_revocation_start{};
132 uint32_t d_count_successful_tags{0};
133 uint32_t d_count_failed_tags{0};
134 uint32_t d_count_failed_Kroot{0};
135 uint32_t d_count_failed_pubKey{0};
136 uint32_t d_count_failed_macseq{0};
138 uint8_t
const d_T_L{30};
139 uint8_t d_new_public_key_id{};
141 bool d_new_data{
false};
142 bool d_public_key_verified{
false};
143 bool d_kroot_verified{
false};
144 bool d_tesla_key_verified{
false};
145 bool d_strict_mode{
false};
146 bool d_flag_hot_start{
false};
147 bool d_flag_PK_renewal{
false};
148 bool d_flag_PK_revocation{
false};
149 bool d_flag_NPK_set{
false};
150 bool d_flag_alert_message{
false};
151 bool d_flag_chain_renewal{
false};
152 bool d_flag_chain_revocation{
false};
155 FRIEND_TEST(OsnmaMsgReceiverTest, TeslaKeyVerification);
156 FRIEND_TEST(OsnmaMsgReceiverTest, TagVerification);
157 FRIEND_TEST(OsnmaMsgReceiverTest, BuildTagMessageM0);
158 FRIEND_TEST(OsnmaMsgReceiverTest, VerifyPublicKey);
159 FRIEND_TEST(OsnmaMsgReceiverTest, ComputeBaseLeaf);
160 FRIEND_TEST(OsnmaMsgReceiverTest, ComputeMerkleRoot);
161 FRIEND_TEST(OsnmaTestVectors, NominalTestConf1);
162 FRIEND_TEST(OsnmaTestVectors, NominalTestConf2);
163 FRIEND_TEST(OsnmaTestVectors, PublicKeyRenewal);
164 FRIEND_TEST(OsnmaTestVectors, PublicKeyRevocation);
165 FRIEND_TEST(OsnmaTestVectors, ChainRenewal);
166 FRIEND_TEST(OsnmaTestVectors, ChainRevocation);
167 FRIEND_TEST(OsnmaTestVectors, AlertMessage);
173 #endif // GNSS_SDR_OSNMA_MSG_RECEIVER_H Class implementing cryptographic functions for Navigation Message Authentication. ...
This class handles ONSMA data See https://www.gsc-europa.eu/sites/default/files/sites/all/files/Galil...
void set_merkle_root(const std::vector< uint8_t > &v)
Public for benchmarking purposes.
Class for Galileo OSNMA navigation data management.
bool verify_dsm_pkr(const DSM_PKR_message &message) const
Public for benchmarking purposes.
Class for Galileo OSNMA data storage.
~osnma_msg_receiver()=default
Default destructor.
Implementation of a Galileo I/NAV Data message as described in Galileo OS SIS ICD Issue 2...
This interface represents a GNSS block.
void msg_handler_osnma(const pmt::pmt_t &msg)
For testing purposes.
GNU Radio block that receives asynchronous OSNMA messages from the telemetry blocks, stores them in memory, and decodes OSNMA info when enough data have been received. The decoded OSNMA data is sent to the PVT block.
void read_merkle_xml(const std::string &merklepath)
Public for testing purposes.