<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Libsodium on Whistleblowing Software</title><link>https://whistleblowing-software.pages.dev/tags/libsodium/</link><description>Recent content in Libsodium on Whistleblowing Software</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 13 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://whistleblowing-software.pages.dev/tags/libsodium/index.xml" rel="self" type="application/rss+xml"/><item><title>Voice Hotline Intake: STT Pipeline for Sapin II Compliance</title><link>https://whistleblowing-software.pages.dev/posts/voice-hotline-intake-stt-pipeline-sapin-ii-compliance/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate><guid>https://whistleblowing-software.pages.dev/posts/voice-hotline-intake-stt-pipeline-sapin-ii-compliance/</guid><description>&lt;p&gt;A compliant voice hotline intake under France&amp;rsquo;s &lt;a href="https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000045388745"&gt;Loi Waserman&lt;/a&gt;, the act that modernised Sapin II to transpose &lt;a href="https://eur-lex.europa.eu/eli/dir/2019/1937/oj/eng"&gt;EU Directive 2019/1937&lt;/a&gt;, is one pipeline, not three. Capture audio in the browser via the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder"&gt;MediaRecorder API&lt;/a&gt;, encrypt and upload it into the same report bundle as the text fields using libsodium &lt;a href="https://doc.libsodium.org/public-key_cryptography/sealed_boxes"&gt;SealedBox&lt;/a&gt; to the recipient&amp;rsquo;s Curve25519 public key, produce a draft transcript on the recipient side using a self-hosted STT model, and let the reporter verify, rectify, and approve through an anonymous one-time receipt code (never an email or phone re-prompt). The same five-stage pipeline satisfies Article 9(2) and Article 18 of the directive, France&amp;rsquo;s verify/rectify/approve cycle, and Italy&amp;rsquo;s &lt;a href="https://www.gazzettaufficiale.it/eli/id/2023/03/15/23G00032/sg"&gt;D.lgs. 24/2023&lt;/a&gt; oral-report rule. The only deltas across regimes are the consent UX wording and the retention period.&lt;/p&gt;</description></item><item><title>Encrypting Whistleblower Reports: Receipts, SealedBox, SecretBox</title><link>https://whistleblowing-software.pages.dev/posts/encrypting-whistleblower-reports-receipts-sealedbox-secretbox/</link><pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate><guid>https://whistleblowing-software.pages.dev/posts/encrypting-whistleblower-reports-receipts-sealedbox-secretbox/</guid><description>&lt;p&gt;A whistleblower report needs a complete encryption protocol, not a checkbox that says &amp;ldquo;AES-256&amp;rdquo;. A reference design that has converged across mature open-source whistleblowing platforms pairs three primitives in a way every serious system should recognise: a 16-digit random receipt code (stored on the server only as a SHA-256 hash, shaped like a phone number so the reporter can hide it among contacts), libsodium &lt;a href="https://pynacl.readthedocs.io/en/latest/public/#nacl.public.SealedBox"&gt;SealedBox&lt;/a&gt; (Curve25519 + XSalsa20 + Poly1305) to wrap a per-submission data key to each authorised recipient&amp;rsquo;s public key, and libsodium &lt;a href="https://pynacl.readthedocs.io/en/latest/secret/#nacl.secret.SecretBox"&gt;SecretBox&lt;/a&gt; (XSalsa20 + Poly1305) to encrypt the submission body and attachments under that data key. Each recipient&amp;rsquo;s Curve25519 private key sits on the server encrypted under a symmetric key derived from the recipient&amp;rsquo;s password via Argon2ID tuned to 128 MB of memory and roughly one second of computation per login. As of April 2026, this is the protocol that production deployments serving anti-corruption activists, corporate compliance teams, and investigative newsrooms actually run.&lt;/p&gt;</description></item></channel></rss>