HidraBrowser v1.0.0 — SHA-256 checksums ======================================= Verify before running. macOS / Linux: shasum -a 256 Windows: Get-FileHash .\ -Algorithm SHA256 If the value does not match the table below, do not run the file. ON THE RELEASE PAGE NOW ----------------------------------------------------------------------- fa0998beb47d833186c0b49703dd555a081393a6de15a6bdef77b7cc6db76a47 HidraNet-Browser-1.0.0-macOS-arm64.zip 48f20cd6d38643991d2466a54893c3a6e8d8d940026f6292645395c3d1cd6cb9 HidraNet-Browser-1.0.0-macOS-x64.zip edefe4363d9c862d283e7f95086519d7e5ee48f8a564902ae642a8c817a5405b HidraNet-Browser-1.0.0-Linux-x64.zip f33c386a919b3fc8e6ebcc0207e281674d79b846b2e126020064c0026695386a HidraNet-Browser-1.0.0-Windows-x64.zip macOS arm64 108,908,673 bytes (103.9 MiB) macOS x64 113,339,154 bytes (108.1 MiB) Linux x64 113,280,618 bytes (108.0 MiB) Windows x64 130,199,531 bytes (124.2 MiB) Built from commit 562121c. The three packages without the engine are a pure repack — rebuilding from the same tree reproduces these hashes byte for byte, which was checked by running the build twice. The Windows one carries a freshly compiled Rust engine, so a rebuild on another machine may differ there. What changed from the first packages, published in September: SECURITY — these are the reason to replace the published packages, not the cosmetics further down: - the transport handshake is post-quantum, and this is the release where that became true rather than merely implemented. Every relay-to-relay connection now runs Noise_XXhfs_25519+MLKEM1024_ChaChaPoly_BLAKE3: an ML-KEM-1024 encapsulation beside the X25519 one, with the secret mixed in before the static key is encrypted. Until now the ML-KEM code existed and no handshake ever reached it. Hybrid on purpose — a break of either primitive leaves the other standing - the ML-KEM implementation is FIPS 203 (`ml-kem`), not pqc_kyber. That crate is unmaintained with no fixed release, and on the AVX2 path — which is every desktop — it skips Fujisaki-Okamoto implicit rejection, so a chosen-ciphertext attacker recovers the decapsulation key (RUSTSEC-2026-0290); its division timings also leak the secret (RUSTSEC-2023-0079). Both are compiled into the engine, which only the Windows package ships, and that binary is rebuilt here rather than carried over - HidraMail signs messages. Before, `from` was a string the sender chose and nothing checked it: anyone could look up your published key and send you mail under someone else's name - the privileged browser API is no longer handed to every file:// page. Any .html you downloaded and opened could call proxy.disconnect() and turn Tor off - the app pages carry a Content-Security-Policy; the page that holds your mail keys had none - the engine's local HTTP services bind loopback and refuse requests that did not come from this machine. They answered any website with Access-Control-Allow-Origin: *, which exposed the relays of your live circuit, your LAN address and your searches, and let a page send mail in your name - the chat room passphrase is checked with Argon2id instead of being accepted and discarded, and is no longer a constant compiled into the binary - the analytics dashboard no longer loads Chart.js from a CDN ADDED 9–10 OCTOBER — the reason to replace the packages again: - every page that speaks MQTT could send but never receive. The client runs its keepalive in a Worker loaded from a blob: URL, and no page declared worker-src, so the policy fell back to script-src, Chromium refused the Worker, and the rejection killed the connect handler before it subscribed. Mail, chat, forum, reviews, site publish and site load: sending worked, which is why it survived - HidraMail proves who sent a message. `from` used to be a string the sender chose, so anyone who looked up your published key could arrive as your bank. An identity is now an ECDH and an ECDSA key with the address derived from both, and the signature covers the whole envelope including the recipient. A sender that cannot be proven is dropped rather than displayed - the anonymity panel stops claiming what it is not doing. Five of its badges describe things every tab gets either way; "DNS Leak Protection: Active" was hardcoded and only true while traffic goes through the engine. Disconnected, this machine resolves names itself, and the badge now says so - relays are shown by fingerprint, not by a masked address. A /16 with the port kept leaves few candidates, and the one it narrows down is the guard — the address that identifies the user - the engine keeps peer addresses and exit destinations out of its log. A relay saw who connected, the next hop, and at the exit the hostname and port asked for, all beside a circuit id, with the shipped config at level = "debug". Scrubbed now, under a key made at startup and never written down. This ships in the Windows package and to anyone running a relay built from source - secret keys are created 0600 at open(2) in a 0700 directory, and HIDRA_KEY_PASSPHRASE seals them with Argon2id and XChaCha20-Poly1305. The .hidra service key had no mode set at all — 0644, readable by every account on the machine, and that key *is* the service - the status API no longer hands out the IP addresses of the live circuit, and the circuit view needs a token from a file a web page cannot read - a client binds the DHT to an ephemeral port. On a fixed one, sweeping the internet for it returns a list of this network's users by IP ADDED 10 OCTOBER: - an exit relay was writing the payload it had just decrypted into its log, beside a circuit id. Not who the user is — what they said. Ping and Pong bodies went the same way, and those arrive from a peer, so anyone could write into an operator's log. Lengths now, never content - HidraMail logged the recipient of every message sent and the sender of every message received, with the shared message id beside each, so a log from both ends joined the two. HidraChat logged the nickname and room id next to an address it had carefully scrubbed. All scrubbed now - the product is in English — all of it this time. The engine's pages had been missed entirely, because they are HTML inside Rust string literals: the whole SevenNine site builder, the analytics dashboard, every connection status. So had dates and times, which were formatted with a Portuguese locale under labels that read English, and strings translated word by word into neither language ("Text do button", "URL da image"). A lint now fails the build on any of it Linux: the bundled Tor is dynamically linked against libevent, which most distributions do not install by default. It was not in the package, so Tor died at startup and the browser opened with nothing connecting. The library now ships beside it. - the privacy and security fixes that landed after the release was cut (network kill switch, no third-party hosts called from any app page, no location or persistent id in the presence beacons) - macOS: the launcher now signs the bundled Tor separately and before the app, which codesign --deep does not do; without it the app opens and nothing connects - macOS: the bundle identifies itself as net.hidra.browser instead of com.github.Electron - Linux and Windows: paths inside the archive use forward slashes, and Unix permissions are restored — the published ones were zipped on Windows, so hidranet and tor extracted without the execute bit - every interface in English: the browser's pages, the apps the engine serves, the launchers and the README - the engine's HidraChat no longer loads mqtt.js from a CDN — that page does the end-to-end encryption, and a script fetched from someone else's host could read messages before they are encrypted - a bug fixed: the node beacon never connected, because two calls to a function that had been removed threw before it started - support goes to an $HNET wallet on Solana, replacing the Bitcoin address ----------------------------------------------------------------------- NONE OF THESE BUILDS ARE SIGNED OR NOTARISED There is no Apple Developer ID and no Windows code-signing certificate behind this release. The app is unsigned — not signed badly, not signed with something expired: unsigned. On Apple Silicon the kernel will not load unsigned arm64 code, and macOS reports that as "HidraNet.app is damaged and can't be opened." The download is not corrupt. Sign it locally and it opens: xattr -cr HidraNet.app codesign --force --sign - HidraNet.app/Contents/Resources/bin/tor/tor codesign --force --deep --sign - HidraNet.app open HidraNet.app Tor is signed first and on its own because --deep does not descend into Resources/. Skip that line and the app opens but cannot connect. Verifying the checksum above tells you the file is the one we published. It does not tell you an operating system will accept it without complaint. See README-macOS.txt inside the macOS ZIP.