Гид контрибьютора tessera
Этот документ — гид для разработчика, который впервые открывает репозиторий и хочет внести изменение. Цель: рабочее окружение, прохождение тестов и первый PR за один день.
1. Локальная сборка
Заголовок раздела «1. Локальная сборка»1.1 Системные зависимости
Заголовок раздела «1.1 Системные зависимости»Astra Linux SE / Ubuntu 22.04 / Debian 12:
sudo apt install -y \ build-essential pkg-config \ libssl-dev libudev-dev libdbus-1-dev libpam0g-dev libsystemd-dev \ softhsm2 opensc opensc-pkcs11 \ pamtester clangToolchain Rust — фиксирован в rust-toolchain.toml.
При наличии rustup toolchain скачивается автоматически:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shrustup show # выберет версию из rust-toolchain.toml1.2 Сборка
Заголовок раздела «1.2 Сборка»cargo build --workspacecargo build --workspace --release1.3 Cargo features
Заголовок раздела «1.3 Cargo features»-
Default: без специальных фич.
-
tessera_core/pkcs11-tests— включает интеграционные тесты, требующие реальногоgost-engineили softhsm2:Окно терминала cargo test --workspace --features tessera_core/pkcs11-tests
2. Тесты
Заголовок раздела «2. Тесты»2.1 Юнит и обычные интеграционные тесты
Заголовок раздела «2.1 Юнит и обычные интеграционные тесты»cargo test --workspaceВсе unit- и integration-тесты должны проходить.
2.2 Интеграционные тесты с softhsm2
Заголовок раздела «2.2 Интеграционные тесты с softhsm2»sudo apt install softhsm2 opensc-pkcs11softhsm2-util --init-token --slot 0 \ --label test --pin 1234 --so-pin 5678SOFTHSM2_CONF=/etc/softhsm/softhsm2.conf \ cargo test --workspace --features tessera_core/pkcs11-testsPKCS#11-тесты добавляют дополнительный набор интеграционных проверок
(загрузка модуля, поиск сертификата, проверка CKA_EXTRACTABLE).
2.3 Smoke с pamtester
Заголовок раздела «2.3 Smoke с pamtester»Требует Linux + root + установленный tessera:
# В отдельной VM Astra SE 1.7.5:sudo apt install ./target/release/tessera_0.1.1-1_amd64.debsudo /usr/share/tessera/integrate-pam.sh --mode=2fa /etc/pam.d/sudopamtester sudo alice authenticate3. Pre-commit hooks
Заголовок раздела «3. Pre-commit hooks»В корне репозитория поставляется
.pre-commit-config.yaml. Установка:
pip install pre-commitpre-commit installЧто проверяется при коммите:
cargo fmt --all -- --check;cargo clippy --workspace --all-targets -- -D warnings;cargo deny check;cargo test --workspace;markdownlint-cli2 "**/*.md"(для*.mdфайлов в коммите).
Если у вас нет pre-commit-фреймворка, можно запускать команды
вручную:
cargo fmt --all -- --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspace4. Стиль коммитов
Заголовок раздела «4. Стиль коммитов»Формат — Conventional Commits:
<type>(<scope>): <subject>
<body>
<footer>Примеры:
feat(monitord): добавлена обработка suspend/resume через D-Busfix(core): исправлена проверка свежести CRL при mode = "crl"docs(install): добавлен сценарий для Mode A с FAT32-носителемchore: обновлена зависимость serde до 1.0.xrefactor(proto): переименован Pong в HelloAck для консистентностиtest(monitord): добавлен e2e-тест suspend_grace
<scope> соответствует крейту или модулю: monitord, core, proto,
pam, install, arch, security, release, dev.
5. Workflow PR
Заголовок раздела «5. Workflow PR»-
Branch off
main:Окно терминала git checkout -b feat/awesome-feature main -
Атомарные коммиты: один логически целостный коммит за раз. PR обычно содержит 1–5 коммитов.
-
Авто-запуск CI: GitHub Actions (
.github/workflows/build-deb.yml) проверяет:cargo fmt;cargo clippy;cargo test;- сборку
.deb; lintian.
-
Code review checklist:
- есть ли тест на новую функциональность?
- обновлены ли соответствующие docs (configuration, architecture, threat-model)?
- не появилось ли новое поле в TOML без документации?
- не нарушает ли изменение fail-closed инварианты (см. architecture.md §13)?
- reproducible build не сломался?
-
Слить через squash + rebase merge. Большие PR — review по 3–5 коммитов; squash в
mainдля чистой истории.
6. Как добавить новый PKCS#11-провайдер
Заголовок раздела «6. Как добавить новый PKCS#11-провайдер»Текущая поддержка реализована в
crates/tessera_core/src/token/.
Шаги:
- Изучить интерфейсы (
PkcsModule,Session,Slot). - Реализовать новый адаптер в подмодуле (например,
token/newvendor/). - Зарегистрировать его через
crypto_backend = "pkcs11_native"с указаниемpkcs11_module = "/usr/lib/libnewvendor.so". - Добавить тесты:
- positive: загрузка модуля + поиск сертификата;
- negative: модуль не загрузился (несуществующий путь);
- non-extractable: проверка
CKA_EXTRACTABLE = false.
- Обновить документацию:
- README.md — раздел «Поддерживаемые токены»;
- docs/install.md — раздел установки драйвера;
- docs/configuration.md — таблица модулей;
- docs/threat-model.md — §3.3 (если меняется модель угроз).
7. Как добавить новый источник host_id
Заголовок раздела «7. Как добавить новый источник host_id»См. crates/tessera_core/src/host_identity/.
Шаги:
- Создать модуль
<source>.rsс реализацией трейтаHostIdSource. - Зарегистрировать в
chain.rs(HostIdentityResolver::from_validated). - Добавить в
RawHostIdentity::sources(валидация имени). - Добавить в
HostIdSourceKind(ssoc-енум). - Тесты:
- positive: источник возвращает значение;
- negative: источник недоступен → следующий в chain срабатывает.
- Обновить docs/configuration.md (таблица
[host_identity]) и architecture.md §12.
7.1 Где живёт логика авторизации сертификата
Заголовок раздела «7.1 Где живёт логика авторизации сертификата»Авторизация «какой пользователь на каком хосте» полностью описана в самом сертификате через X.509-расширения и проверяется в коде:
crates/tessera_core/src/x509/host_binding_ext.rs— парсинг расширенияpam_cert_host_binding(OID и ASN.1-структура — вx509/oids.rs).crates/tessera_core/src/x509/user_binding_ext.rs— парсинг расширенияpam_cert_user_binding.verify_cert_scope— финальная сверка распарсенных записей сhost_id_hashиpam_user. См. также docs/cert-issuance.md для семантики записей.
8. Версионирование
Заголовок раздела «8. Версионирование»Семантика SemVer 2.0.0:
- MAJOR — breaking changes (несовместимые изменения схемы
config.toml, IPC-протокола, удалённые опции конфигурации). - MINOR — backward-compatible новая функциональность (новый PKCS#11-провайдер, новый источник host_id, новый стейдж в hooks).
- PATCH — bug fixes, doc updates, обновления зависимостей без изменения API.
Каждый MAJOR-релиз требует:
- миграционной заметки в docs/changelog.md;
- обновления
PROTOCOL_VERSIONвcrates/tessera_proto/src/version.rs(если изменяется wire-протокол); - обновления модели угроз (docs/threat-model.md).
9. Дальнейшее чтение
Заголовок раздела «9. Дальнейшее чтение»Git hooks
Заголовок раздела «Git hooks»The repo ships hooks in scripts/git-hooks/ that block commits and pushes to
main on weekdays between 08:00 and 19:00 local time. Enable them once per
clone:
git config core.hooksPath scripts/git-hooksgit commit --no-verify / git push --no-verify override in emergencies.