{"id":"c0174","filename":"c0174_km_key_management.dok.json","weise3_id":"","tip":"fix","naziv":"c0172 — P0 Key Management: KM-01 do KM-10","kreator":"CC/sonnet + Ivan","datum":"2026-05-09","snippet":"","status":"DONE (KM-02..10) | KM-01 PENDING (Ivan treba pokrenuti ceremoniju)","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"fix","naziv":"c0172 — P0 Key Management: KM-01 do KM-10","datum":"2026-05-09","autor":"CC/sonnet + Ivan","prioritet":"P0","status":"DONE (KM-02..10) | KM-01 PENDING (Ivan treba pokrenuti ceremoniju)","commit":"ac95bf4","analiza":{"sto_je_otkriveno":["KM-01: GENESIS_KEY u .env plaintextu — Shamir ceremonija postoji ali NIKAD nije pokrenuta","KM-02: KRITIČNO — Shamir bi pao odmah: key je 64 bajta, _PRIME_256 secp256k1 prima prihvaća samo 32 bajta","KM-03: Nema key_version u Blok — rotacija ključa = nekompatibilan lanac bez verzioniranja","KM-04: XOR u pecat() gubi informaciju — teoretski bug, ne praktični exploit (SHA3 kolizija infeasible)","KM-05: lru_cache na get_settings() — key rotation zahtijeva restart, nedokumentirano","KM-06: GENESIS_API_KEY i GENESIS_KEY isti scope, različita kritičnost — bez jasne razlike","KM-07: Nema startup integrity check — corruptiran key tiho prolazi","KM-08: weise3() prefiks nekonzistentan: kod GENESIS::...::0, spec WEISE3::...::FENIX2026","KM-09: Nema .env.example","KM-10: Nema key custodian protokola (tko drži dionice 1,2,3,4,5)"]},"implementirano":{"KM-02":{"status":"DONE","sto":"shamir.py: migriran s secp256k1 (_PRIME_256 = 2^256-2^32-977) na M521 (2^521-1)","zasto":"M521 je 521-bitni Mersenne prime — prima 64-bajtni GENESIS_KEY (512 bita < 521 bita)","share_size":"66 bajta (field elements M521), ne key size","backward_compat":"Legacy 32-bajtni ključevi i dalje rade — auto-detekcija po duljini dionice (33b vs 67b raw)","testovi":"split 5-od-3, round-trip, rekonstrukcija, legacy 32-bajt — sve OK"},"KM-03":{"status":"DONE","sto":"core/chain.py: key_version='kv1' dodan u Blok dataclass i skuj_blok()","zasto":"Bez key_version, kad GENESIS_KEY rotira nema načina znati kojim ključem je potpisan koji blok","konstanta":"CURRENT_KEY_VERSION = 'kv1' — single point za bump pri rotaciji","backward_compat":"Blokovi bez key_version tretiraju se kao kv1 (default vrijednost)"},"KM-05":{"status":"DONE (dokumentirano)","sto":"settings.py: komentar da lru_cache zahtijeva restart za key rotation","procedura":"systemctl restart genesis.service → nova settings instanca → novi key"},"KM-06":{"status":"DONE (dokumentirano)","sto":"settings.py: jasno razdvojeni GENESIS_KEY (chain signing, nerotatabilan) i GENESIS_API_KEY (write auth, rotatabilan)","napomena":"Kod ne mijenja ponašanje, ali komentar sprječava pogrešnu rotaciju"},"KM-07":{"status":"DONE","sto":"settings.py validator: sada traži točno 128 hex znakova (stari: samo >= 64)","dodatno":"provjeri_integrity() — HMAC self-test, shamir_provjera_hash() — fingerprint"},"KM-08":{"status":"DONE","sto":"main.py lifespan: _provjeri_genesis_key() je PRVI korak pri startu","ponasanje":"Ako key nije 64 bajta ili HMAC puca → log.critical + SystemExit(1), ne silent fail","log_primjer":"KM-07 GENESIS_KEY: OK | fingerprint=0b17f840b30483a6 | duljina=64 bajta"},"KM-09":{"status":"DONE","sto":".env.example kreiran — template za novi čvor/developer"},"KM-10":{"status":"DONE","sto":"KEY_CUSTODIAN.md kreiran (gitignored) — 5 čuvara, 3-od-5 prag, DR scenariji A-D","lokacija":"/var/www/genesis/KEY_CUSTODIAN.md (ne u git — osjetljivi operativni detalji)"},"KM-04_KM-08":{"status":"ODGOĐENO","sto":"XOR u pecat() i weise3() prefiks inkonsistentnost","zasto":"Obje promjene su BREAKING za lanac — sve dosad generirane pecat i weise3_id vrijednosti bi postale nevaljane","plan":"v2 chain migration — poseban sprint s migration script + key_version bump"}},"km01_pending":{"status":"IVAN MORA NAPRAVITI","komanda":"cd /var/www/genesis && .venv/bin/python3 shamir_ceremonija.py split","sto_ce_se_desiti":["5 dionica generirano (3-od-5 prag)","Provjera hash prikazana (16 znakova) — sprema se uz ceremonijalni zapisnik","Ivan upisuje dionice 1-5 na papir","Dionice 2-5 dijele se čuvarima (Marija, Ivica, Antonio, odvjetnik)","GENESIS_KEY se ne briše iz .env — ostaje za daily operation","Shamir je disaster recovery mehanizam, ne daily startup unlock"],"napomena":"Napomena: ključ ostaje u .env za normalni rad. Shamir = što koristimo ako server izgori i trebamo rekonstruirati ključ."},"testovi":{"ZAKON.py":"29/29 zakoni prolaze (svi)","shamir_64b":"split 5-od-3, rekonstrukcija 3 različite kombinacije — OK","shamir_legacy_32b":"backward compat OK","settings_validator":"128-hex check + integrity + fingerprint — OK","blok_key_version":"skuj_blok() vraća key_version='kv1' — OK","startup_check":"fingerprint=0b17f840b30483a6 logirano pri testu"},"zakon":["ZAKON 32 — P0 fix bez chain entry = nevidljivi fix","ZAKON 2 — Bršljan je naš internet"],"_chain_meta":{"prev_entry":"c0171_genesis_sso_expiry_fix.dok.json","lanac_visina":172,"genesis_key_fingerprint":"0b17f840b30483a6"}}}