Skip to content

Building from Source

Simon Dick edited this page Jul 19, 2026 · 4 revisions

Building from Source

AmiAuth is plain C, split into a portable core (builds with any host compiler, fully testable off-Amiga) and Amiga front-ends cross-built with amiga-gcc. The shipped Amiga binaries have zero external dependencies; the build/test tooling below (Docker, OpenSSL, Python) never touches what ships.

Quick reference

make test         # host unit + RFC-vector tests
make cli          # native host CLI        -> build/amiauth-host
make smoke        # end-to-end CLI smoke test
make diff         # differential fuzz vs OpenSSL (opt-in; needs libcrypto)
make m68k-docker  # AmigaOS CLI via the amiga-gcc container -> build/AmiAuth
make gui-docker   # AmigaOS ReAction GUI                    -> build/AmiAuthGUI
make gui-smoke    # headless GUI render test (WB 3.2 under Copperline)
make pbkdf2-bench # measure PBKDF2 speed (the KDF calibration numbers)
make dist         # package the Aminet upload pair -> build/dist/ (builds its own lha)

Host build and tests

make test compiles the core natively and runs the unit tests plus the official RFC test vectors — RFC 6238 (TOTP), RFC 4226 (HOTP), FIPS/RFC SHA-1, HMAC, RFC 8439 ChaCha20, RFC 6070 PBKDF2 — and a byte-exact golden vault fixture. Any host C compiler works; there are no dependencies.

make cli produces build/amiauth-host, a fully working CLI for the host (handy for preparing a vault to copy to an Amiga):

build/amiauth-host CODE JBSWY3DPEHPK3PXP

make diff (optional, needs OpenSSL's libcrypto) differentially fuzzes every crypto primitive against OpenSSL as a reference oracle — the same job CI runs.

Amiga builds

The supported cross-build path uses the containerised amiga-gcc toolchain, so you need Docker (or a compatible runtime) but no local toolchain install:

make m68k-docker   # -> build/AmiAuth     (CLI, OS 2.04+, plain 68000)
make gui-docker    # -> build/AmiAuthGUI  (ReAction GUI, OS 3.0+)

Both binaries target plain 68000 (-m68000) — the project's baseline; no 020+ instructions anywhere.

make gui-smoke boots a Workbench 3.2 environment headlessly under the Copperline emulator and verifies the GUI actually renders — the automated on-target test CI uses.

Releases

Releases are tag-driven and semver: a release PR bumps the version in src/version.h (the single source of truth, embedded in both binaries as an AmigaOS $VER: string) and the Version: field of AmiAuth.readme; pushing the matching v<version> tag then builds the binaries, packages build/dist/AmiAuth.lha (make dist), publishes a GitHub release with generated notes, and — after a manual approval step — uploads the package to Aminet. The workflow refuses a tag that doesn't match both version fields.

Continuous integration

Every commit runs: the host RFC-vector/unit tests, the CLI smoke test, the OpenSSL differential fuzz job, and the m68k cross-build. Releases are packaged for Aminet. The workflows in .github/workflows/ are the authoritative reference.

Source layout

See docs/ARCHITECTURE.md for the module map: src/core/ (crypto, OTP, vault, clock — portable), src/cli/, src/gui/, src/amiga/ (OS glue: SNTP transport, entropy, prefs, GUI port), src/qr/ (vendored quirc), tests/.

Clone this wiki locally