<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vesmot</title>
    <description>The latest articles on DEV Community by Vesmot (@vesmot_dev).</description>
    <link>https://dev.to/vesmot_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4021818%2Ffa31be55-0a9b-4b36-977b-d236727314d9.png</url>
      <title>DEV Community: Vesmot</title>
      <link>https://dev.to/vesmot_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vesmot_dev"/>
    <language>en</language>
    <item>
      <title>The Bug That Proved My Own Point: A Post-Mortem on TSA Verification</title>
      <dc:creator>Vesmot</dc:creator>
      <pubDate>Tue, 04 Aug 2026 08:22:14 +0000</pubDate>
      <link>https://dev.to/vesmot_dev/the-bug-that-proved-my-own-point-a-post-mortem-on-tsa-verification-41di</link>
      <guid>https://dev.to/vesmot_dev/the-bug-that-proved-my-own-point-a-post-mortem-on-tsa-verification-41di</guid>
      <description>&lt;p&gt;In my previous post, I argued that Git history is not enough as proof because timestamps and commit data can easily be rewritten. The core thesis was simple: you cannot rely on a verification model controlled by a single interested party; you need an independent, external source of truth, such as an RFC 3161 Time Stamping Authority (TSA).&lt;/p&gt;

&lt;p&gt;Then, I broke our own verification pipeline.&lt;/p&gt;

&lt;p&gt;This is a technical post-mortem on how a subtle bug in our verification path nearly turned a valid cryptographic proof into a false positive "tampering" alert — and why it forced us to rethink what a trusted verification system actually means.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What Broke: The OpenSSL Digest Trap
&lt;/h2&gt;

&lt;p&gt;During the stabilization phase of &lt;strong&gt;Evident Ledger v1.2.0-rc1&lt;/strong&gt;, we audited our end-to-end evidence workflow. The write path worked flawlessly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compute the Merkle root digest.&lt;/li&gt;
&lt;li&gt;Send the digest to an external TSA provider (&lt;code&gt;freetsa.org&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Store the resulting cryptographic timestamp token.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trouble started on the &lt;strong&gt;read path&lt;/strong&gt; during independent verification.&lt;/p&gt;

&lt;p&gt;Our ledger architecture is content-free: we never store or pass raw file contents during verification, only the pre-calculated 32-byte binary digest (the Merkle root). That digest was being passed to OpenSSL like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl ts &lt;span class="nt"&gt;-verify&lt;/span&gt; &lt;span class="nt"&gt;-data&lt;/span&gt; merkle_root_digest &lt;span class="nt"&gt;-tsd&lt;/span&gt; token.tsr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem: OpenSSL's &lt;code&gt;-data&lt;/code&gt; flag expects the &lt;em&gt;original raw file content&lt;/em&gt;, and it automatically hashes that content internally before comparing it to the timestamp token's message imprint. We were feeding it an already-hashed 32-byte digest — so OpenSSL hashed it a second time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expected_imprint = digest
actual_imprint   = hash(digest)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result was a predictable, and misleading, mismatch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verification failed: message imprint mismatch
Expected: &amp;lt;digest&amp;gt;
Actual:   &amp;lt;hash of digest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To an automated verifier or an auditor, this technical mismatch looked identical to a severe security violation: &lt;em&gt;evidence tampering&lt;/em&gt;. The system was flagging completely valid, unmanipulated historical records as broken — simply because the verification tool was wrapping the digest a second time.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fix
&lt;/h3&gt;

&lt;p&gt;The correction required switching OpenSSL from data mode to direct digest mode, using the correct flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl ts &lt;span class="nt"&gt;-verify&lt;/span&gt; &lt;span class="nt"&gt;-digest&lt;/span&gt; &amp;lt;merkle_root_hex&amp;gt; &lt;span class="nt"&gt;-tsd&lt;/span&gt; token.tsr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Why This Is Not Just a "Minor Bug"
&lt;/h2&gt;

&lt;p&gt;In most software, a bug is an annoyance. In a cryptographic evidence system, a bug in the verification path is a different category of problem entirely.&lt;/p&gt;

&lt;p&gt;There is a profound difference between &lt;em&gt;not having a proof&lt;/em&gt; and &lt;em&gt;producing a false tampering alert&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No proof&lt;/strong&gt; means you cannot substantiate a claim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A false tampering alert&lt;/strong&gt; means a mathematically sound, honest record is falsely accused of being altered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an independent expert or technical consultant runs a verification command during a dispute and sees &lt;code&gt;message imprint mismatch&lt;/code&gt;, the reputational and legal damage happens instantly — before anyone has time to check whether the tool, not the evidence, was at fault. A verification tool's failure mode must never mimic the failure mode of the data itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What Changed in the Release Process
&lt;/h2&gt;

&lt;p&gt;Finding this issue right before tagging &lt;code&gt;v1.2.0-rc1&lt;/code&gt; prompted a deeper shift in how we handle releases. A "provable ledger" needs more than correct math and clean Rust code — it needs a strict operational boundary around that math.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fail-closed startup security.&lt;/strong&gt; In production (&lt;code&gt;APP_ENV=production&lt;/code&gt;), the application now enforces strict startup guards. If signing keys or TSA CA trust paths are missing, it refuses to boot (&lt;code&gt;exit code != 0&lt;/code&gt;) instead of degrading silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning classification.&lt;/strong&gt; We audited 201 unique compiler and runtime warnings and classified every one of them, with zero hard blockers left ambiguous in the release binaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence-driven documentation.&lt;/strong&gt; Every security guard and fix is now tracked alongside the codebase in structured audit logs (&lt;code&gt;docs/audits/&lt;/code&gt;), instead of living as undocumented tribal knowledge.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Conclusion: The Chain of Trust Is Only as Strong as Its Verification
&lt;/h2&gt;

&lt;p&gt;My first article argued that you cannot trust Git history, because the tools that produce it can be manipulated. This bug taught me the corollary: &lt;strong&gt;you cannot trust an independent timestamp if your own verification tool interprets it incorrectly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A trust infrastructure is not a collection of isolated guarantees — Git, GPG, TSA. It is an unbroken chain where every link, from Merkle root generation down to the exact CLI verification flag, has to be deterministic and transparent.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.2.0-rc1&lt;/code&gt; is our first release where the code, the operational guardrails, and the audit trail are locked together as a single verifiable system.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you're interested in the architecture or the audit documentation, the &lt;a href="https://github.com/vesmot74-code/evident-ledger" rel="noopener noreferrer"&gt;Evident Ledger repository&lt;/a&gt; is open.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>rust</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Your Git History Isn't Enough as Proof</title>
      <dc:creator>Vesmot</dc:creator>
      <pubDate>Sun, 19 Jul 2026 16:40:19 +0000</pubDate>
      <link>https://dev.to/vesmot_dev/why-your-git-history-isnt-enough-as-proof-58m7</link>
      <guid>https://dev.to/vesmot_dev/why-your-git-history-isnt-enough-as-proof-58m7</guid>
      <description>&lt;p&gt;Every developer has said it at least once: "check the git log — it's all there." Commit date, author, diff — it looks like an irrefutable timeline of who wrote what and when.&lt;/p&gt;

&lt;p&gt;It isn't. And if you ever need to prove authorship or priority of code — in a dispute with a former co-founder, a contested termination involving IP, a licensing or patent dispute — you'll find that git log means far less than it appears to.&lt;/p&gt;

&lt;p&gt;Commit dates are just a field you can rewrite&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit --date&lt;/code&gt; lets you set any date when creating a commit. &lt;code&gt;git rebase -i&lt;/code&gt;, combined with manual editing or &lt;code&gt;--committer-date-is-author-date&lt;/code&gt;, rewrites history entirely. &lt;code&gt;git filter-branch&lt;/code&gt; and its modern replacement &lt;code&gt;git filter-repo&lt;/code&gt; change dates and authorship across batches of commits in seconds.&lt;/p&gt;

&lt;p&gt;Nothing in git itself prevents you from creating a commit today with a date stamped "three months ago." Git is a version control system, not a proof-of-time system. It was never designed for this — and that's fine, as long as you understand what it actually guarantees.&lt;/p&gt;

&lt;p&gt;Force-push erases history without a trace&lt;/p&gt;

&lt;p&gt;If a repository isn't protected by explicit branch protection rules, &lt;code&gt;git push --force&lt;/code&gt; overwrites the remote history completely. What was in &lt;code&gt;main&lt;/code&gt; yesterday may simply not exist today — no warning, no record of the fact anywhere else.&lt;/p&gt;

&lt;p&gt;GitHub keeps a reflog for a while, but that's not a guarantee — reflogs get cleaned up, forks may be out of sync, and if a dispute ends up in court, "it might still be somewhere in GitHub's logs" isn't something you want to rely on.&lt;/p&gt;

&lt;p&gt;Anyone with write access can rewrite history after the fact&lt;/p&gt;

&lt;p&gt;This is the key issue in priority disputes: if two people have access to the same repository — co-founders, a team — both of them physically have the ability to rewrite the shared history. Git doesn't verify "who came up with this first"; it only verifies "what's currently in the database," and that database is mutable by anyone with push access.&lt;/p&gt;

&lt;p&gt;When the dispute is real — not hypothetical — the question "whose git log is more trustworthy" becomes part of the dispute itself, not a way to resolve it.&lt;/p&gt;

&lt;p&gt;GPG-signed commits solve only part of the problem&lt;/p&gt;

&lt;p&gt;Signed commits (&lt;code&gt;git commit -S&lt;/code&gt;) genuinely prove that a &lt;em&gt;specific person&lt;/em&gt; with a specific key confirmed &lt;em&gt;specific content&lt;/em&gt;. That's valuable — but it doesn't solve the time question. A signature doesn't carry an independently verified timestamp; it confirms &lt;em&gt;what&lt;/em&gt;, not &lt;em&gt;when&lt;/em&gt; it was actually created, if the commit date itself — the very field you can rewrite — was set before signing.&lt;/p&gt;

&lt;p&gt;What you actually need to prove priority&lt;/p&gt;

&lt;p&gt;To make date and content genuinely unfalsifiable, you need a timestamp that &lt;strong&gt;neither party to the dispute controls&lt;/strong&gt; — an independent third party that recorded a hash of the content at a specific moment, before there was any reason to falsify it.&lt;/p&gt;

&lt;p&gt;This is exactly what notaries used to do with paper documents, and what an RFC 3161 Time-Stamping Authority (TSA) does for digital data — an independent, cryptographically verified timestamp over a content hash, issued by a party with no stake in the outcome of your dispute.&lt;/p&gt;

&lt;p&gt;In practice, this means keeping an independent record — alongside your git repository, not instead of it — of key milestones: releases, critical commits, the state of your codebase on dates that matter, anchored to an external, immutable source of truth.&lt;/p&gt;

&lt;p&gt;Not paranoia, just basic hygiene&lt;/p&gt;

&lt;p&gt;Most repositories will never need this — if a dispute never arises, git log does its normal job perfectly well. But for developers working in startups with multiple co-founders, freelancers handing off code to clients, teams protecting their own algorithms as trade secrets — the cost of one unresolvable authorship dispute is usually far higher than the few minutes it takes to independently anchor an important commit ahead of time.&lt;/p&gt;

&lt;p&gt;It's cheaper to record it once, before you need it, than to try to prove anything after the fact with tools that were never built for that purpose.&lt;/p&gt;




&lt;p&gt;Evident Ledger — independent cryptographic file anchoring with an external RFC 3161 timestamp. Local utility, open verification model, free base tier.&lt;/p&gt;

</description>
      <category>git</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Evident: Proving Digital Ownership Without Revealing Your Content</title>
      <dc:creator>Vesmot</dc:creator>
      <pubDate>Wed, 08 Jul 2026 20:31:10 +0000</pubDate>
      <link>https://dev.to/vesmot_dev/evident-proving-digital-ownership-without-revealing-your-content-286h</link>
      <guid>https://dev.to/vesmot_dev/evident-proving-digital-ownership-without-revealing-your-content-286h</guid>
      <description>&lt;p&gt;In the era of AI-generated content, copyright disputes, and data leaks, proving that a specific file existed at a specific time is a significant challenge. Traditional methods often require uploading your files to third-party servers, compromising your privacy and security.We are changing that. Introducing Evident, a privacy-first utility designed to provide legally binding proof of existence while keeping your data strictly on your device.The Core Philosophy: "Zero-Knowledge Proof of Existence"At Evident, we believe your files belong to you. Our architecture is built on a simple premise: the server never touches your files.Instead of uploading documents, the Evident utility computes a cryptographic hash locally on your machine. This hash—a unique "digital fingerprint"—is the only thing sent to our infrastructure.How It Works:Local Hash Calculation: You select a file and a project. The utility generates a hash locally.Server Ledger &amp;amp; TSA: We receive only the hash and metadata. We then record the event in a secure ledger, attaching a Time Stamping Authority (TSA) signature.Local Audit Trail: Your device stores the proof package, the ledger link, and the TSA data.Verification: Our local and public verifiers generate professional PDF reports that serve as verifiable evidence of existence at a specific point in time.Scalable Trust: From Base to EnterpriseWe provide a tiered model to match your security and legal requirements:TierFocusBest ForBaseHash + Ledger + Free TSAPersonal projects &amp;amp; basic tracking.LegalJurisdictional-Compliant TSALegal disputes and intellectual property.EnterpriseEncrypted Audit StorageCorporate data compliance.IdentityUser-Owned Keys &amp;amp; Digital SignaturesHigh-security identity verification.(Note: Audit recovery is available as a paid service tier.)Why This Matters for the Global MarketWhether you are a developer protecting your code, an artist securing your digital art, or a lawyer managing client documents, Evident provides a neutral, blockchain-based timestamping layer that is independent and transparent.Our public verifier allows anyone to input a hash and verify the project’s history, providing auditability without ever exposing the underlying file content.Get StartedWe are open-source and committed to transparency. You can find our release, source code, and documentation on &lt;a href="https://github.com/vesmot74-code/evident-ledger" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.We invite developers, privacy advocates, and legal-tech enthusiasts to test Evident, contribute to the repo, and help us build a standard for decentralized data integrity.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>privacy</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
