package audit import ( "testing" "time" ) func TestTimingSafeEqual_Correctness(t *testing.T) { a := hashCode("geheimnis-a") b := hashCode("geheimnis-a") c := hashCode("geheimnis-b") if !timingSafeEqual(a, b) { t.Fatal("identische hashes sollten gleich sein") } if timingSafeEqual(a, c) { t.Fatal("unterschiedliche hashes sollten ungleich sein") } if timingSafeEqual(a, []byte("kuerzer")) { t.Fatal("unterschiedliche laenge sollte ungleich sein") } } // Akzeptanzkriterium 3 + Pruefung 3: Timing-safe Vergleich stichprobenartig // per Laufzeitmessung verifiziert — ein Mismatch am Anfang darf nicht // messbar schneller sein als ein Mismatch am Ende (klassisches Merkmal // eines NICHT timing-safen Vergleichs wie bytes.Equal mit Short-Circuit). func TestTimingSafeEqual_NoEarlyExitTiming(t *testing.T) { reference := hashCode("referenzwert-fuer-timing-test") mismatchAtStart := make([]byte, len(reference)) copy(mismatchAtStart, reference) mismatchAtStart[0] ^= 0xFF mismatchAtEnd := make([]byte, len(reference)) copy(mismatchAtEnd, reference) mismatchAtEnd[len(mismatchAtEnd)-1] ^= 0xFF const iterations = 20000 startDur := measure(iterations, func() { timingSafeEqual(reference, mismatchAtStart) }) endDur := measure(iterations, func() { timingSafeEqual(reference, mismatchAtEnd) }) t.Logf("mismatch am anfang: %s, mismatch am ende: %s (%d iterationen)", startDur, endDur, iterations) ratio := float64(startDur) / float64(endDur) // Grosszuegige Toleranz (Faktor 3), da es ein Stichprobentest auf einer // geteilten Testmaschine ist, kein isolierter Benchmark — es geht darum, // eine grobe Short-Circuit-Implementierung zuverlaessig aufzudecken // (die haette typischerweise eine Groessenordnung Unterschied), nicht um // kryptographisch praezise Constant-Time-Beweise. if ratio > 3.0 || ratio < 1.0/3.0 { t.Fatalf("timing-unterschied zu gross (verdacht auf short-circuit-vergleich): ratio=%.2f", ratio) } } func measure(iterations int, fn func()) time.Duration { start := time.Now() for i := 0; i < iterations; i++ { fn() } return time.Since(start) }