Struct galileo_osnma::Osnma
source · pub struct Osnma<S: StaticStorage> { /* private fields */ }
Expand description
OSNMA “black box” processing.
The Osnma
struct gives a way to process OSNMA data using a “black box”
approach. INAV words and OSNMA data retrieved from the E1B and E5b signals
is fed by the user into Osnma
, and at any point the user can request
Osnma
to give the most recent authenticated navigation data (provided that
it is available).
§Examples
use galileo_osnma::{Gst, InavBand, Osnma, PublicKey, Svn};
use galileo_osnma::storage::FullStorage;
use p256::ecdsa::VerifyingKey;
// Typically, the ECDSA public key should be obtained from
// a file. Here a statically defined dummy key is used for
// the sake of the example.
let pubkey = [3, 154, 36, 205, 5, 122, 110, 166, 187, 238, 33,
117, 116, 91, 202, 57, 34, 72, 200, 202, 10, 169,
253, 225, 1, 233, 82, 99, 133, 255, 241, 114, 218];
let pubkey = VerifyingKey::from_sec1_bytes(&pubkey).unwrap();
let public_key_id = 0;
let pubkey = PublicKey::from_p256(pubkey, public_key_id);
// Force the public key to be valid. Only do this if the key
// has been loaded from a trustworthy source.
let pubkey = pubkey.force_valid();
// Create OSNMA black box using full storage (36 satellites and
// large enough history for Slow MAC)
let only_slowmac = false; // process "fast" MAC as well as Slow MAC
let mut osnma = Osnma::<FullStorage>::from_pubkey(pubkey, only_slowmac);
// Feed some INAV and OSNMA data. Data full of zeros is used here.
let svn = Svn::try_from(12).unwrap(); // E12
let gst = Gst::new(1177, 175767); // WN 1177, TOW 175767
let band = InavBand::E1B;
let inav = [0; 16];
let osnma_data = [0; 5];
osnma.feed_inav(&inav, svn, gst, band);
osnma.feed_osnma(&osnma_data, svn, gst);
// Try to retrieve authenticated data
// ADKD=0 and 12, CED and health status for a satellite
let ced = osnma.get_ced_and_status(svn);
// ADKD=4, Galileo constellation timing parameters
let timing = osnma.get_timing_parameters(svn);
§Storage size
The size of the internal storage used to hold navigation data and MACK
messages is defined by the StaticStorage
type parameter S
. See the
storage module for a description of how the storage size
is defined.
Implementations§
source§impl<S: StaticStorage> Osnma<S>
impl<S: StaticStorage> Osnma<S>
sourcepub fn from_merkle_tree(
merkle_tree_root: MerkleTreeNode,
pubkey: Option<PublicKey<Validated>>,
only_slowmac: bool
) -> Osnma<S>
pub fn from_merkle_tree( merkle_tree_root: MerkleTreeNode, pubkey: Option<PublicKey<Validated>>, only_slowmac: bool ) -> Osnma<S>
Constructs a new OSNMA black box using the Merkle tree root.
An optional ECDSA public key can be passed in addition to the Merkle tree root. If the ECDSA public key is not passed, the OSNMA black box will need to obtain the public key from a DSM-PKR message. These messages are broadcast only every 6 hours.
If only_slowmac
is true
, only ADKD=12 (Slow MAC) will be processed.
This should be used by receivers which have a larger time uncertainty.
(See Annex 3 in the
OSNMA Receiver Guidelines).
sourcepub fn from_pubkey(pubkey: PublicKey<Validated>, only_slowmac: bool) -> Osnma<S>
pub fn from_pubkey(pubkey: PublicKey<Validated>, only_slowmac: bool) -> Osnma<S>
Constructs a new OSNMA black box using only an ECDSA public key.
This function is similar to Osnma::from_merkle_tree
, but the Merkle
tree root is not loaded. Therefore, DSM-PKR verification will not be
done, and only the provided ECDSA public key will be used.
The OSNMA black box will hold the public key pubkey
and use it to
try to authenticate the TESLA root key. The public key cannot be changed
after construction.
If only_slowmac
is true
, only ADKD=12 (Slow MAC) will be processed.
This should be used by receivers which have a larger time uncertainty.
(See Annex 3 in the
OSNMA Receiver Guidelines).
Feed an INAV word into the OSNMA black box.
The black box will store the navigation data in the INAV word for later usage.
The svn
parameter corresponds to the SVN of the satellite transmitting
the INAV word. This should be obtained from the PRN used for tracking.
The gst
parameter gives the GST at the start of the INAV page transmission.
The band
parameter indicates the band in which the INAV word was received.
sourcepub fn feed_osnma(&mut self, osnma: &OsnmaDataMessage, svn: Svn, gst: Gst)
pub fn feed_osnma(&mut self, osnma: &OsnmaDataMessage, svn: Svn, gst: Gst)
Feed the OSNMA data message from an INAV page into the OSNMA black box.
The black box will store the data and potentially trigger any new cryptographic checks that this data makes possible.
The svn
parameter corresponds to the SVN of the satellite transmitting
the INAV word. This should be obtained from the PRN used for tracking.
The gst
parameter gives the GST at the start of the INAV page transmission.
sourcepub fn get_ced_and_status(&self, svn: Svn) -> Option<NavMessageData<'_>>
pub fn get_ced_and_status(&self, svn: Svn) -> Option<NavMessageData<'_>>
Try to get authenticated CED and health status data for a satellite.
This will try to retrieve the most recent authenticated CED and health
status data (ADKD=0 and 12) for the satellite with SVN svn
that is
available in the OSNMA storage. If the storage does not contain any
authenticated CED and health status data for this SVN, this returns
None
.
sourcepub fn get_timing_parameters(&self, svn: Svn) -> Option<NavMessageData<'_>>
pub fn get_timing_parameters(&self, svn: Svn) -> Option<NavMessageData<'_>>
Try to get authenticated timing parameters for a satellite.
This will try to retrieve the most recent authenticated timing
parameters data (ADKD=4) for the satellite with SVN svn
that is
available in the OSNMA storage. If the storage does not contain any
authenticated timing parameters data for this SVN, this returns None
.
Trait Implementations§
Auto Trait Implementations§
impl<S> RefUnwindSafe for Osnma<S>where
<<S as StaticStorage>::MackDepth as ArrayLength>::ArrayType<Option<Gst>>: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength>::ArrayType<Option<Gst>>: RefUnwindSafe,
<<S as StaticStorage>::MackDepthSats as ArrayLength>::ArrayType<Option<Mack>>: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<CedAndStatus>: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<TimingParameters>: RefUnwindSafe,
impl<S> Send for Osnma<S>
impl<S> Sync for Osnma<S>
impl<S> Unpin for Osnma<S>where
<<S as StaticStorage>::MackDepth as ArrayLength>::ArrayType<Option<Gst>>: Unpin,
<<S as StaticStorage>::NavMessageDepth as ArrayLength>::ArrayType<Option<Gst>>: Unpin,
<<S as StaticStorage>::MackDepthSats as ArrayLength>::ArrayType<Option<Mack>>: Unpin,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<CedAndStatus>: Unpin,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<TimingParameters>: Unpin,
impl<S> UnwindSafe for Osnma<S>where
<<S as StaticStorage>::MackDepth as ArrayLength>::ArrayType<Option<Gst>>: UnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength>::ArrayType<Option<Gst>>: UnwindSafe,
<<S as StaticStorage>::MackDepthSats as ArrayLength>::ArrayType<Option<Mack>>: UnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<CedAndStatus>: UnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength>::ArrayType<TimingParameters>: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.