forked from nihonium/linux-auth
48 lines
1.7 KiB
Go
48 lines
1.7 KiB
Go
package myfuzz
|
||
|
||
import (
|
||
"bytes"
|
||
"fmt"
|
||
"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 // норма
|
||
}
|