// Package timingsafe stellt die kanonische Implementierung der projektweiten // Coding-Konvention aus IAM-15 bereit: jeder Vergleich, der eine // sicherheitsrelevante Zugriffsentscheidung trifft (Passwort-Hash, Token, // Signatur, 2FA-Wiederherstellungscode), nutzt einen timing-safe/constant-time // Vergleich, nie den regulaeren ==-Operator. Siehe docs/CODING-GUIDELINES-CORE.md. // // Bestehende Vergleichsstellen (internal/totp, internal/webhook, // internal/moduleregistry) implementieren dasselbe Muster bereits inline mit // crypto/subtle direkt — dieses Package buendelt es fuer neue Vergleichsstellen, // ersetzt die bestehenden nicht zwangsweise (kein Umbau angrenzender Bereiche). package timingsafe import "crypto/subtle" // Equal vergleicht zwei Byte-Slices timing-safe. Unterschiedliche Laenge gilt // als "nicht gleich", ohne dass die Laufzeit dabei die Laenge verraet, die // zum Ergebnis gefuehrt hat, mehr als durch den Laengenunterschied ohnehin // unvermeidbar waere. func Equal(a, b []byte) bool { if len(a) != len(b) { return false } return subtle.ConstantTimeCompare(a, b) == 1 } // EqualString ist die String-Variante von Equal fuer den haeufigen Fall, // dass beide Seiten bereits als string vorliegen (z. B. TOTP-Codes). func EqualString(a, b string) bool { return Equal([]byte(a), []byte(b)) }