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();
87 void send_data_to_pvt(
const std::vector<OSNMA_NavData>& data);
89 bool verify_tesla_key(std::vector<uint8_t>& key, uint32_t TOW);
90 bool verify_tag(
Tag& tag)
const;
91 bool tag_has_nav_data_available(
const Tag& t)
const;
92 bool tag_has_key_available(
const Tag& t)
const;
95 bool store_dsm_kroot(
const std::vector<uint8_t>& dsm,
const uint8_t nma_header)
const;
97 std::pair<std::vector<uint8_t>, uint8_t> parse_dsm_kroot()
const;
98 std::vector<uint8_t> get_merkle_tree_leaves(
const DSM_PKR_message& dsm_pkr_message)
const;
99 std::vector<uint8_t> compute_merkle_root(
const DSM_PKR_message& dsm_pkr_message,
const std::vector<uint8_t>& m_i)
const;
100 std::vector<uint8_t> build_message(
Tag& tag)
const;
101 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;
102 std::vector<MACK_tag_and_info> verify_macseq_new(
const MACK_message& mack);
104 std::map<uint32_t, std::map<uint32_t, OSNMA_NavData>> d_satellite_nav_data;
105 std::map<uint32_t, std::vector<uint8_t>> d_tesla_keys;
106 std::multimap<uint32_t, Tag> d_tags_awaiting_verify;
108 std::vector<uint8_t> d_new_public_key;
109 std::vector<uint8_t> d_tags_to_verify{0, 4, 12};
110 std::vector<MACK_message> d_macks_awaiting_MACSEQ_verification;
112 std::array<std::array<uint8_t, 256>, 16> d_dsm_message{};
113 std::array<std::array<uint8_t, 16>, 16> d_dsm_id_received{};
114 std::array<uint16_t, 16> d_number_of_blocks{};
115 std::array<uint8_t, 60> d_mack_message{};
117 std::unique_ptr<Gnss_Crypto> d_crypto;
118 std::unique_ptr<OSNMA_DSM_Reader> d_dsm_reader;
119 std::unique_ptr<Osnma_Helper> d_helper;
120 std::unique_ptr<OSNMA_NavDataManager> d_nav_data_manager;
124 uint32_t d_last_received_GST{0};
126 uint32_t d_GST_Rx{0};
127 uint32_t d_last_verified_key_GST{0};
129 uint32_t d_GST_SIS{};
130 uint32_t d_GST_PKR_PKREV_start{};
131 uint32_t d_GST_PKR_AM_start{};
132 uint32_t d_GST_chain_renewal_start{};
133 uint32_t d_GST_chain_revocation_start{};
135 uint32_t d_count_successful_tags{0};
136 uint32_t d_count_failed_tags{0};
137 uint32_t d_count_failed_Kroot{0};
138 uint32_t d_count_failed_pubKey{0};
139 uint32_t d_count_failed_macseq{0};
141 uint8_t
const d_T_L{30};
142 uint8_t d_new_public_key_id{};
144 bool d_new_data{
false};
145 bool d_public_key_verified{
false};
146 bool d_kroot_verified{
false};
147 bool d_tesla_key_verified{
false};
148 bool d_strict_mode{
false};
149 bool d_flag_hot_start{
false};
150 bool d_flag_PK_renewal{
false};
151 bool d_flag_PK_revocation{
false};
152 bool d_flag_NPK_set{
false};
153 bool d_flag_alert_message{
false};
154 bool d_flag_chain_renewal{
false};
155 bool d_flag_chain_revocation{
false};
158 FRIEND_TEST(OsnmaMsgReceiverTest, TeslaKeyVerification);
159 FRIEND_TEST(OsnmaMsgReceiverTest, TagVerification);
160 FRIEND_TEST(OsnmaMsgReceiverTest, BuildTagMessageM0);
161 FRIEND_TEST(OsnmaMsgReceiverTest, VerifyPublicKey);
162 FRIEND_TEST(OsnmaMsgReceiverTest, ComputeBaseLeaf);
163 FRIEND_TEST(OsnmaMsgReceiverTest, ComputeMerkleRoot);
164 FRIEND_TEST(OsnmaTestVectors, NominalTestConf1);
165 FRIEND_TEST(OsnmaTestVectors, NominalTestConf2);
166 FRIEND_TEST(OsnmaTestVectors, PublicKeyRenewal);
167 FRIEND_TEST(OsnmaTestVectors, PublicKeyRevocation);
168 FRIEND_TEST(OsnmaTestVectors, ChainRenewal);
169 FRIEND_TEST(OsnmaTestVectors, ChainRevocation);
170 FRIEND_TEST(OsnmaTestVectors, AlertMessage);
176 #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.