Klucze publiczne

Dwa klucze, dwa zadania. Ich rozdzielenie jest tu całym sensem: kto ma ten serwer, nie podpisze wydania, a kto ma klucz wydań, nie potrzebuje dostępu do tego serwera.

Klucz wydań — SLH-DSA-SHA2-128s

Podpisuje każdy manifest, paczkę i raport. Trzymany offline; nigdy nie dotyka tego hosta. Router ma połowę publiczną wbudowaną w obraz, w /etc/gadnet/release-public-key-slhdsa.pem - i dlatego wskazanie urządzeniu wrogiego serwera aktualizacji kończy się nieudaną aktualizacją, a nie przejęciem.

Podpisy oparte na funkcjach skrótu (NIST FIPS 205) opierają się wyłącznie na odporności skrótu na znalezienie przeciwobrazu, a tę komputer kwantowy jedynie połowi. Dlatego pochodzenie wydania potwierdza SLH-DSA, a nie klasyczny klucz GPG, który jedzie obok wyłącznie dla zgodności.

Kopia używana po stronie serwera: release-public-key-slhdsa.pem

Opublikowany zestaw kluczy

Routery uczą się nowego klucza podpisującego z tego dokumentu, który sam jest podpisany kluczem, któremu już ufają. Dlatego rotacja jest zwykłym zdarzeniem w tle, a nie nowym obrazem na każdym urządzeniu - i dlatego przejęty serwer nadal nie może wprowadzić własnego klucza.

Sekwencja 1, opublikowana 22.09.2026.

Odcisk (SHA-256) Status Ważny
66b2 74b0 ca6b 3153 c6dd 1496 ad29 5114 5925 b13c c5b4 14ad 857f 24cb b3c4 1431 current 22.09.2026 – 21.09.2028
52db 3adc d469 d1af ce92 5d73 793f 58c6 50af 5ee0 43e3 2c9d 3396 fbd3 f80a 99ea next 22.09.2026 – 21.09.2028

Jeśli router poprosi o potwierdzenie nowego klucza wydań, porównaj jego odcisk z tym z tabeli, znak po znaku.

Wersja maszynowa i jej odłączony podpis:

Odtwórz odcisk z klucza publicznego samodzielnie:

openssl pkey -pubin -in release-public-key-slhdsa.pem -outform DER | openssl dgst -sha256

Klucz tożsamości transportu — Ed25519

Podpisuje transkrypty wymiany kluczy i nic poza tym. Przypnij go w kliencie, a podmieniony serwer zostanie wykryty nawet wtedy, gdy jego certyfikat TLS się waliduje - a to jest normalna sytuacja za firmowym proxy albo portalem przechwytującym.

Klucz publiczny (base64url)
tDvaWjcAqgAev3fxt2wagFEvhM5uXbRXpY01KR-zIag
Odcisk palca
b43b da5a 3700 aa00 1ebf 77f1 b76c 1a80 512f 84ce 6e5d b457 a58d 3529 1fb3 21a8

Przejęcie tego klucza pozwala napastnikowi podszyć się pod transport. Nie pozwala podrobić wydania ani odczytać wcześniejszych sesji: sekrety sesji pochodzą z kluczy efemerycznych, które istnieją tylko na czas jednego handshake'u.

Wymiana kluczy

Zestaw: X25519MLKEM768 — X25519 w połączeniu z ML-KEM-768 (FIPS 203), w kolejności klasyczny || PQ. Noga klasyczna przetrwa złamanie ML-KEM; noga postkwantowa broni przed przeciwnikiem, który nagrywa ruch dziś, żeby odszyfrować go później.

Punkt końcowy handshake'u: POST https://updates.gadnet.pl/api/v1/kex/init

{
  "version": 1,
  "x25519_public": "<32 bajty, base64url>",
  "mlkem768_public": "<PEM SubjectPublicKeyInfo, base64url>"
}

Odpowiedź niesie efemeryczny klucz publiczny X25519 serwera, szyfrogram ML-KEM, identyfikator sesji i podpis Ed25519 nad skrótem transkryptu. Obie strony liczą potem HKDF-SHA-384 nad x25519_shared || mlkem_shared, z solą równą skrótowi transkryptu - więc naruszony handshake daje inne klucze i pierwsze uwierzytelnione żądanie się nie powiedzie.