De ML-KEM en ML-DSA standaarden laten beide toe om de privésleutel op twee manieren op te slaan. Er is een kleine seed, 64 bytes voor ML-KEM en 32 bytes voor ML-DSA, en er is een grotere uitgebreide vorm die uit die seed wordt afgeleid via een hashfunctie(s). De twee zijn wiskundig equivalent en je kunt op elk moment van de seed naar de uitgebreide vorm gaan, maar je kunt niet terug. Als je moet kiezen wat je als privésleutel wilt opslaan, sla dan de seed op. Het is het werkelijke geheim waar alles uit wordt afgeleid. Je kunt het uitbreiden naar de volledige sleutel wanneer je dat nodig hebt, en het duurt ongeveer 40 microseconden, dus er is geen echte reden om de uitgebreide versie op schijf op te slaan. Als je het in het geheugen nodig hebt voor herhaalde bewerkingen, breid het dan gewoon één keer uit bij het laden. De seed zijn gewoon willekeurige bytes, dus elke waarde is een geldige sleutel. De uitgebreide vorm heeft een structuur; coëfficiënten die binnen een bereik moeten liggen, een ingebedde openbare sleutel, een hash die moet overeenkomen, en de standaard vereist dat je dat allemaal controleert bij import. Dat is veel meer oppervlak voor dingen die fout kunnen gaan, wat je niet hebt met een seed. Er is ook een aanhoudend serialisatieprobleem bij IETF waar het huidige compromisformaat zowel de seed als de uitgebreide sleutel in dezelfde datastructuur toestaat. Dat betekent dat twee conforme implementaties verschillende velden van dezelfde sleutel kunnen lezen en eindigen met verschillende sleutelmaterialen, wat niet iets is dat je wilt van een sleutelformaat. TL;DR: sla de seed op en breid deze uit bij gebruik indien nodig. Volledige beschrijving hieronder.