Konekäännös, jota äidinkielinen puhuja ei ole tarkistanut. Viitteenä on englanninkielinen versio.

Vastaanottimen luottamus ja meriliikenneMuokkaa GitHubissaLähde: docs/OSNMA.md

Galileo OSNMA -vastaanottimen puolen todentaja

Galileo Open Service Navigation Message Authentication (OSNMA) -todentaja vastaanottimen puolelle, toteutettu puhtaasti Rust-kielellä. Se lukee I/NAV-sivuja ja raportoi satelliittia ja epookkia kohti, onko navigointidata kryptografisesti todennettu, ja miksi tarkistus epäonnistui.

Ohjeellinen. Tämä on analyysi- ja seurantatulos eikä tyyppihyväksytty navigointilaite. Tässä raportoitu todennustila ei ole navigoinnin eheyspalvelu, eikä sitä saa käyttää ainoana perusteena navigointia tai turvallisuutta koskevalle päätökselle.

HUOMAUTUS: Galileo OSNMA -rajapinnan immateriaalioikeudet#

Kshana ei myönnä mitään oikeuksia Euroopan unionin immateriaalioikeuksiin Galileo OSNMA Signal-in-Space Interface Control Documentissa (”ICD IPRs”). ICD:n mukana tulee sen oma valtuutus (liite E), joka on epäyksinomainen ja rojaltivapaa ja jolla on omat ehtonsa, soveltamisalansa ja rajauksensa. Jokainen, joka käyttää, rakentaa tai jakelee tähän moduuliin perustuvaa ohjelmistoa, nojaa suoraan tähän valtuutukseen ja hänen on itse luettava ja hyväksyttävä sen ehdot. Kshanan lisenssi (AGPL-3.0-only tai kaupallinen lisenssi) kattaa vain Kshanan oman koodin.

Tämä moduuli toteuttaa algoritmit, jotka alla luetellut asiakirjat kuvaavat. ICD:n tekstiä ei jäljennetä; numeeriset arvot (kenttien asettelut, luettelotyypit, MAC-hakutaulukko) esitetään uudelleen Kshanan omalla merkintätavalla, ja lähde mainitaan koodissa. ICD ja Receiver Guidelines ovat © Euroopan unioni; lähde tunnustetaan tässä. Euroopan unioni, Euroopan komissio, EUSPA tai mikään muu taho ei ole kehittänyt, käyttänyt tai hyväksynyt Kshanaa eikä tue sitä.

Viiteasiakirjat#

Julkaissut European GNSS Service Centre.

Asiakirja Versio Päivämäärä
Galileo OSNMA Signal-in-Space ICD (”SIS ICD”) Issue 1,1 lokakuu 2023
Galileo OSNMA Receiver Guidelines Issue 1,3 tammikuu 2024

Koodissa ja tässä mainitut kohta- ja taulukkonumerot viittaavat näihin versioihin.

Mitä todennetaan#

Luottamusketju juuresta dataan asti:

  1. Julkinen avain (ICD 3.2.2, 6,2). DSM-PKR kootaan uudelleen lohkoistaan ja sen Merkle-polku kuljetaan läpi luotettuun Merkle-juureen (SHA-256).
  2. KROOT (ICD 3.2.3, 6,3). DSM-KROOT kootaan uudelleen; sen ECDSA-allekirjoitus (P-256/SHA-256 tai P-521/SHA-512) tarkistetaan sen nimeämää julkista avainta vastaan NMA-otsakkeen ja ketjun parametrien yli.
  3. TESLA-avaimet (ICD 5,5, 6,4). Jokainen MACK-viestin avain kuljetaan takaisin KROOTiin tai aiempaan todennettuun avaimeen ketjun tiivistefunktiolla.
  4. MACSEQ (ICD 4.1.2, 6,6). Joustavat Tag-Info-kentät tarkistetaan MACSEQ:ta vastaan sillä avaimella, joka avaa kyseisen MACKin.
  5. Tagit (ICD 4,2, 6,7). Jokainen tagi lasketaan uudelleen (HMAC-SHA-256 tai CMAC-AES, katkaistuna ketjun tagipituuteen) satelliittien tunnisteiden, alikehyksen ajan, tagin paikan, NMA-tilan ja sen kattaman navigointidatan yli ja verrataan. Käsitellään ADKD 0 (efemeridi, kello ja tila), ADKD 4 (ajoitusparametrit) ja ADKD 12 (hidas MAC, avain julkaistaan kymmentä alikehystä myöhemmin), sekä sellaisten satelliittien ristiintodennus, jotka eivät itse kanna OSNMA:ta, ja dummy-tagit (COP 0).

Tagi, joka nimeää varatun arvon tai jonka ADKD ei vastaa MAC-hakutaulukon paikkaa, jätetään sivuun (Receiver Guidelines kehottaa hylkäämään sen) ja raportoidaan tilana discarded, ei epäonnistumisena.

Sivut tarkistetaan CRC:llä (Galileon CRC-24Q) ennen mitään muuta; sivu, joka ei läpäise tarkistusta, pudotetaan ja raportoidaan (bad_crc).

Tilaarvot#

Tagia kohden: authenticated, failed perusteella (tag_mismatch, macseq_mismatch, key_chain_mismatch, key_conflict), pending perusteella (no_chain, awaiting_key, no_nav_data, unknown_maclt, unsupported_function, service_not_usable, chain_mismatch) tai discarded. Dummy-tagi (COP 0) näkyy tagitasolla tilana authenticated, koska se todistaa avaimen, mutta se ei kata navigointidataa eikä koskaan lasketa satelliitille.

Satelliittia kohden siinä muodossa, jota receiver-trust-monitori kuluttaa:

  • Authenticated vain niin kauan kuin uusin varmennettu efemeridi- ja kellodata (ADKD 0 tai
    1. satelliitin osalta on tuoretta (oletuksena 600 s:n sisällä varmentajan ajasta) ja on edelleen käytössä oleva data. Tarkistus kohdistuu dataan, ei IODnav-arvoon: varmentaja pitää kirjaa todennetun bittijonon SHA-256:sta (Word Types 1–5 sellaisina kuin ADKD 0 ne kattaa) sekä satelliitin lähettämän uusimman tällaisen jonon, ja niiden on oltava yhtäläiset. Kopioitu IODnav muiden sanojen päällä tai muutetut Word Type 5 -bitit (jotka eivät kanna IODnav-arvoa) tuottavat tilan Unavailable, kunnes uusi data todentuu. Alikehys, joka kantaa efemeridisanoja mutta ei täydellistä Word Types 1–5 -joukkoa yhden IODnav-arvon alla, poistaa tilan samalla tavoin (jokainen aito E1-B-alikehys kantaa kaikki viisi); alikehys, jossa ei ole lainkaan efemeridisanoja, ei kerro mitään. Toisen satelliitin tagit (ristiintodennus) lasketaan sille satelliitille, jonka dataa ne kattavat.
  • Failed, kun satelliitin dataa koskeva tarkistus epäonnistui virhemuistin sisällä (oletuksena 600 s varmentajan ajasta), vaikka myöhempi data todentuisi. Epäsuhta merkitään sille satelliitille, jonka dataa tagi kattaa, ja sille satelliitille, joka lähetti tagin, koska kumpi tahansa voi olla vialla; MACSEQ-epäsuhta merkitään lähettävälle satelliitille.
  • Unavailable muuten sekä jokaiselle satelliitille varmennetun hälytysviestin jälkeen, NMA-tilassa "don't use" tai varatussa tilassa, ja siihen asti, kunnes ensimmäinen avain on todentunut.

Kokonaisarvo on Failed, jos mikä tahansa satelliitti epäonnistui, Authenticated, jos vähintään yksi on todennettu eikä yksikään epäonnistunut, muuten Unavailable. $PKSOS,<A|F|N>[,<sat>:<A|F|N>...] on vastaava lause; kshana::osnma::pksos_sentence rakentaa sen.

Aika#

Avainketju osoittaa, että avain kuuluu tietylle alikehykselle, ei sitä, että alikehys on nykyinen. Varmentaja ei siksi koskaan ota "nyt"-hetkeä todentamattomalta sivulta. Sen aika on myöhäisempi kahdesta: funktiolla set_reference_time (--reference-time) annettu vertailuaika ja viimeisimmän todentuneen TESLA-avaimen alikehys (avainta ei voi tuntea ennen sen paikkaa, joten se todistaa ajan olevan vähintään tämä). Virhemuisti, todennuksen voimassaoloikkuna ja vanhan datan poisto toimivat tämän ajan mukaan. Alikehys, joka on leimattu yli kolme alikehystä viimeisimmän todentuneen avaimen jälkeen, jätetään sivuun, ellei sen oma avain todista sen aikaa; avain- ja hälytysviestit siinä käsitellään silti, koska ne kantavat oman todisteensa (allekirjoituksen tai Merkle-juuren).

Kello seisoo, kun OSNMA lakkaa, koska vain avaimet siirtävät sitä. Live-kutsujan on kutsuttava set_reference_time isäntäajalla joka alikehys; todennus vanhenee silloin itsestään, ja poll_clock (ajetaan myös joka alikehys) palauttaa tapahtuman KeyStall, kun yksikään avain ei ole todentunut pidempään kuin todennusikkuna.

Se, mitä tämä ei anna, on tuoreus. Ilman vertailuaikaa lähteestä, jota hyökkääjä ei voi siirtää, vanhan aidon datan toisto vanhoilla leimoilla todentuu, ja sivuleimat ovat vain lähteensä veroisia: komentorivi kertoo tämän (freshness: NOT enforced) aina, kun vertailuaikaa ei ole annettu. Vertailuajan kanssa toleranssi on alle yksi alikehys (oletus 29 s; suuremmat arvot hylätään). Vertailuaika on yksi hetki: alikehykset, jotka ovat siitä toleranssia kauempana, jätetään sivuun ja lasketaan, joten se sopii live- tai juuri tallennetulle datalle, ei pitkälle tallenteelle. Tallenteelle jätä vertailuaika pois ja lue tulos muodossa "autenttinen, ei välttämättä tuore". Receiver Guidelines antaa muodollisen vaatimuksen.

u-blox-virran sivuleimat tulevat itse todentamattomasta datasta (ks. Syöte), joten nekään eivät anna tuoreussuojaa.

Ketjut, avaimet ja hälytykset#

Varmennetut ketjut säilytetään ketjutunnuksen (CID) mukaan; tagit tarkistetaan NMA-otsikon nimeämällä ketjulla, ja otsikko, joka nimeää varmentamattoman ketjun, jättää alikehyksen tagit tarkistamatta (chain_mismatch). Voimassa olevan ketjun toinen KROOT lisää ankkurin; toisen ketjun KROOT säilytetään rinnalla, joten vanhan ketjun uudelleen ilmoittaminen uusimisen jälkeen ei kumoa uutta.

NMA-otsikkoa ei todenneta, joten se, mitä se ilmoittaa, lasketaan vain vahvistettuna: kun useampi kuin yksi satelliitti lähettää saman otsikon alikehyksessä tai kun varmennetun KROOTin allekirjoitettu viesti sisältää sen (otsikko on osa tuota viestiä). Nämä kaksi eivät ole yhtä vahvoja. Useamman kuin yhden satelliitin yhtäpitävyys suojaa yksittäisen satelliitin poikkeamalta, ei harhauttajalta: yksi harhauttaja voi väärentää kaksi satelliittitunnusta. Sillä saa aikaan palvelunestoa eikä muuta, koska vahvistettu "don't use" tyhjentää jokaisen satelliitin todennetun datan: sen poistaminen, väärennetty tai aito, ei palauta mitään ennen kuin uudet tagit todentuvat aitojen operatiivisten alikehysten alla. (Ennen tuota tyhjennystä väärennetty poisto saattoi palauttaa jo todennettua dataa enintään todennusikkunan ajaksi.) Todellinen vahvistus on KROOT-allekirjoitettu otsikko, joka myös poistaa "don't use" -tilan uudelleen, kun se kantaa operatiivista tilaa. Yksittäisen satelliitin otsikko ei muuta mitään paitsi oman alikehyksensä tagien tarkistusta. KROOT, jonka sovellettavuusaika ei ole myöhäisempi kuin samalle tunnukselle pidetyn ketjun (vanhemman toisto), hylätään (stale); saman ketjun KROOT lisää ankkurin.

Vahvistetun otsikon tila ja CPKS-arvo ohjaavat peruutusta. NMA-tilassa "don't use" CPKS "chain revoked" pudottaa otsikon nimeämän ketjun ja hylkää sen KROOTin tästä lähtien; CPKS "public key revoked" pudottaa julkisen avaimen, joka allekirjoitti kyseisen ketjun, sekä jokaisen sillä allekirjoitetun ketjun. Jos kyseisen tunnuksen korvaava ketju otettiin käyttöön ennen otsikon vahvistamista, kuinka paljon ennen tahansa, peruutettu avain on edellisen ketjun, ei uuden; tämä muisti säilytetään, kunnes peruutus on suoritettu tai toisen menettelyn otsikko vahvistetaan, ja joka alikehyksessä toistuva peruutusotsikko suoritetaan kerran. Samat CPKS-arvot operatiivisella tilalla merkitsevät siirtymää korvaavaan eivätkä peruuta mitään. Otsikkoa ei itsessään todenneta, joten väärennetty peruutus voi vain viedä todennuksen pois, ja se on lopullinen, kunnes varmentaja käynnistetään uudelleen. Tämä lopullisuus koskee myös käytössä olevaa avainta: väärennetty julkisen avaimen peruutus nollaa syrjäytetyn avaimen muistin ja peruuttaa käytössä olevan avaimen, ja vain uudelleenkäynnistys kumoaa sen.

DSM-PKR, jonka NPKT on 4, on hälytysviesti; se varmennetaan Merkle-puun kautta kuten avain, ja sen satunnainen NPK-kenttä on osa lehteä. Varmennettu hälytys tyhjentää kaikki ketjut ja julkiset avaimet, hylkää jokaisen myöhemmän KROOTin ja julkisen avaimen ja asettaa jokaisen satelliitin tilaan Unavailable, kuten Receiver Guidelines määrää, kunnes varmentaja käynnistetään uudelleen.

DSM-KROOTin täytekenttä on allekirjoitetun viestin ja allekirjoituksen tiiviste. Se tarkistetaan ennen allekirjoitusta, ja se kertoo myös, millä NMA-otsikolla allekirjoitettu viesti rakennettiin, kun otsikko muuttui viestiä koottaessa.

Mitä ei varmenneta tai ei harjoiteta#

  • Tuoreus. Ks. Aika edellä: se vaatii vertailuajan ulkopuolelta.
  • Uusiminen ja peruutus. Ketjuja ja avaimia seurataan siinä laajuudessa kuin julkaistujen vektorien virrat niitä harjoittavat (uusiminen, ketjun loppu, ketjun ja avaimen peruutus, uusi julkinen avain, uusi Merkle-puu, hälytys), ei jokaista ICD:n sallimaa tapausta. Todentamattoman otsikon ilmoittama peruutus uskotaan sellaisenaan ja se on lopullinen istunnolle. Uusi Merkle-puu otetaan käyttöön vain varmentajalle annetun Merkle-juuren kautta.
  • Merkle-puun tiiviste. DSM-PKR-viestit tarkistetaan SHA-256-puulla. SHA3-256-puuta, jonka ICD sallii tulevaisuudessa, ei tueta. Ketjun tiivistefunktio voi olla SHA-256 tai SHA3-256.
  • Avainten tilaluettelot. Peruutusta seurataan NMA-otsikon ja virran viestien kautta; varmenteiden peruutuslistoja ei lueta.
  • Todennetun datan kattavuus. ADKD 4 ja COP 1 parittomassa alikehyksessä lähetettynä ei voi todentua (Word Type 10 voidaan lähettää yhtä tai kahta alikehystä aiemmin); tämä maksaa vain saatavuutta, ei koskaan oikeellisuutta.
  • Vakioaikainen toiminta. Ei tarjota eikä tarvita: varmentaja ei pidä salaisuuksia (vain julkisia avaimia, julkaistuja ketjuavaimia ja vastaanotettua dataa).
  • Signaali ja datan laatu. Sivut tarkistetaan CRC:llä ja hälytyssivut pudotetaan, mutta signaalista, jolla ne saapuivat, ei tiedetä mitään. I/NAV-sanojen 1–4 Reed-Solomon-palautusta ei käytetä: data on vastaanotettava suoraan.
  • Ei paikan eheyspalvelu. Todennus kertoo, että data tuli järjestelmästä. Se ei kerro mitään signaalista, jolla se saapui, tai paikkaratkaisun laadusta.

Syöte#

  • Pelkkä sivumuoto. Yksi sivupari riviä kohden: <svid> <gst_seconds> <60 hex digits>, kommentit # sallittu. gst_seconds on GST sekunteina (week * 604800 + time of week) sivun alussa; heksa on parillisen ja parittoman puoliskon 240 bittiä (hännät mukaan lukien), merkitsevin bitti ensin.
  • Testivektori-CSV. Julkaistujen vektorien asettelu (SVID,NumNavBits,NavBitsHEX). Aloitusaika tulee valitsimesta --start-gst tai päivätystä tiedostonimestä.
  • u-blox UBX-RXM-SFRBX. Raaka UBX-tavuvirta (--format ubx, tunnistetaan automaattisesti). Galileo E1-B I/NAV -viestit rakennetaan uudelleen sivupareiksi (src/osnma/ubx.rs); muut järjestelmät, E5b, hälytyssivut ja kehykset, joiden tarkistussumma on virheellinen, ohitetaan. SFRBX ei kanna aikaa, joten jokainen sivu leimataan oman datansa sisällä olevasta ajasta (sanatyypit 5 ja 0) ja hyväksytään vain, jos peräkkäiset aikaa kantavat sivut täsmäävät niiden välillä vastaanotettujen sivujen määrään; sivut, joita ei voi sijoittaa, pudotetaan, ei koskaan arvata. Tämä aika tulee itse datasta eikä anna tuoreussuojaa (ks. Aika edellä). Signaalitunnus 0 (E1-C) ei kanna dataa, joten sen hyväksyminen E1-B:n rinnalla on vaaratonta. Eksyvä synkronointipari, jolla on mieletön pituus, ei estä lukijaa. Kehystyskoodi on kolmas kopio UBX-kehystyksestä puussa (src/realdata/ubx.rs, receiver-trust-sisäänluku); se pidetään erillään, jotta receiver-trust-toiminta pysyy ennallaan, ja nämä kolme voisivat myöhemmin jakaa yhden lukijan. SFRBX-viestin sanasuunnittelu on otettu julkisista kuvauksista ja tarkistettu vain synteettisillä kehyksillä, ei elävällä vastaanottimella.

Komentorivi#

kshana osnma verify <input> [--format pages|vector-csv|ubx] [--start-gst SECONDS]
    [--merkle-root HEX] [--public-key ID:TYPE:HEX]
    [--reference-time SECONDS [--max-time-error SECONDS]] [--epochs] [--json]

Tekstitulos antaa tilan satelliittia kohden ja valitsimella --epochs tagia ja epookkia kohden; --json antaa saman tagiluettelon kanssa. Poistumistila 3 tarkoittaa, että jonkin satelliitin dataa koskeva tarkistus epäonnistui, 2 tarkoittaa käyttö- tai syötevirhettä. Edellä oleva ohjeellinen huomautus tulostetaan ensin jokaisella polulla, myös virheiden ja käyttöohjeen yhteydessä.

Pythonista ja WebAssemblystä#

kshana.osnma_verify(data, format="", start_gst=None, merkle_root_hex="", public_keys=None, reference_time=None, max_time_error=None) (Python) ja osnma_verify(input_base64, format, start_gst, merkle_root_hex, public_keys, reference_time, max_time_error) (WebAssembly) ajavat saman varmentajan muistissa oleville tavuille ja palauttavat JSON-tulosteen, jonka kshana osnma verify --json tulostaa, ohjeellinen huomautus mukaan lukien. MCP-palvelin ei sisällä sitä: syöte on pitkä raaka vastaanotinvirta, jota komentorivi ja Python palvelevat paremmin, ja agenttityökalu lisäisi suuren syötepinnan ilman hyötyä. Sama ohjeellinen huomautus ja samat rajoitukset pätevät; tila ei ole navigoinnin eheyspalvelu.

Testit ja testidata#

Testidata on synteettistä, ja Kshanan oma koodi ja testit tuottavat sen. Tähän arkistoon ei ole tallennettu ICD:n tai Guidelinesin vektoreita, läpikäytyjä esimerkkejä tai avainmateriaalia. Oletustestit (tests/osnma_synthetic.rs ja yksikkötestit) rakentavat ketjun, sivut ja tagit yhtälöistä ja tarkistavat johdonmukaisuuden sekä sen, että tahallinen vioittaminen havaitaan: käännetty navigointibitti, käännetty avainbitti, toistetut tagit, väärät aikaleimat, vertailun ulkopuolella oleva aika, puuttuva data sekä katselmuksessa löydetyt hyökkäykset (väärennetty kaukaisen tulevaisuuden alikehys, jonka ei pidä pyyhkiä virhettä, todennus, jonka on vanhennuttava ja seurattava IODnav-arvoa, hälytys, NMA-tila "don't use", dummy-tagit, MACSEQ-epäsuhta, ristiriitaiset avaimet, ketjun peruutus ja uusiminen, virheellinen täyte tai allekirjoitus), ja CMAC-AES, SHA3-256-ketju ja P-521-allekirjoitus kuljetetaan varmentajan läpi. Koska tämä data tulee omasta ICD-tulkinnastamme, se osoittaa sisäistä johdonmukaisuutta, ei vaatimustenmukaisuutta.

Primitiivit tarkistetaan julkaistuja tunnettujen vastausten testejä vastaan, joista yksikään ei ole ICD:stä: RFC 4231 (HMAC-SHA-256), RFC 4493 (CMAC-AES-128), FIPS 197 (AES), FIPS 202 (SHA3-256) ja RFC 6979 (ECDSA P-256). P-521-allekirjoitukset tarkistetaan koodauksen ja tiivisteen valinnan osalta testissä tehdyllä kertakäyttöavaimella; käyrän aritmetiikka on kirjaston.

Vastaavuus virallisiin vektoreihin tarkistetaan testillä tests/osnma_official_vectors.rs, joka on vapaaehtoinen: se lukee kopion virallisesta testivektoriarkistosta, jonka lataat itse, muuttujan KSHANA_OSNMA_VECTORS nimeämästä hakemistosta, eikä tee mitään, kun muuttujaa ei ole asetettu. Se ei tallenna eikä jaa uudelleen mitään, eivätkä oletustestiajot käytä verkkoa. Se antaa varmentajalle vain Merkle-juuren ja yhden puun julkiset avaimet, kuten vastaanotin saisi, joten ketjut muodostetaan virran allekirjoitetusta DSM-KROOTista ja koko polku ajetaan: Merkle, allekirjoitus, avainketju, MACSEQ ja tagit. Se varmistaa vektorijoukkoa kohden todennettujen tagien alarajan, ettei yksikään epäonnistunut, mitkä ketjut ja avaimet virta ilmoittaa, ADKD 0-, 4- ja 12-tagien todentumisen, että todennus jatkuu ketjun lopun, ketjun peruutuksen, avaimen peruutuksen ja uuden julkisen avaimen jälkeen, että hälytysviesti varmentuu eikä jätä mitään todennetuksi, ja että jokainen vektori käyttää vain HMAC-SHA-256:ta, SHA-256-ketjua, 128-bittisiä avaimia, 40-bittisiä tageja ja hakutaulukon merkintöjä 33 ja 34. ICD:n muut algoritmi- ja parametrivalinnat katetaan siksi vain edellä mainituilla tunnettujen vastausten ja synteettisillä testeillä.

Riippuvuudet#

RustCrypto-paketit, puhdasta Rustia, MIT OR Apache-2.0, rakennettu ilman oletusominaisuuksia: hmac, cmac, aes, sha3, p256 ja p521 (ominaisuus ecdsa, käytetään vain varmennukseen), sekä puussa jo oleva sha2. Ne rakentuvat kohteeseen wasm32-unknown-unknown ja läpäisevät komennon cargo deny.