<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: maxtaco</title><link>https://news.ycombinator.com/user?id=maxtaco</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 02 May 2026 09:10:22 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=maxtaco" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by maxtaco in "Copy Fail"]]></title><description><![CDATA[
<p>Use extreme caution running arbitrary code on your machines, especially obfuscated code that tickles kernel bugs! (edited)</p>
]]></description><pubDate>Wed, 29 Apr 2026 18:55:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47952733</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47952733</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47952733</guid></item><item><title><![CDATA[New comment by maxtaco in "What are skiplists good for?"]]></title><description><![CDATA[
<p>Backpointers to earlier epochs in append-only cryptographic data structures like key transparency logs. If the client last fetched epoch 1000, and the server reports the current epoch is 3000, the server can return log(2000) intermediate epochs, following skip pointers, to provide a hash chain from epoch 3000 to 1000.<p><a href="https://github.com/foks-proj/go-foks/blob/main/lib/merkle/bits.go#L13" rel="nofollow">https://github.com/foks-proj/go-foks/blob/main/lib/merkle/bi...</a>
<a href="https://github.com/foks-proj/go-foks/blob/main/lib/merkle/client.go#L465" rel="nofollow">https://github.com/foks-proj/go-foks/blob/main/lib/merkle/cl...</a></p>
]]></description><pubDate>Sun, 19 Apr 2026 19:08:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47826753</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47826753</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47826753</guid></item><item><title><![CDATA[New comment by maxtaco in "Michael Rabin has died"]]></title><description><![CDATA[
<p>Amazing man, with many important contributions over a very long career. The Rabin Cryptosystem (like RSA, but with public exponent 2) is notable for two reasons. First, unlike RSA, it is provably as hard as "factorization" (as he would call it), and second, unlike RSA, it wasn't protected by patent.</p>
]]></description><pubDate>Sat, 18 Apr 2026 12:35:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47815437</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47815437</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47815437</guid></item><item><title><![CDATA[Federated, End-to-End Encrypted Document Storage with Git]]></title><description><![CDATA[
<p>Article URL: <a href="https://blog.foks.pub/posts/federated-e2e-encrypted-doc-storage-with-git/">https://blog.foks.pub/posts/federated-e2e-encrypted-doc-storage-with-git/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47785063">https://news.ycombinator.com/item?id=47785063</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 15 Apr 2026 20:51:07 +0000</pubDate><link>https://blog.foks.pub/posts/federated-e2e-encrypted-doc-storage-with-git/</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47785063</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47785063</guid></item><item><title><![CDATA[Tax Day? Git add 1040.pdf]]></title><description><![CDATA[
<p>Article URL: <a href="https://blog.foks.pub/posts/git-add-1040/">https://blog.foks.pub/posts/git-add-1040/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47765165">https://news.ycombinator.com/item?id=47765165</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 14 Apr 2026 13:06:02 +0000</pubDate><link>https://blog.foks.pub/posts/git-add-1040/</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47765165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47765165</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>I think in practice it doesn't work to deserialize only verified data. Snowpack has a mechanism for this but I found it impractical to require all use cases fit this form.<p>I'm not sure exactly what system you're describing, but I hope it doesn't involve hand-marshaling and unmarshaling of data structures. Your requirement (b) seems at odds with forward-compatibility. Lack of forward-compatibility complicates upgrades, especially in federated systems when you cannot expect all nodes to upgrade at once.<p>I might be biased, but it's been possible to write a sufficiently complex system (<a href="https://github.com/foks-proj/go-foks" rel="nofollow">https://github.com/foks-proj/go-foks</a>) without feeling "tortured." It's actually quite the opposite, the cleanest system I've programmed in for these use cases, and I've tried many over the last 25 years. Never am I guessing how to verify an object, I'm not sure how that follows.<p>I also think it's worth noting that the same mechanism works for MAC'ing, Encryption and prefixed hashing. Just today I came across this IDL code:<p><pre><code>  struct ChunkNoncePayload @0xadba174b7e8dcc08 {
    id @0 : lib.FileID;
    offset @1 : lib.Offset;
    final @2 : Bool;
  }
</code></pre>
And the following Go code for making a nonce for encrypting a chunk of a large file:<p><pre><code>  pld := lcl.ChunkNoncePayload{
    Id:     fid,
    Offset: offset,
    Final:  isFinal,
  }
  hsh, err := core.PrefixedHash(&pld)
  if err != nil {
    return nil, err
  }
  var ret [24]byte
  copy(ret[:], (\*hsh)[0:24])
  return &ret, nil
</code></pre>
As in signing, it's nice to know this nonce won't conflict with some other nonce for a different data type, and the domain separation in the IDL guarantees that.</p>
]]></description><pubDate>Fri, 03 Apr 2026 18:01:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47629885</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47629885</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47629885</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>Bingo!</p>
]]></description><pubDate>Thu, 02 Apr 2026 13:12:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47614036</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47614036</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47614036</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>It seems like in that PR, the fact that the OID wasn't checked is part of the problem. I think a better system wouldn't compile or would always fail to verify if the OID (domain separator) is wrong, and I think you'd get that behavior in the posted system.</p>
]]></description><pubDate>Wed, 01 Apr 2026 23:59:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47608276</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47608276</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47608276</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>Hi, post author here. Agree that the idea isn't tricky, but it seems like many systems still get it wrong, and there wasn't an available system that had all the necessary features. I've tried many of them over the years -- XDR, JSON, Msgpack, Protobufs. When I sat down to write FOKS using protobufs, I found myself writing down "Context Strings" in a separate text file. There was no place for them to go in the IDL. I had worked on other systems where the same strategy was employed. I got to thinking, whenever you need to write down important program details in something that isn't compiled into the program (in this case, the list of "context strings"), you are inviting potentially serious bugs due to the code and documentation drifting apart, and it means the libraries or tools are inadequate.<p>I think this system is nice because it gives you compile-time guarantees that you can't sign without a domain separator, and you can't reuse a domain separator by accident. Also, I like the idea of generating these things randomly, since it's faster and scales better than any other alternative I could think of. And it even scales into some world where lots of different projects are using this system and sharing the same private keys (not a very likely world, I grant you).</p>
]]></description><pubDate>Wed, 01 Apr 2026 22:00:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47607081</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47607081</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47607081</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>It should be possible to change the name of the type, and this happens often in practice. But type renames shouldn't break preexisting signatures. In this scheme you are free change the type name, and preexisting signatures still verify with new code -- of course as long as you never change the domain separator, which you never should do. Also you'd need to worry about two different projects reusing the same type name. Lastly, the transmission size in this scheme remains unaffected since the domain separators do not appear in the serialized data. Rather, both sides agree on it via the protocol specification.</p>
]]></description><pubDate>Wed, 01 Apr 2026 21:46:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47606933</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47606933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47606933</guid></item><item><title><![CDATA[New comment by maxtaco in "Signing data structures the wrong way"]]></title><description><![CDATA[
<p>I would say two problems with the asn.1 approach are: (1) it seems like too much cognitive overload for the OIDs to have semantic meaning, and it invites accidental reuse; I think it matters way more that the OIDs are unique, which randomness gets you without much effort; and (2) the OIDs aren't always serialized first, they are allowed to be inside the message, and there are failures that have resulted (<a href="https://nvd.nist.gov/vuln/detail/cve-2022-24771" rel="nofollow">https://nvd.nist.gov/vuln/detail/cve-2022-24771</a>, <a href="https://nvd.nist.gov/vuln/detail/CVE-2025-12816" rel="nofollow">https://nvd.nist.gov/vuln/detail/CVE-2025-12816</a>)<p>(edit on where the OIDs can be, and added another CVE)</p>
]]></description><pubDate>Wed, 01 Apr 2026 21:16:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47606672</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=47606672</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47606672</guid></item><item><title><![CDATA[New comment by maxtaco in "Health care data breach affects over 600k patients, Illinois agency says"]]></title><description><![CDATA[
<p>Also on the front page of HN right now is a job posting for Optery (YC W22). Seems like they are growing really fast.</p>
]]></description><pubDate>Wed, 07 Jan 2026 17:38:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=46529495</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=46529495</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46529495</guid></item><item><title><![CDATA[New comment by maxtaco in "Gpg.fail"]]></title><description><![CDATA[
<p>An intended use case for FOKS (<a href="https://foks.pub" rel="nofollow">https://foks.pub</a>) is to allow long-lived durable shared secrets between users and teams with key rotation when needed.</p>
]]></description><pubDate>Sat, 27 Dec 2025 23:18:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=46406506</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=46406506</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46406506</guid></item><item><title><![CDATA[The Anti-Tail of 3I/Atlas Turned to a Tail]]></title><description><![CDATA[
<p>Article URL: <a href="https://avi-loeb.medium.com/the-anti-tail-of-3i-atlas-turned-to-a-tail-9ad2479b6633">https://avi-loeb.medium.com/the-anti-tail-of-3i-atlas-turned-to-a-tail-9ad2479b6633</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=45709847">https://news.ycombinator.com/item?id=45709847</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Sun, 26 Oct 2025 07:40:24 +0000</pubDate><link>https://avi-loeb.medium.com/the-anti-tail-of-3i-atlas-turned-to-a-tail-9ad2479b6633</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=45709847</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45709847</guid></item><item><title><![CDATA[New comment by maxtaco in "Pass: Unix Password Manager"]]></title><description><![CDATA[
<p>I think one could build something nice on top of FOKS (<a href="https://foks.pub" rel="nofollow">https://foks.pub</a>).</p>
]]></description><pubDate>Sun, 14 Sep 2025 11:27:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=45239035</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=45239035</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45239035</guid></item><item><title><![CDATA[New comment by maxtaco in "FOKS: Federated Open Key Service"]]></title><description><![CDATA[
<p>No incremental fetch right now other than what postgresql provides by default. If you're hosting a FOKS server, there is important metadata to backup too.<p>The best docs for the KV store are in the white paper, Section 5.1. White paper is linked to from foks.pub<p>Postgres seemed to check all the boxes for me. I wanted to keep things very simple at first in terms of setup and ongoing management, so didn't introduce other storage backends for other parts of the system.</p>
]]></description><pubDate>Fri, 11 Jul 2025 14:06:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=44532311</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=44532311</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44532311</guid></item><item><title><![CDATA[New comment by maxtaco in "FOKS: Federated Open Key Service"]]></title><description><![CDATA[
<p>An attack that might be of concern with this configuration is the server suppressing updates to this JSON file, or showing different versions of the JSON file to different clients. What you're describing is pretty close to what FOKS is getting at with signature chains and Merkle Trees, but maybe it's overkill for this particular application.<p>I wonder if the policy you describe could be implemented as world-visible team with world-visible users. Others have commented on the need for something like this, so I think it should be pursued with high priority. What's slighlty fuzzy to me is how these totally world-viewable teams and users would interact with more closed-down users on other servers.</p>
]]></description><pubDate>Fri, 11 Jul 2025 13:37:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=44531989</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=44531989</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44531989</guid></item><item><title><![CDATA[New comment by maxtaco in "FOKS: Federated Open Key Service"]]></title><description><![CDATA[
<p>Thanks for these great questions!<p>- limiting users to delete/push/force; this is possible but I don't see how to cryptographically guarantee it. The server can't really help since it doesn't know what's a pack, index data block or ref. The clients can enforce this policy, but then it would be possible to make an evil client that skirts the policy. How much protection do you think you need?<p>- the server repo right now is implemented 100% as a postgresql DB, so yes, I think that means it's incremental backup-friendly? [1]<p>- e2ee git has trouble being as efficient as regular git since the server can't tell you which blocks it has; however, there are pretty good optimizations made using indices and packfiles, the white paper has more details, and I hope to write a blog on it soon.<p>- I'm not sure about the sqlite question. Is there a good way to backup sqlite incrementally over standard git? If not, then maybe the KV-store is better fit for this application.<p>I agree that git over E2EE is the best storage, even for things like PDFs and photos. Yeah, FOKS should be hostable with a very thin VPS. The storage needs will scale (n log n) as the number of users due to the Merkle Tree, but for small n, this is likely fine!<p>[1] <a href="https://www.postgresql.org/docs/17/continuous-archiving.html#BACKUP-INCREMENTAL-BACKUP" rel="nofollow">https://www.postgresql.org/docs/17/continuous-archiving.html...</a></p>
]]></description><pubDate>Fri, 11 Jul 2025 13:31:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=44531936</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=44531936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44531936</guid></item><item><title><![CDATA[New comment by maxtaco in "FOKS: Federated Open Key Service"]]></title><description><![CDATA[
<p>This would be a great application for us! We are not exactly there yet, for reasons of privacy. Right now, there is no way for alice@host to allow unauthenticated users to view her profile. But we can definitely allow this on a host-by-host basis. With this small change, I think your application fits very naturally.<p>I wonder, what sort of interface is right for you? A library to compile against or a CLI app to shell out to? If a library, which languages?</p>
]]></description><pubDate>Fri, 11 Jul 2025 08:31:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=44529667</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=44529667</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44529667</guid></item><item><title><![CDATA[New comment by maxtaco in "FOKS: Federated Open Key Service"]]></title><description><![CDATA[
<p>Easy multi-accounting is something that I hope we already have (`foks key switch` is pretty smooth). It's a feature I use a lot (I have a personal account on @foks.app and our company account is on @ne43.foks.cloud).<p>This is a great point and I thought a lot about this. This is the sort of thing that can be changed later if it's really a good idea, but I got to thinking that having non-local admins would mean more server-to-server communication and more server-to-server trust, and I was trying to avoid that.<p>Imagine alice@foo is an admin of bluejays@bar. One thing alice@foo will need to do is to make signed changes to bluejays@bar, when adding or removing members, let's say. Right now, the server at bar will check the validity of these signatures, that they were made with the alice@foo's latest key. So in other words, there would have to be some way for bar to authenticate to foo to allow bar to read alice's sigchain and to determine her latest key.<p>I was thinking that keeping foo and bar separated was a good idea both in terms of privilege separation and keeping the network simpler (which would in turn be good for uptime and would simplify software upgrades).</p>
]]></description><pubDate>Fri, 11 Jul 2025 01:37:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=44527614</link><dc:creator>maxtaco</dc:creator><comments>https://news.ycombinator.com/item?id=44527614</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44527614</guid></item></channel></rss>