1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
<!--
Author: cirakg & claude ai
Summary: Notable changes per version, in Keep a Changelog format with semantic versioning.
-->
# Changelog
All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses
[Semantic Versioning](https://semver.org/spec/v2.0.0.html). Versions stay at
0.x until milestone M8; each milestone raises the minor version.
## [Unreleased]
## [0.4.0] - 2026-10-19
Milestone M4: the screens. The app is usable in the simulator with demo
entries; adding real entries comes with M5 (import) and M7 (settings).
### Added
- List of entries with live codes, countdowns, lock and barcode icons, and
groups. Rows adapt to narrow screens, and headers are read only for the
visible rows.
- OTP detail: large grouped code, countdown ring (bar on rectangular screens),
next code in the last 5 seconds, HOTP "next" with the counter, entry ID.
- PIN screen: touch keypad or button digit selector. It covers create (twice,
with a warning below 6 digits), unlock and change. Wrong PINs vibrate, and
the lockout wait is shown. Pending locked entries are promoted after
unlocking.
- Menu: lock now, set/change/reset PIN, settings results, entry IDs, clock
status, about. Debug builds add demo entries, a performance overlay and an
on-watch benchmark.
- Glance with the number of entries; the crypto self-test on first start and
daily; auto-lock while a locked entry is open.
- Option properties with defaults (`resources/settings/properties.xml`).
- UI-test build with fake entries, PIN and a frozen clock. A scripted UI flow
(`tools/ui_flow.py`) checks 10 screens on each of seven simulated watches.
Also new: `tools/gen_fixture_wrap.py`, and 7 Monkey C and 6 Python tests.
### Changed
- PBKDF2 XORs 32-bit words: 2.3× faster, and 100 iterations per job step,
because 200 tripped the watchdog on the Forerunner 255S.
- Codes are computed in their own timer events, at most one SHA-512 code per
event.
- `make screenshots` runs the scripted flow; goldens are now
`test/golden/<device>/<screen>.png`. Start-up budgets are set from the M4
measurements.
## [0.3.0] - 2026-10-19
Milestone M3: storage, keys and PIN logic. Nothing user-visible yet; the
screens come with M4.
### Added
- Storage (`source/storage/`): the vault (ordered entries, add, update, move,
remove, HOTP counter), the deterministic TLV codec, the record format (readable
header plus an encrypt-then-MAC box bound to the entry ID), the device key and
the PIN-wrapped master key, resumable PIN derivation, the wrong-PIN lockout
(trusted clock with an uptime fallback, optional erase after 10 failures), the
session with auto-lock and key wiping, the pending queue for locked entries,
schema migrations, the 150-entry cap and clean store-full errors.
- `Bytes.toUtf8` with strict UTF-8 validation.
- `docs/SECURITY.md`: the stored byte formats and what each protection is
tested by.
- 34 Monkey C tests (65 in total per device) and storage benchmarks.
### Changed
- The PIN wrap and the lockout state are stored under their own keys (`w`,
`lk`) instead of inside the metadata (README 6.2 updated).
## [0.2.0] - 2026-10-18
Milestones M1 (prepared; your phone test pending) and M2: crypto and OTP core.
Nothing user-visible yet; the home screen still shows only name and version.
### Added
- Crypto (`source/crypto/`): SHA-512 in Monkey C (FIPS 180-4), generic HMAC
(RFC 2104) for SHA-1/SHA-256/SHA-512 plus native HMAC-SHA256, resumable
PBKDF2-HMAC-SHA256 with calibration, HKDF-SHA256, AES-CBC with PKCS#7
(AES-256 chosen), SealedBox encrypt-then-MAC records, and a start-up
self-test.
- OTP (`source/otp/`): Base32 decoding with exact error positions, HOTP, TOTP
(64-bit time, correct after 2038) and Steam Guard codes.
- Utilities: constant-time comparison and wiping (`Bytes`), the 2038-safe clock
and trusted-clock check (`Clock`), resumable jobs with a timer runner (`Jobs`).
- `tools/gen_vectors.py` and `make vectors`: official RFC/FIPS/NIST vectors,
each recomputed with Python's standard library or openssl before use, plus
seeded cases (SHA padding boundaries, 2038, 2100, all digit counts).
- 31 Monkey C unit tests and a benchmark, passing on all four test devices.
- M1 settings spike: a separate test app (`spike/settings/`), `make spike`,
`make spike-sim`, test strings and `docs/SETTINGS_SPIKE.md`.
### Changed
- Screenshot checks are now strict: at most 0.01 % of pixels may differ (one
changed character used to pass under the old 0.5 % tolerance).
- SHA-512 and PBKDF2 inner loops optimised (37 % and 42 % faster in the
simulator) without changing results.
## [0.1.0] - 2026-10-18
Milestone M0: scaffolding. Not useful on a watch yet; the app shows only its
name and version.
### Added
- Project plan (`README.md`), Phase 0 feasibility findings with what M0
verified (`docs/FEASIBILITY.md`), developer guide, testing and performance
documents.
- Docker images with pinned versions: `garmin-otp/dev` (Ubuntu 22.04 snapshot,
Java 17, headless simulator stack, hash-locked Python tools,
checksum-verified SDK manager CLI) and `garmin-otp/docs` (Markdown lint and
Mermaid rendering).
- `Makefile` running every step in hardened containers: no capabilities,
read-only root filesystem, only the project folder mounted, no network
outside image builds and `make sdk`, serial even under `make -j`.
- `make sdk` (agreements, login, SDK 9.2.0, device files for 72 watches,
token deleted afterwards) and `make key` (RSA-4096 developer key).
- Build pipeline with strict type checking and warnings as errors, per-size
launcher icons for all 72 products, unit tests in the headless simulator on
four devices, golden-image screenshot tests, start-up and memory budgets, and
the signed `.iq` package.
- Python tools with 44 tests: test-log judge, screenshot checker, budget
checker, product rule checker, Markdown link checker, project linter (code
rules and the Author/Summary header rule) and icon generator.
- A minimal watch app (home screen with name and version) and a smoke test.
|