Galileo航法メッセージ認証OSNMA

category: gnss

はじめに

GPSなどの測位において、受信機は、観測を要する情報(疑似距離:複数衛星から受信機までの距離)と、要しない情報(航法メッセージ:衛星位置やクロックの補正)との両方を用いて、位置計算を行います。

欧州の測位衛星Galileoでは、航法メッセージ中にその認証情報が含まれはじめました。この認証は、一般利用できる信号(OS: open service)に対する航法メッセージ認証(NMA: navigation message authentication)なので、OSNMAと呼ばれます。現在、このOSNMAは試験運用中です。

今回、Daniel Estévez氏がGitHubで公開されているgalileo-osnmaを用いて、このOSNMAを試してみました。

準備(Rust開発環境導入と公開鍵取得)

TESLAプロトコル

記事Galileo Open Service Navigation Message Authenticationによると、航法メッセージI/NAV(integrity navigation message)の奇数ページに、40ビット長のOSNMA情報の割り当てがあります。このOSNMA情報は、これは8ビット長のHKROOT(header and root key)部と、32ビット長のMACK(message authentication code and key)部から構成され、TESLA(Timed Efficient Stream Loss-Tolerant Authentication)プロトコルにて衛星から受信機に伝送されます。

Bert Hubert’s writingsにある記事Galileo’s Proposed Authentication Algorithm: Part 1Part 2に、わかりやすいTESLAプロトコルの解説があります。この解説を読めば、よりOSNMAを楽しめる一方、OSNMAがとても複雑なオプションを持っていることもわかります。

ここで用いたソフトウェアgalileo-osnmaは、例えば自らのu-blox ZED-F9P受信機でも実行できますが、その際にはその受信機を別ソフトウェア(galmon: Galileo monitoring)にて制御しなければなりません。今回はインターネットで公開されたgalmonライブストリームのみで試しました。

Rust開発環境導入

galileo-osnmaはプログラム言語Rustで書かれていますので、Rust開発環境が必要です。The Rust Programming Language 日本語版などを参照してRust開発環境を準備します。私はMacintosh上のパッケージ管理ソフトウェアHomeBrewを利用していますので、ターミナルでのbrew install rustの入力だけで、容易にRust開発環境を整えることができました。

公開鍵の入手

また、Galileo OSNMAの利用には、楕円曲線ディジタル署名アルゴリズム(ECDSA: elliptic curve digital signature algorithm)の公開鍵が必要です。公開鍵入手のため、EUSPA(European Union Agency for the Space Programme)の登録ページからGSC(GNSS Service Centre)アカウントを作成します。

EUSPA registration

ここで、Create new accountタブをクリックして、フォームの

  • ユーザ名(スペースやアットマークなど特殊文字利用可)
  • 電子メールアドレス
  • 氏名

を入力します。プライバシ声明文の了承とCAPTCHA文字列の入力の後、メール認証します。

EUSPA registration

届いたメールのリンクをクリックして、表示されたページのログインボタンを押すと、パスワード登録画面に進みます。

EUSPA registration

新しいパスワード設定すれば、登録完了です。12文字以上の長いパスワードが求められます。必須ではないのかもしれませんが、私は、My Profileタブに、所属などの個人情報も登録しておきました。

EUSPA registration

次に、公開鍵ダウンロードのため、開発者申請をします。GSCアカウントにてログイン後、右の茶色いタブの「Support to developers」の中の「OSNMA public observation test phase」をクリックします。

EUSPA registration

そのページの一番下にある「Register to the OSNMA Public Observation Test Phase」をクリックします。

EUSPA registration

OSNMA Public Observation Test Phaseページが現れます。その利用規約を読みながら、スクロールします。

EUSPA registration

ページ下部にあるフォームには、ログインしたアカウントの氏名と電子メールがあらかじめ入力されています。その利用規約に同意し、電子メールでの通知の有無を選択して、Submitボタンを押します。

EUSPA registration

申込書が提出されたとのメッセージが現れました。

EUSPA registration

次にどうすべきか、わかりませんでした。

しかし、画面上部の「GSC PRODUCTS」に「OSNMA_PUBLICKEY」タブを見つけました。これをクリックして、現れたページにあるリンク「Download product pem file」をクリックすると、ファイルOSNMA_PublicKey_20210920133026.pemがダウンロードできます。galileo-osnma実行に必要な情報は、「Public Key Point」に書かれた2行の文字列と、その前後のタグ文字列です。

EUSPA registration

ちなみに、ログインしていない状態では、「OSNMA_PUBLICKEY」タブは表示されません。

EUSPA registration

これで準備ができました。しばらくしたら、My Accountの中のSubscriptionsページに「OSNMA_MerkleTree」と「OSNMA_PublicKey」の更新情報についての購読選択が追加されていました。

galileo-osnmaの実行

gitを用いて、Daniel Estévez氏のgalileo-osnmaをダウンロードします。ここでは、osnmaディレクトリにダウンロードしました。そして、その中のgalmon-osnmaディレクトリに移動します。

git clone https://github.com/daniestevez/galileo-osnma osnma
cd osnma/galmon-osnma

cargo checkを実行すると、必要なパッケージがダウンロードされ、ソフトウェアの文法チェックが行われます。

    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   

そして、このディレクトリにダウンロードした公開鍵OSNMA_PublicKey_20210920133026.pemをコピーします。このファイルをエディタで開き、

-----BEGIN PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
-----END PUBLIC KEY-----

の4行だけを残します。ここでxは伏字です。

Galileo航法メッセージを得るために、galmon(Galileo monitoring)の著者であり、上述のOSNMA解説文書の著者でもあるBert Hubert氏が運用するライブフィードを利用します。galmon著者のGNSSモニターサイトは、見ていて楽しいです。galmonは、Galileoだけでなく、GPS、GLONASS、BeiDouも扱えますが、残念ながらみちびきは対象外です。

Rustコードは、cargo runにて実行します。この公開鍵ファイルを引数にして、Galileo航法メッセージフィードgalmonのストリームデータをgalileo-osnmaの標準入力に供給します。

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

galileo-osnmaを実行すると、黄色文字で航法メッセージ不一致を示す警告が表示されました。

galileo-osnma

すぐに、緑色のTESLA鍵の認証成功メッセージが現れて、E01E04などのGalileo衛星の航法メッセージが認証されました。

galileo-osnma

また、しばらく航法メッセージ不一致の警告が現れますが、認証成功時には、tag0のほか、tag1、tag2などの認証成功メッセージが現れます。

galileo-osnma

徐々に認証成功メッセージが増えますが、時々、航法メッセージ不一致の警告が現れます。また、誤ったタグ検出を表す赤色文字のエラーも現れました。

galileo-osnma

galileo-osnmaを30分以上、経実行したのち、ターミナルの様子を動画撮影しました。長い間、静止していることが多いのですが、時々、多くの文字列が表示されます。

まとめ

galileo-osnmaとgalmonライブストリームを用いて、Galileoの航法メッセージ認証OSNMAを試しました。固定受信であろうストリームデータにおいても、常に航法メッセージが認証されるとは限らないようでした。また、すべてのGalileo衛星がOSNMAの対象にはなっていませんでした。そのため、現時点では、認証未完了の航法データを破棄するのは望ましくないのかもしれません。OSNMAが実装されているSeptentrioのmosaic-CLAS受信機などにおいて、認証未完了の航法メッセージも利用するlooseモードが用意されているのは(mosaic-CLAS Reference Guideの129ページ)、そのためかもしれません。

TESLAの基本的な考えはわかりやすいもので、秘密にすべき対称鍵でメッセージを署名し、少し遅れてその対称鍵を公開する、その対称鍵を利用して以前の対称鍵を導出できるようにチェーン構造にする、ことからなります。

しかしながら、サブフレーム欠落対策、キーの使用期間、対称鍵更新、公開鍵更新、他衛星認証をはじめとした柔軟性追加などのために、OSNMAの実装はとても高度であり、複雑で難解です。

また、galmonの著者が運用するGNSS航法メッセージ集約サイトgalmon.euでは、世界中の協力者のGNSS受信集約により、衛星の状態、エフェメリス寿命、衛星健康状態、OSNMA利用可否、航法メッセージなどを、ほぼ実時間でいつでも誰でも得られるようになっていて、とても興味深いです。みちびきがgalmonの対象外なのが、私にとっては残念です。

今すぐに航法メッセージ認証が必要にはならないかもしれませんが、OSNMAは技術的に興味深いです。まもなく始まる、みちびきの航法メッセージ認証QZNMA(quasi-zenith satellite navigation message authentication)も、同様の方法が用いられると予想しています。