<feed xmlns='http://www.w3.org/2005/Atom'>
<title>otpGarmin, branch v0.4.0</title>
<subtitle>OTP Wallet for Garmin Connect IQ: offline one-time passwords and barcodes.</subtitle>
<id>https://git.cirakg.xyz/otpGarmin/atom?h=v0.4.0</id>
<link rel='self' href='https://git.cirakg.xyz/otpGarmin/atom?h=v0.4.0'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/'/>
<updated>2026-10-19T20:28:09+00:00</updated>
<entry>
<title>docs: record M4 results and simulator findings; bump to 0.4.0</title>
<updated>2026-10-19T20:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T20:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=81a5b903297e59d599dd0d6f580b89597630909d'/>
<id>urn:sha1:81a5b903297e59d599dd0d6f580b89597630909d</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(ui): drive the simulator with a scripted flow and check every screen</title>
<updated>2026-10-19T20:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T20:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=2373b6f02ef027a423762d5d6349cd9e0f36090e'/>
<id>urn:sha1:2373b6f02ef027a423762d5d6349cd9e0f36090e</id>
<content type='text'>
tools/ui_flow.py clicks buttons and taps from the device files, waits for
DIAG shown lines and compares 10 screens per watch with goldens on four
test and three spot-check devices. Adds the fixture-wrap generator, UI
logic tests and driver tests; the launcher opens apps from their glance.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): add the list, OTP detail, PIN entry, menu, info screens and glance</title>
<updated>2026-10-19T20:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T20:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=35042ff04ffc50e55ff59a385849442be4429d6b'/>
<id>urn:sha1:35042ff04ffc50e55ff59a385849442be4429d6b</id>
<content type='text'>
List with live codes and countdowns, adaptive rows and lazy headers; OTP
detail with ring or bar, next code and HOTP next; PIN keypad or button
selector with create, unlock, change, lockout display and pending
promotion; native menu; glance with the entry count; self-test after the
first frame; option properties with defaults. Codes are computed one per
timer event, apart from drawing, for the watchdog. A UI-test build
(uitest.jungle) starts with fake entries, PIN 123456 and a frozen clock.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>perf(crypto): XOR PBKDF2 blocks as 32-bit words and step 100 iterations</title>
<updated>2026-10-19T20:28:09+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T20:28:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=871aba901501302586895d266fe4569665d9fe70'/>
<id>urn:sha1:871aba901501302586895d266fe4569665d9fe70</id>
<content type='text'>
200 byte-wise iterations in one event tripped the 120,000-bytecode
watchdog on the Forerunner 255S profile. Word-wise XOR makes PBKDF2
2.3x faster (22 ms per 1000 iterations in the simulator).

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: document the storage format and record M3 results; bump to 0.3.0</title>
<updated>2026-10-19T13:27:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T13:27:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=97a366e8b7c540b246c7bf9d04625526cbdc88ba'/>
<id>urn:sha1:97a366e8b7c540b246c7bf9d04625526cbdc88ba</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test(storage): cover records, vault, PINs, lockout and migrations</title>
<updated>2026-10-19T13:27:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T13:27:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=8ac04a0c2f5cd949a45866f938bd1aa72fbe56e2'/>
<id>urn:sha1:8ac04a0c2f5cd949a45866f938bd1aa72fbe56e2</id>
<content type='text'>
34 new tests (65 per device): round trips per entry type, every tampered
byte, swapped records, the pending queue, the entry cap, a full store at
67 fill levels, the lockout schedule on a fake clock including restarts,
erase, PIN change and reset, auto-lock wiping, and v0 to v1 migration.
Adds an in-memory store with a size limit and storage benchmarks.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(storage): add the encrypted vault, PIN keys, lockout, session and migrations</title>
<updated>2026-10-19T13:27:37+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-19T13:27:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=dd5d0f68726fe56ee4d199867d414aea81905cc4'/>
<id>urn:sha1:dd5d0f68726fe56ee4d199867d414aea81905cc4</id>
<content type='text'>
Records are one ByteArray each: a readable TLV header plus an
encrypt-then-MAC box whose aad binds the entry ID and the header. The
device key seals unlocked entries and pending items; a random master key,
wrapped under a PBKDF2 PIN key, seals locked ones. Wrong PINs are counted
before the check, with delays on the trusted clock and an uptime fallback.
Bytes.toUtf8 validates UTF-8 first, because the native conversion crashes
on invalid input.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: record M2 results and bump version to 0.2.0</title>
<updated>2026-10-18T21:44:18+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T21:44:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=94181d58cf66c5b7b263fd435a344f1cd8872cff'/>
<id>urn:sha1:94181d58cf66c5b7b263fd435a344f1cd8872cff</id>
<content type='text'>
CHANGELOG 0.2.0; PERFORMANCE (simulator benchmarks and what they mean for
the watch); TESTING (vector sources, M2 results, watchdog caveat);
FEASIBILITY (verified: no native HMAC-SHA1, AES-256 works, Long semantics);
README status and targets; developer-guide Monkey C facts.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(spike): add the M1 settings spike app and make targets</title>
<updated>2026-10-18T21:44:18+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T21:44:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=ac60fb060414261935ac5e158b26b34e211e1e06'/>
<id>urn:sha1:ac60fb060414261935ac5e158b26b34e211e1e06</id>
<content type='text'>
A separate throwaway app (own app ID, no permissions) that shows what the
Garmin Connect app delivers per settings field and writes values back, to
measure the undocumented settings limits on the real phone and watch.
Includes length-marked test strings, `make spike` / `make spike-sim`,
`make vectors`, and step-by-step instructions in docs/SETTINGS_SPIKE.md.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test: add cross-checked crypto/OTP vectors, unit tests and stricter screenshots</title>
<updated>2026-10-18T21:44:18+00:00</updated>
<author>
<name>cirakg</name>
<email>cirakg@cirakg.xyz</email>
</author>
<published>2026-10-18T21:44:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/otpGarmin/commit/?id=93aa7e3aa291f3328cf34a5a2f86172f41d0affd'/>
<id>urn:sha1:93aa7e3aa291f3328cf34a5a2f86172f41d0affd</id>
<content type='text'>
- gen_vectors.py: RFC/FIPS/NIST vectors recomputed with Python's stdlib
  (openssl for AES) before use, plus seeded cases around SHA padding
  boundaries, 2038 and 2100; generates test/data/Vectors.mc.
- 31 Monkey C tests (hashes, HMAC, PBKDF2, HKDF, AES, sealed records incl.
  every-byte tamper detection, Base32 errors, 100 OTP and 12 Steam
  vectors, clock, jobs) and a benchmark; pass on all four test devices.
- Screenshot tolerance 0.01 %: one changed character no longer passes.
- Golden images updated for version 0.2.0.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
