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>

source

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).

source

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).

source

pub fn feed_inav(&mut self, word: &InavWord, svn: Svn, gst: Gst, band: InavBand)

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.

source

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.

source

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.

source

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§

source§

impl<S: Clone + StaticStorage> Clone for Osnma<S>

source§

fn clone(&self) -> Osnma<S>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<S: Debug + StaticStorage> Debug for Osnma<S>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<S> RefUnwindSafe for Osnma<S>

§

impl<S> Send for Osnma<S>

§

impl<S> Sync for Osnma<S>

§

impl<S> Unpin for Osnma<S>

§

impl<S> UnwindSafe for Osnma<S>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

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,

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,

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,

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,

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,

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,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

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,

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,

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,

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,

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,

Mutable access to the Deref::Target of a value. Read more
§

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

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

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.
§

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.
§

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.
§

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.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.