31 lines
1.3 KiB
Go
31 lines
1.3 KiB
Go
// 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))
|
|
}
|