michael 56ba4dd924 feat(pam): recovery-code mode with Argon2id verify and pending re-enroll handoff
C-side:
* New mode=recovery argv branch in pam_sm_authenticate. Reads the two-line
  /var/lib/authforge/recovery/<user> file, argon2_verify against PAM_AUTHTOK,
  on match unlinks the file (one-shot) and writes pending(re_enroll=true).
  Always returns PAM_IGNORE on failure paths so a missing/wrong code never
  blocks normal auth.
* Makefile links -largon2 alongside -lpam.

Daemon-side:
* policy_apply::render_profile renders the recovery line first in the auth
  stack with [success=done default=ignore] — successful recovery short-
  circuits the rest, missing/wrong code falls through.
* New policy_apply test asserts the recovery line precedes the default
  backstop.

Doc:
* pam/TESTING.md adds libargon2-dev to the build prereqs and a new
  Smoke test 4 walking through the manual recovery-code flow.

C compile gate (make -C pam) requires libargon2-dev — flagged as a
deferred verification step until a host with the dev package is available.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 09:49:44 -07:00

authforge

Turnkey U2F / FIDO2 passkey / TOTP MFA for Linux desktops. v1 ships on Ubuntu LTS + GNOME; Debian and KDE Plasma are on the roadmap.

Install (end users)

sudo add-apt-repository ppa:dangerousthings/authforge
sudo apt install authforge

Build from source

See docs/BUILDING.md.

Status

Pre-alpha. Phases 07, 15, 16 code complete (workspace scaffold, D-Bus daemon, storage layer, FIDO2 backend, policy apply via pam-auth-update with lockout simulation, PAM pending-flag backstop, authforgectl CLI, gnome-control-center overlay, Ansible role for fleet deployment). Phase 8 (GUI Security Keys tab) and Phase 12 (recovery flow) are the next single-lane bundles. See docs/plans/ for design, roadmap, and per-phase implementation plans.

Copyright 2026 Dangerous Things, LLC. Licensed under the Apache License, Version 2.0.

Description
mfa support and related user management and policy tools for linux
Readme 398 KiB
Languages
Rust 95.9%
C 3.6%
Jinja 0.3%
Makefile 0.2%