61class osnma_msg_receiver :
public gr::block
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;
119 OSNMA_data d_osnma_data{};
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);