<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>RockyGuard — Engineering notes</title><description>Root-cause write-ups, API reasoning and defect post-mortems from building RockyGuard, a tamper-resistant C++17 license library.</description><link>https://rockyguard.dev/</link><language>en-us</language><item><title>Don&apos;t check the licence. Make the feature need it.</title><link>https://rockyguard.dev/blog/no-branch-to-patch/</link><guid isPermaLink="true">https://rockyguard.dev/blog/no-branch-to-patch/</guid><description>A licence check is a boolean an attacker can patch. So we removed the branch: the feature decrypts its own data with a key only a valid licence carries.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>security</category><category>cryptography</category></item><item><title>The public key isn&apos;t secret. That&apos;s not why we hide it.</title><link>https://rockyguard.dev/blog/the-public-key-you-cant-read-but-can-overwrite/</link><guid isPermaLink="true">https://rockyguard.dev/blog/the-public-key-you-cant-read-but-can-overwrite/</guid><description>Reading an embedded verification key is harmless — the attack is overwriting it. How we made key substitution tamper-evident and fail-closed.</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>security</category><category>cryptography</category></item><item><title>The signature is unforgeable. The branch that trusts it isn&apos;t.</title><link>https://rockyguard.dev/blog/the-branch-an-attacker-patches/</link><guid isPermaLink="true">https://rockyguard.dev/blog/the-branch-an-attacker-patches/</guid><description>Crypto makes a licence unforgeable, so attackers patch the branch that trusts it. How we obfuscate that branch, and why your own call site matters more.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>security</category><category>build-and-packaging</category></item><item><title>The file on disk is clean. The running code isn&apos;t.</title><link>https://rockyguard.dev/blog/the-file-on-disk-is-clean/</link><guid isPermaLink="true">https://rockyguard.dev/blog/the-file-on-disk-is-clean/</guid><description>The on-disk signature check hashes a file that an in-memory patch never touches, and it skips static builds entirely. A trust-on-first-use check for the gap.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>security</category></item><item><title>An HMAC salted with a filename</title><link>https://rockyguard.dev/blog/an-hmac-salted-with-a-filename/</link><guid isPermaLink="true">https://rockyguard.dev/blog/an-hmac-salted-with-a-filename/</guid><description>A valid licence could be denied outright, and the documented remedy never cleared it. The salt depended on how the licence was named, not on which anchor.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><category>postmortem</category><category>cryptography</category></item><item><title>Adding 56 diagnostic codes without breaking a single caller</title><link>https://rockyguard.dev/blog/fifty-six-diagnostic-codes/</link><guid isPermaLink="true">https://rockyguard.dev/blog/fifty-six-diagnostic-codes/</guid><description>The library already knew why verification failed, then threw the distinction away. Promoting it to a public enum, without touching LicenseStatus.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>api-design</category><category>abi</category></item><item><title>The licence hasn&apos;t expired. The clock is three days fast.</title><link>https://rockyguard.dev/blog/the-licence-has-not-expired/</link><guid isPermaLink="true">https://rockyguard.dev/blog/the-licence-has-not-expired/</guid><description>A per-section diagnostic can&apos;t answer the ticket that costs the most. What it took to correlate across a report instead, and what we refused to build.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><category>engineering-notes</category><category>diagnostics</category></item></channel></rss>