Microsoft hat am 10. Juli 2024 im DirectX Developer Blog angekündigt, den Hashing-Algorithmus des DXIL-Validators offenzulegen und in den quelloffenen DirectX Shader Compiler (DXC) auf GitHub zu integrieren. Verfasst wurde die Ankündigung von Chris Bieneman, Compiler Engineer im DirectX-Team. Bislang war dieser Algorithmus Teil der geschlossenen DXIL.dll, die ausschließlich für Windows als signiertes Binary ausgeliefert wurde. Die Offenlegung erlaubt es Entwicklern erstmals, gültige DirectX-Shader auch außerhalb von Windows zu erzeugen und zu signieren.
Funktion des Validator-Hashes
Der DXIL-Validator prüft kompilierte Shader-Binaries auf Konformität mit der DirectX-Spezifikation. Nach erfolgreicher Prüfung wird ein nicht kryptografischer Hashwert berechnet und in das Shader-Binary eingebettet. Zur Laufzeit vergleicht der Treiber den eingebetteten Wert mit dem selbst berechneten Hash. Stimmen beide überein, gilt der Shader als validiert. Laut der zugehörigen Spezifikation INF-0004 basiert das Verfahren auf einer Public-Domain-Implementierung von MD5 gemäß RFC 1321, weicht jedoch in der Konstruktion des letzten Nachrichtenblocks und der Größenkodierung vom Standard ab. Es existieren zwei Varianten: ein Retail-Hash sowie ein Debug-Hash, dessen abweichende Sentinel-Werte Shader kennzeichnen, die nur im Debug-Modus ausführbar sind.
Begründung und Auswirkungen auf das Tooling
Die bisherige Geheimhaltung beruhte auf der Annahme, dass die fehlende Veröffentlichung des Algorithmus als Sicherungsmechanismus diene. Diese Annahme ist laut Spezifikation hinfällig, da der Algorithmus bereits von Dritten rekonstruiert und auf GitHub publiziert wurde. Microsoft verweist zudem darauf, dass sich vorgebaute Binaries nicht für alle benötigten Linux- und Unix-Varianten verteilen lassen. Entwickler von Mapping-Schichten, Debugging-Werkzeugen und Build-Umgebungen außerhalb von Windows mussten den Algorithmus daher bislang per Reverse Engineering nachbilden. Mit der Offenlegung entfällt dieser Schritt. Ergänzend führt Microsoft Sentinel-Hashes ein, darunter BYPASS und PREVIEW_BYPASS, die über das Agility SDK ab Version 1.615 zur Laufzeit erkannt werden. Neue D3D12-APIs in der Debug-Layer erlauben es zudem, nicht gehashte Shader gezielt zu validieren. Der Schritt passt zu Microsofts Linie, plattformübergreifendes Entwickler-Tooling zu stärken, wie sie zuletzt auch rund um die GDC-Auftritte des Xbox-Teams sichtbar wurde.