package myfuzz import ( "bytes" "linux-auth/internal/auth" "linux-auth/internal/db" ) // Fuzz — это функция, которую будет вызывать go-fuzz. // Принимает только []byte — все входные данные в одном байтовом потоке. func Fuzz(data []byte) int { // Инициализируем БД на каждом вызове — go-fuzz не имеет f.Cleanup() if err := db.Init("test_data.db"); err != nil { return -1 // ошибка инициализации — краш } defer db.Close() // закрываем после каждого вызова // Разделяем байты по нулевому байту (\x00) — это разделитель между username и password parts := bytes.SplitN(data, []byte{0}, 2) if len(parts) != 2 { return 0 // недостаточно данных — пропускаем } username := string(parts[0]) password := string(parts[1]) ok, err := auth.Authenticate(username, password) // Если произошла ошибка — это баг if err != nil { return -1 // краш } // Если аутентификация прошла успешно — проверяем, разрешён ли такой вход if ok { // Разрешённые пары (аналогично f.Add) if (username == "admin" && password == "admin123") || (username == "user1" && password == "password1") { return 1 // норма — это ожидаемый результат } // Неожиданный успешный вход — это баг! return -1 // краш } // Неудачная аутентификация — это нормально return 1 // норма }