Galileo航法メッセージ認証OSNMA
はじめに
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 1とPart 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)アカウントを作成します。
ここで、Create new account
タブをクリックして、フォームの
- ユーザ名(スペースやアットマークなど特殊文字利用可)
- 電子メールアドレス
- 氏名
を入力します。プライバシ声明文の了承とCAPTCHA文字列の入力の後、メール認証します。
届いたメールのリンクをクリックして、表示されたページのログインボタンを押すと、パスワード登録画面に進みます。
新しいパスワード設定すれば、登録完了です。12文字以上の長いパスワードが求められます。必須ではないのかもしれませんが、私は、My Profileタブに、所属などの個人情報も登録しておきました。
次に、公開鍵ダウンロードのため、開発者申請をします。GSCアカウントにてログイン後、右の茶色いタブの「Support to developers」の中の「OSNMA public observation test phase」をクリックします。
そのページの一番下にある「Register to the OSNMA Public Observation Test Phase」をクリックします。
OSNMA Public Observation Test Phaseページが現れます。その利用規約を読みながら、スクロールします。
ページ下部にあるフォームには、ログインしたアカウントの氏名と電子メールがあらかじめ入力されています。その利用規約に同意し、電子メールでの通知の有無を選択して、Submitボタンを押します。
申込書が提出されたとのメッセージが現れました。
次にどうすべきか、わかりませんでした。
しかし、画面上部の「GSC PRODUCTS」に「OSNMA_PUBLICKEY」タブを見つけました。これをクリックして、現れたページにあるリンク「Download product pem file」をクリックすると、ファイルOSNMA_PublicKey_20210920133026.pem
がダウンロードできます。galileo-osnma実行に必要な情報は、「Public Key Point」に書かれた2行の文字列と、その前後のタグ文字列です。
ちなみに、ログインしていない状態では、「OSNMA_PUBLICKEY」タブは表示されません。
これで準備ができました。しばらくしたら、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を実行すると、黄色文字で航法メッセージ不一致を示す警告が表示されました。
すぐに、緑色のTESLA鍵の認証成功メッセージが現れて、E01
やE04
などのGalileo衛星の航法メッセージが認証されました。
また、しばらく航法メッセージ不一致の警告が現れますが、認証成功時には、tag0のほか、tag1、tag2などの認証成功メッセージが現れます。
徐々に認証成功メッセージが増えますが、時々、航法メッセージ不一致の警告が現れます。また、誤ったタグ検出を表す赤色文字のエラーも現れました。
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)も、同様の方法が用いられると予想しています。