Galileo Navigation Message Authentication: OSNMA

category: gnss


In positioning such as GPS, the receiver uses both information that requires observation (pseudorange: distance from multiple satellites to the receiver) and information that does not require observation (navigation message: correction of satellite position and clock) to calculate the position.

The European positioning satellite Galileo began including its credentials in its navigation messages. This authentication is called OSNMA and is the abbreviation of navigation message authentication (NMA) for open service (OS) signals. This OSNMA is currently in pilot operation.

In this time, I tried decoding OSNMA using galileo-osnma published by Daniel Estévez on GitHub.

Preparation (Introduction of Rust development environment and and the public key)

TESLA protocol

According to the article, Galileo Open Service Navigation Message Authentication, there is an allocation of 40-bit long OSNMA information. This OSNMA information consists of an 8-bit length HKROOT (header and root key) part and a 32-bit length MACK (message authentication code and key) part on odd pages of the navigation message I/NAV (integrity navigation message). The HKROOT and MACK parts are conformed to the TESLA (Timed Efficient Stream Loss-Tolerant Authentication) protocol and are transmitted from the satellite to the receiver.

The articles, Galileo’s Proposed Authentication Algorithm: Part 1 and Part 2 in Bert Hubert’s writings, are easy-to-understand descriptions of the TESLA protocol. If you read this explanation, you will find that you can enjoy OSNMA more and figure out that OSNMA also has very complex options.

The software galileo-osnma used here can also be run, for example, on your own u-blox ZED-F9P receiver, but then the receiver must be controlled by another software (galmon: Galileo monitoring). not. This time I tried only galmon live stream published on the Internet.

Installation of Rust development environment

galileo-osnma is written in the Rust programming language, so it requires a Rust development environment. Please refer to articles such as The Rust Programming Language to install Rust development environment on your computer. I use the package management software HomeBrew on my Macintosh, so I was able to easily set up a Rust development environment just by typing brew install rust in the terminal.

Obtaining the public key

Galileo OSNMA also requires a public key for the elliptic curve digital signature algorithm (ECDSA). To obtain the public key, create a GSC (GNSS Service Center) account from the registration page of EUSPA (European Union Agency for the Space Program).

EUSPA registration

Here, we click tab Create new account and fill out the form

  • username (special characters such as spaces and at marks can be used)
  • E-mail address
  • name

After accepting the privacy statement and entering the CAPTCHA string, you will receive a verification e-mail shortly.

EUSPA registration

Click the link in the E-mail, you received and press the login button on the displayed page to proceed to the password registration screen.

EUSPA registration

After setting a new password, registration is complete. A password longer than 12 characters is required. Although it may not be necessary, I also registered personal information such as my affiliation on the My Profile tab.

EUSPA registration

Next, apply as a developer to download the public key. After logging in with your GSC account, click “OSNMA public observation test phase” in “Support to developers” on the brown tab on the right.

EUSPA registration

Click “Register to the OSNMA Public Observation Test Phase” at the bottom of that page.

EUSPA registration

The OSNMA Public Observation Test Phase page will appear. Scroll while reading the terms of use.

EUSPA registration

The form at the bottom of the page is pre-populated with your logged-in account name and e-mail. Agree to the terms of use, select whether or not to be notified by e-mail, and press the Submit button.

EUSPA registration

I got a message that my application has been submitted.

EUSPA registration

I didn’t know what to do next.

However, I found the “OSNMA_PUBLICKEY” tab in “GSC PRODUCTS” at the top of the screen. Click this and click the link “Download product pem file” on the page that appears to download the file OSNMA_PublicKey_20210920133026.pem. The information required to run galileo-osnma is a two-line string written in “Public Key Point” and tag strings before and after it.

EUSPA registration

By the way, if you are not logged in, the “OSNMA_PUBLICKEY” tab will not be shown.

EUSPA registration

You are now ready to go. After a while, the Subscriptions page in My Account added subscription options for updates to “OSNMA_MerkleTree” and “OSNMA_PublicKey”.

Execution of galileo-osnma

Download Daniel Estévez’s galileo-osnma using git. Here we downloaded it to the osnma directory. Then move to the galmon-osnma directory inside.

git clone osnma
cd osnma/galmon-osnma

Running cargo check will download the required packages and perform a syntax check on the software.

    Compiling subtle v2.4.1
    Compiling p256 v0.11.0
    Compiling galmon-osnma v0.1.0 (.../osnma/galmon-osnma)
    Finished dev [unoptimized + debuginfo] target(s) in 2.68s   

And copy the downloaded public key OSNMA_PublicKey_20210920133026.pem to this directory. Open this file in an editor and leave only the following four lines:

-----END PUBLIC KEY-----

where x is an abbreviation.

To obtain Galileo navigation messages, we use a live feed operated by Bert Hubert, author of galmon(Galileo monitoring) and author of the OSNMA commentary document mentioned above. galmon author’s GNSS monitor site is fun to look at. galmon can handle not only Galileo but also GPS, GLONASS, and BeiDou, but unfortunately it does not cover QZSS (quasi-zenith satellite system, petnamed Michibiki).

Rust code is executed with cargo run. With this public key file as an argument, the stream data of Galileo navigation message feed galmon is supplied to the standard input of galileo-osnma.

nc 10000 | RUST_LOG=info cargo run --release OSNMA_PublicKey_20210920133026.pem

Running galileo-osnma gave warnings in yellow text indicating navigation message mismatch.


Immediately, a green TESLA key authentication success message appeared, validating Galileo satellite navigation messages such as E01 and E04.


Also, a warning of navigation message mismatch appears for a while, but when authentication succeeds, authentication success messages such as tag0, tag1, and tag2 appear.


Gradually you will get more and more authentication success messages, but occasionally you will get a navigation message mismatch warning. I also saw an error in red letters representing an erroneous tag detection.


After running galileo-osnma for more than 30 minutes, I took a video of the terminal. It often sits still for a long time, but sometimes many strings are displayed.


I tried Galileo’s navigation message authentication OSNMA using galileo-osnma and galmon livestream. It seems that navigation messages are not always authenticated even in stream data that may be fixed reception. Also, not all Galileo satellites were covered by OSNMA. Therefore, it may not be desirable at this time to discard navigation data that has not yet been authenticated. Septentrio’s mosaic-CLAS receiver, which implements OSNMA, has a loose mode that uses even unauthenticated navigation messages (page 129 of the mosaic-CLAS Reference Guide).

The basic idea of TESLA is a straightforward idea to sign a message with a symmetric key that should be kept secret, publish the symmetric key after a short delay, chain it so that the symmetric key can be used to derive previous symmetric keys.

However, the implementation of OSNMA is advanced, very complicated, and difficult to understand due to additional flexibility such as subframe dropout countermeasures, key usage period, symmetric key update, public key update, authentication of other satellites.

In addition,, a GNSS navigation message aggregation site operated by the author of galmon, collects satellites information such as status, ephemeris life, satellite health status, OSNMA availability, navigation messages. by collecting GNSS receptions from collaborators around the world. It is very interesting that anyone can get it anytime in real time. It’s a small pity that QZSS (Michibiki) is not covered by galmon.

OSNMA is technically interesting, although we may not need navigation message authentication any time soon. It is expected that the same method will be used for QZNMA (quasi-zenith satellite navigation message authentication), which will soon be launched on Michibiki.