#include "fiko/cekirdek/lisans_uzak.hpp" #include "fiko/cekirdek/kripto.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { // Gövdeyi test anahtarıyla imzala → tam politika metni (imza satırı sonda). struct TestPolitika { std::string metin, acikHex; }; TestPolitika uret(const std::string& govde) { TestPolitika t; std::string ozelHex; if (!kripto::p256AnahtarUret(ozelHex, t.acikHex)) return t; std::string imza; if (!kripto::imzala(lisansKanonikGovde(govde), ozelHex, imza)) return t; t.metin = govde + "imza=" + imza + " "; return t; } const char* GOVDE = "# FikoCAD Uzak Politika v1 " "surum=3 " "zaman=1756100000 " "mod=engelli " "engelle=FKC-2026-0001 " "engelle=FKC-2026-0007 " "mesaj=Odeme gecikmesi "; } // namespace FIKO_TEST(uzak_politika_imza_dogrulama) { const TestPolitika t = uret(GOVDE); FIKO_KONTROL(!t.metin.empty()); UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(t.metin, t.acikHex, p, hata) == UzakPolitikaDurum::Gecerli); FIKO_KONTROL(p.surum == 3); FIKO_KONTROL(p.zaman == 1756100000); FIKO_KONTROL(p.mod == UzakMod::EngelliListesi); FIKO_KONTROL(p.engelliler.size() == 2); FIKO_KONTROL(p.mesaj == "Odeme gecikmesi"); } FIKO_TEST(uzak_politika_kurcalanmis_govde_reddedilir) { const TestPolitika t = uret(GOVDE); // İçerikte tek karakter değişimi (sürüm 3→4) imzayı bozar. std::string kurcali = t.metin; const std::size_t konum = kurcali.find("surum=3"); FIKO_KONTROL(konum != std::string::npos); kurcali[konum + 6] = '4'; UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(kurcali, t.acikHex, p, hata) == UzakPolitikaDurum::ImzaGecersiz); } FIKO_TEST(uzak_politika_yanlis_anahtar_reddedilir) { const TestPolitika t = uret(GOVDE); // Başka bir anahtar çiftinin açık anahtarıyla doğrulama BAŞARISIZ olmalı. std::string ozel2, acik2; FIKO_KONTROL(kripto::p256AnahtarUret(ozel2, acik2)); UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(t.metin, acik2, p, hata) == UzakPolitikaDurum::ImzaGecersiz); } FIKO_TEST(uzak_politika_bicim_hatasi) { UzakPolitika p; std::string hata; // surum/zaman eksik → biçim hatası. FIKO_KONTROL(uzakPolitikaCoz("engelle=X ", "ab", p, hata) == UzakPolitikaDurum::Bicim); // imza yok → biçim hatası. FIKO_KONTROL(uzakPolitikaCoz("surum=1 zaman=1 ", "ab", p, hata) == UzakPolitikaDurum::Bicim); } FIKO_TEST(uzak_politika_kanonik_tolerans) { const TestPolitika t = uret(GOVDE); // CRLF + BOM + fazladan boşluk eklenmiş kopya AYNI imzayla geçmeli // (lisansKanonikGovde bunları temizler). std::string cift = "\xEF\xBB\xBF"; for (char c : t.metin) { if (c == ' ') cift += "\r "; else cift += c; } UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(cift, t.acikHex, p, hata) == UzakPolitikaDurum::Gecerli); FIKO_KONTROL(p.surum == 3); } FIKO_TEST(uzak_politika_engelli_listesi_kararlari) { const TestPolitika t = uret(GOVDE); UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(t.metin, t.acikHex, p, hata) == UzakPolitikaDurum::Gecerli); // Kara liste: listedekiler ENGELLİ, diğerleri serbest. FIKO_KONTROL(uzakPolitikaKarar(&p, "FKC-2026-0001") == UzakKarar::Engelli); FIKO_KONTROL(uzakPolitikaKarar(&p, "FKC-2026-0007") == UzakKarar::Engelli); FIKO_KONTROL(uzakPolitikaKarar(&p, "FKC-2026-0099") == UzakKarar::Izinli); // Politika yoksa / seri boşsa Belirsiz (fail-open). FIKO_KONTROL(uzakPolitikaKarar(nullptr, "FKC-2026-0001") == UzakKarar::Belirsiz); FIKO_KONTROL(uzakPolitikaKarar(&p, "") == UzakKarar::Belirsiz); } FIKO_TEST(uzak_politika_izin_listesi_kararlari) { const char* govde = "# FikoCAD Uzak Politika v1 " "surum=1 " "zaman=1756100000 " "mod=izin " "izin=FKC-2026-0010 "; const TestPolitika t = uret(govde); UzakPolitika p; std::string hata; FIKO_KONTROL(uzakPolitikaCoz(t.metin, t.acikHex, p, hata) == UzakPolitikaDurum::Gecerli); FIKO_KONTROL(p.mod == UzakMod::IzinListesi); // Beyaz liste: YALNIZ listedekiler geçer. FIKO_KONTROL(uzakPolitikaKarar(&p, "FKC-2026-0010") == UzakKarar::Izinli); FIKO_KONTROL(uzakPolitikaKarar(&p, "FKC-2026-9999") == UzakKarar::Engelli); }