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, Osnma, 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();
// 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 inav = [0; 16];
let osnma_data = [0; 5];
osnma.feed_inav(&inav, svn, gst);
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();
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
sourceimpl<S: StaticStorage> Osnma<S>
impl<S: StaticStorage> Osnma<S>
sourcepub fn from_pubkey(pubkey: VerifyingKey, only_slowmac: bool) -> Osnma<S>
pub fn from_pubkey(pubkey: VerifyingKey, only_slowmac: bool) -> Osnma<S>
Constructs a new OSNMA black box using an ECDSA P-256 public key.
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.
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) -> Option<NavMessageData<'_>>
pub fn get_timing_parameters(&self) -> Option<NavMessageData<'_>>
Try to get authenticated timing parameters for the Galileo constellation.
This will try to retrieve the most Galileo constellation timing
parameters data (ADKD=4) svn
that is available in the OSNMA
storage. If the storage does not contain any authenticated timing
parameters data, this returns None
.
Trait Implementations
sourceimpl<S: Clone + StaticStorage> Clone for Osnma<S>
impl<S: Clone + StaticStorage> Clone for Osnma<S>
sourceimpl<S: Debug + StaticStorage> Debug for Osnma<S>
impl<S: Debug + StaticStorage> Debug for Osnma<S>
impl<S: Eq + StaticStorage> Eq for Osnma<S>
impl<S: StaticStorage> StructuralEq for Osnma<S>
impl<S: StaticStorage> StructuralPartialEq for Osnma<S>
Auto Trait Implementations
impl<S> RefUnwindSafe for Osnma<S> where
<<S as StaticStorage>::MackDepth as ArrayLength<Option<Gst>>>::ArrayType: RefUnwindSafe,
<<S as StaticStorage>::MackDepthSats as ArrayLength<Option<Mack>>>::ArrayType: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<Option<Gst>>>::ArrayType: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<TimingParameters>>::ArrayType: RefUnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength<CedAndStatus>>::ArrayType: 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<Option<Gst>>>::ArrayType: Unpin,
<<S as StaticStorage>::MackDepthSats as ArrayLength<Option<Mack>>>::ArrayType: Unpin,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<Option<Gst>>>::ArrayType: Unpin,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<TimingParameters>>::ArrayType: Unpin,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength<CedAndStatus>>::ArrayType: Unpin,
impl<S> UnwindSafe for Osnma<S> where
<<S as StaticStorage>::MackDepth as ArrayLength<Option<Gst>>>::ArrayType: UnwindSafe,
<<S as StaticStorage>::MackDepthSats as ArrayLength<Option<Mack>>>::ArrayType: UnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<Option<Gst>>>::ArrayType: UnwindSafe,
<<S as StaticStorage>::NavMessageDepth as ArrayLength<TimingParameters>>::ArrayType: UnwindSafe,
<<S as StaticStorage>::NavMessageDepthSats as ArrayLength<CedAndStatus>>::ArrayType: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
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,
Causes self
to use its Binary
implementation when Debug
-formatted. Read more
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
Causes self
to use its Display
implementation when
Debug
-formatted. Read more
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
Causes self
to use its LowerExp
implementation when
Debug
-formatted. Read more
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
Causes self
to use its LowerHex
implementation when
Debug
-formatted. Read more
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
Causes self
to use its Octal
implementation when Debug
-formatted. Read more
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
Causes self
to use its Pointer
implementation when
Debug
-formatted. Read more
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
Causes self
to use its UpperExp
implementation when
Debug
-formatted. Read more
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
Causes self
to use its UpperHex
implementation when
Debug
-formatted. Read more
fn fmt_list(self) -> FmtList<Self> where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self> where
&'a Self: for<'a> IntoIterator,
Formats each item in a sequence. Read more
impl<T> Pipe for T where
T: ?Sized,
impl<T> Pipe for T where
T: ?Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
Pipes by value. This is generally the method you want to use. Read more
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
Borrows 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) -> R where
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
Mutably borrows 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 where
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R where
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
Borrows self
, then passes self.borrow()
into the pipe function. Read more
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
Mutably borrows self
, then passes self.borrow_mut()
into the pipe
function. Read more
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R where
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R where
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
Borrows 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 where
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R where
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
Mutably borrows self
, then passes self.as_mut()
into the pipe
function. Read more
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
Borrows 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 where
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
Immutable access to the Borrow<B>
of a value. Read more
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
Mutable access to the BorrowMut<B>
of a value. Read more
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
Immutable access to the AsRef<R>
view of a value. Read more
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
Mutable access to the AsMut<R>
view of a value. Read more
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
Immutable access to the Deref::Target
of a value. Read more
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Mutable access to the 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
Calls .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
Calls .tap_mut()
only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self where
Self: Borrow<B>,
B: ?Sized,
Calls .tap_borrow()
only in debug builds, and is erased in release
builds. Read more
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self where
Self: BorrowMut<B>,
B: ?Sized,
Calls .tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self where
Self: AsRef<R>,
R: ?Sized,
Calls .tap_ref()
only in debug builds, and is erased in release
builds. Read more
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self where
Self: AsMut<R>,
R: ?Sized,
Calls .tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more