Alle projecten

Open source

Post-quantum fixes in overheidscode

Drie pull requests naar open-source projecten van het ministerie van VWS, de gemeente Amsterdam en de Fundament-community. Elk begon als bevinding in PQNavigator en eindigde als wijziging die vandaag veilig te mergen is.

Het probleem

Een scanrapport vol "quantum-kwetsbare" bevindingen is makkelijk te maken en makkelijk te negeren. Maintainers hebben een wijziging nodig die iets echts oplost, productie niet breekt en zichzelf uitlegt. Ik wilde laten zien dat de post-quantum migratie kan beginnen met kleine stappen die goed te reviewen zijn.

Drie fixes, drie patronen

  • Maak het algoritme configureerbaar (VWS)

    Een proxy ondertekende zijn login-JWT met een hardcoded RS256-constante. Ik maakte het algoritme configureerbaar, standaard ML-DSA-65 (FIPS 204) met automatische terugval op RS256 als er nog geen post-quantum sleutel is. Productie werkt ongewijzigd door tot de sleutels er zijn.

  • Verkort de looptijd als overstappen nog niet kan (Fundament)

    Een Kubernetes-operator maakte een RSA-4096-CA die 10 jaar geldig was. cert-manager kan nog geen ML-DSA-certificaten uitgeven, dus overstappen kon niet. Ik verkortte de looptijd naar 3 jaar met een vernieuwingsvenster van 90 dagen. Zo blijft alles wat de CA ondertekent korter kwetsbaar.

  • Bescherm data die jarenlang geheim moet blijven (Amsterdam)

    Een proxy naar de Basisregistratie Personen verwerkt burgerservicenummers. Ik voegde optionele hybride post-quantum TLS (X25519MLKEM768) toe tegen “harvest now, decrypt later”, en zette de BSN-versleuteling om van Fernet (AES-128) naar AES-256-GCM.

Keuzes en afwegingen

Elke wijziging is optioneel of heeft een terugval. Een maintainer kan mergen zonder dat productie verandert, en het aanzetten wanneer het team er klaar voor is. Dat weegt zwaarder dan cryptografisch perfect zijn.

Meten in plaats van gokken. Een ML-DSA-65-handtekening laat de JWT groeien van 658 naar 4.733 bytes: prima voor een server-naar-server-call, maar goed om te weten. Voor de CA toetste ik de nieuwe looptijd aan de ongelijkheid van Mosca (X + Y < Z) en schreef ik een design record over de weg naar een echte ML-DSA-CA.

Tests bewijzen dat het werkt. De TLS-wijziging heeft een echte loopback-handshaketest, zodat vaststaat dat de nieuwe instelling iets doet en niet alleen door de config-parser wordt geaccepteerd.

Resultaat

Drie pull requests, 432 regels toegevoegd in 16 bestanden, elk onderbouwd met het PQC-migratiehandboek van AIVD, CWI en TNO. Ze staan open voor review; de status op deze site werkt zichzelf bij vanaf GitHub.

De pull requests

joey.oosenbrug@gmail.com