diff --git a/README.md b/README.md index 8bcb49e..292b0ea 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ |---|---| | Status | Working drafts | | Version | Internet-Draft `-00` | -| Updated | 2026-08-27 | +| Updated | 2026-08-28 | | Author | Jason Grey | | Primary readers | Protocol implementers, standards reviewers, and researchers | | Reading time | 5 minutes | @@ -98,15 +98,21 @@ writes its temporary snapshot under `$TMPDIR` when set, then `RUNNER_TEMP` or The reference repositories implement the v1 signing profile, including the JCS signing object, URL and origin scopes, HTTPS-only signed URLs, parser preflight, resource ceilings, and source-to-rendered browser lifecycle. The -2026-08-28 evidence snapshot pins these tested revisions: +current coordinated implementation baseline pins these tested revisions: | Component | Revision | Validation | |---|---|---| -| Canonicalization | [`b0c8f305`](https://github.com/HTMLTrust/htmltrust-canonicalization/commit/b0c8f305425de190a7f209ac117d34f88c2b1946) | 123 shared fixtures across five language ports | -| Browser verification library | [`d25c6d3c`](https://github.com/HTMLTrust/htmltrust-browser-client/commit/d25c6d3c2d0f4d67483da20853f22e94a11b89cc) | 51 tests | -| Reference extension | [`5237f070`](https://github.com/HTMLTrust/htmltrust-browser-reference/commit/5237f07098da8b6542f0fd8f1c613ae8dbf4e6dd) | 64 tests plus a Chromium lifecycle check | -| Directory server | [`f84f5148`](https://github.com/HTMLTrust/htmltrust-server-reference/commit/f84f51482ba2a925d9b5ff148185adf6dedef566) | 85 tests plus OpenAPI conformance | -| End-to-end harness | [`034af226`](https://github.com/HTMLTrust/htmltrust-e2e/commit/034af22697f8b2a1c08b0c01200ca019995ca817) | Clean HTTPS simulation and CI | +| Canonicalization | [`5e51040d`](https://github.com/HTMLTrust/htmltrust-canonicalization/commit/5e51040dcaaf50935e245702bdefbc18a1d542ce) | 128 shared fixtures across five language ports | +| Browser verification library | [`39dc873c`](https://github.com/HTMLTrust/htmltrust-browser-client/commit/39dc873c368ff53b5d0295fbe4d8f493dea52f90) | 51 tests, typecheck, and build | +| Reference extension | [`407bace3`](https://github.com/HTMLTrust/htmltrust-browser-reference/commit/407bace3ad792384ba623b5db795f3f32acd16ca) | 63 production content-script tests, typecheck, and browser builds | +| Directory server | [`56ab5c06`](https://github.com/HTMLTrust/htmltrust-server-reference/commit/56ab5c06e901f8f48753e3a511dd9dda755b9bac) | 90 tests, OpenAPI lint, and live v1 conformance | +| End-to-end harness | [`6354706d`](https://github.com/HTMLTrust/htmltrust-e2e/commit/6354706df0a90cad3a9d2a7e7c6751bcd268dbe9) | 33 tests, Chromium lifecycle checks, and the HTTPS simulation | + +The paper's Common Crawl and adversarial results use the earlier evaluated +canonicalization snapshot `b0c8f305425de190a7f209ac117d34f88c2b1946` +and its 123-fixture suite. Study 1 v0.4 archives that source and evidence. The +five fixtures added in `5e51040d` test parser-preflight cases and have not been +used to rerun the paper's 4,846-region corpus. Native browser support remains a standards proposal. The current browser implementation is a Chromium extension. diff --git a/paper/ARXIV-SUBMISSION.md b/paper/ARXIV-SUBMISSION.md index 3f607b9..63d36f2 100644 --- a/paper/ARXIV-SUBMISSION.md +++ b/paper/ARXIV-SUBMISSION.md @@ -31,14 +31,14 @@ supplementary Study 1 source and evidence remain in ## Plain-text abstract -> We specify HTMLTrust, an in-band signature protocol for semantic regions of HTML. A signed section binds normalized text and four reader-relevant attributes through a content hash. An RFC 8785 canonical JSON signing object binds that hash with the claims hash, signer key identifier, signature algorithm, publication location, signed time, and profile identifiers. Verification is deterministic after the verifier obtains the source snapshot and resolves the key; optional federated directories distribute key records and signed endorsements. The v1 prototype includes five parser-backed language bindings, a reference directory, a browser extension, and publishing integrations. All five bindings pass 123 shared canonicalization fixtures, including expected rejections. On 4,846 Common Crawl News body regions, all five ports accepted 121; 119 of those 121 produced identical digests. A selected 47-case adversarial evaluation matched every expected outcome. The protocol separates cryptographic integrity from user-selected trust policy and defines explicit limits for replay, parser ambiguity, URL handling, and resource use. +> We specify HTMLTrust, an in-band signature protocol for semantic regions of HTML. A signed section binds normalized text and four reader-relevant attributes through a content hash. An RFC 8785 canonical JSON signing object binds that hash with the claims hash, signer key identifier, signature algorithm, publication location, signed time, and profile identifiers. Verification is deterministic after the verifier obtains the source snapshot and resolves the key; optional federated directories distribute key records and signed endorsements. The v1 prototype includes five parser-backed language bindings, a reference directory, a browser extension, and publishing integrations. At the evaluated revision, all five bindings pass 123 shared canonicalization fixtures, including expected rejections. On 4,846 Common Crawl News body regions, all five ports accepted 121 (2.5%); 119 of those 121 produced identical digests. An earlier permissive profile produced identical bytes for 31.4% of jointly accepted regions on a different corpus. Strict v1 preflight converts many ambiguous inputs into explicit rejection, but broad real-web byte identity remains unresolved. A selected 47-case adversarial evaluation matched every expected outcome. The protocol separates cryptographic integrity from user-selected trust policy and defines explicit limits for replay, parser ambiguity, URL handling, and resource use. ## Replacement comment Use this comment for a replacement submission and adjust the version number if needed: -> Updated the implementation evidence to canonicalization revision b0c8f305425de190a7f209ac117d34f88c2b1946 and expanded the conformance suite to 123 fixtures. Added selected adversarial cases, signing measurements, a Chromium lifecycle check, a local HTTPS integration simulation, and a Sybil policy-sensitivity model. Clarified the historical 31.4% result and the limits of the operational sample, benchmark, browser tests, and Sybil model. Replaced the supplementary archive with Study 1 v0.4. +> Updated the implementation evidence to canonicalization revision b0c8f305425de190a7f209ac117d34f88c2b1946 and expanded the evaluated conformance suite to 123 fixtures. Added selected adversarial cases, signing measurements, production content-script and Chromium walker lifecycle checks, a local HTTPS integration simulation, and a Sybil policy-sensitivity model. Reframed the historical 31.4% result and the strict v1 result to make clear that 119 regions, or 2.46% of the full real-web corpus, achieved cross-implementation byte identity. Expanded the stated limits of the operational sample, benchmark, browser tests, and Sybil model. Replaced the supplementary archive with Study 1 v0.4. ## Final checks diff --git a/paper/htmltrust.tex b/paper/htmltrust.tex index c568e29..c3d8b1f 100644 --- a/paper/htmltrust.tex +++ b/paper/htmltrust.tex @@ -26,7 +26,7 @@ \maketitle \begin{abstract} -We specify HTMLTrust, an in-band signature protocol for semantic regions of HTML. A signed section binds normalized text and four reader-relevant attributes through a content hash. An RFC 8785 canonical JSON signing object binds that hash with the claims hash, signer key identifier, signature algorithm, publication location, signed time, and profile identifiers \cite{HTMLTrustDraft}. Verification is deterministic after the verifier obtains the source snapshot and resolves the key; optional federated directories distribute key records and signed endorsements. The v1 prototype includes five parser-backed language bindings, a reference directory, a browser extension, and publishing integrations. All five bindings pass 123 shared canonicalization fixtures, including expected rejections. On 4{,}846 Common Crawl News body regions, all five ports accepted 121; 119 of those 121 produced identical digests. A selected 47-case adversarial evaluation matched every expected outcome \cite{HTMLTrustCanon,HTMLTrustStudy1}. The protocol separates cryptographic integrity from user-selected trust policy and defines explicit limits for replay, parser ambiguity, URL handling, and resource use. +We specify HTMLTrust, an in-band signature protocol for semantic regions of HTML. A signed section binds normalized text and four reader-relevant attributes through a content hash. An RFC 8785 canonical JSON signing object binds that hash with the claims hash, signer key identifier, signature algorithm, publication location, signed time, and profile identifiers \cite{HTMLTrustDraft}. Verification is deterministic after the verifier obtains the source snapshot and resolves the key; optional federated directories distribute key records and signed endorsements. The v1 prototype includes five parser-backed language bindings, a reference directory, a browser extension, and publishing integrations. At the evaluated revision, all five bindings pass 123 shared canonicalization fixtures, including expected rejections. On 4{,}846 Common Crawl News body regions, all five ports accepted 121 (2.5\%); 119 of those 121 produced identical digests. An earlier permissive profile produced identical bytes for 31.4\% of jointly accepted regions on a different corpus. Strict v1 preflight converts many ambiguous inputs into explicit rejection, but broad real-web byte identity remains unresolved. A selected 47-case adversarial evaluation matched every expected outcome \cite{HTMLTrustCanon,HTMLTrustStudy1}. The protocol separates cryptographic integrity from user-selected trust policy and defines explicit limits for replay, parser ambiguity, URL handling, and resource use. \end{abstract} \section{Introduction} @@ -179,15 +179,15 @@ \section{Related Work} \section{Implementation and Results} \label{sec:results} -The design above is implemented in the HTMLTrust v1 prototype. The wire format is documented in an IETF-formatted Internet-Draft work in progress \cite{HTMLTrustDraft}; a companion proposed W3C Community Group report defines the element and browser processing model \cite{HTMLTrustW3C}. The system includes five language bindings, a reference federated trust-directory server with an OpenAPI description, a browser verifier, publishing integrations, and an end-to-end test harness. The canonicalization release is pinned to revision \nolinkurl{b0c8f305425de190a7f209ac117d34f88c2b1946} \cite{HTMLTrustCanon}. +The HTMLTrust v1 prototype implements the canonicalization profile in five parser-backed languages. JavaScript and Go also recompute and verify the shared Ed25519 vector; the other ports validate canonicalization or payload components. The wire format is documented in an IETF-formatted Internet-Draft work in progress \cite{HTMLTrustDraft}; a companion proposed W3C Community Group report defines the element and browser processing model \cite{HTMLTrustW3C}. Supporting repositories provide a reference federated trust-directory server with an OpenAPI description, a browser verifier, publishing integrations, and an end-to-end test harness. The evaluated canonicalization snapshot is pinned to revision \nolinkurl{b0c8f305425de190a7f209ac117d34f88c2b1946} \cite{HTMLTrustCanon}. \paragraph{Cross-implementation interoperability.} Because the security of the scheme depends on byte-identical canonicalization (\S\ref{sec:canon}), we measure interoperability across every language binding. A shared conformance suite of 123 fixtures contains 24 normalization cases, 57 extraction cases, 17 claims cases, and 25 JCS cases, including expected rejections. The shared Ed25519 vector fixes a key, HTML fixture, canonical bytes, content and claims hashes, signing payload, and signature. JavaScript and Go tests recompute and verify the full vector; the remaining bindings validate the corresponding canonicalization or payload components. All five implementations produce the expected results across the suite \cite{HTMLTrustCanon}. \paragraph{Real-web operational sample.} We analyzed 4{,}846 HTML \texttt{} regions from \texttt{text/html} 200 responses in the five WARC files listed by the run manifest, drawn from Common Crawl's news dataset \cite{CommonCrawlNews}. The deterministic selector retained URLs whose first 12 SHA-1 hexadecimal digits, interpreted as an integer, were congruent to zero modulo 17. It then required HTTPS and body sizes from 1 KiB through 1 MiB, with an 8 MiB response limit. The manifest records source-file hashes, skip counts, the corpus hash, container image identifier, toolchain versions, and the canonicalization revision \cite{HTMLTrustStudy1}. This operational sample has no probability-sampling interpretation. Its results should not be generalized to the Web, Common Crawl, or all news publishers. The pages predate HTMLTrust-specific authoring, so successful canonicalization measures strict-profile applicability to this sample and does not measure publisher adoption. -\paragraph{Historical baseline.} A v0.2 study used a different 5{,}146-region corpus and a more permissive profile. All five ports produced identical bytes for 1{,}589 of the 5{,}067 regions they all accepted, or 31.4\% conditional agreement \cite{HTMLTrustStudy1Historical}. The v1 profile deliberately converts ambiguous source forms into rejections, so that historical percentage is not directly comparable with the strict v1 results below. +\paragraph{Historical baseline.} A v0.2 study used a different 5{,}146-region corpus and a more permissive profile. All five ports produced identical bytes for 1{,}589 of the 5{,}067 regions they all accepted, or 31.4\% conditional agreement \cite{HTMLTrustStudy1Historical}. That study identified byte-identical processing of ordinary web HTML as the central engineering problem. The strict v1 profile rejects ambiguous source forms earlier, so its results measure a narrower accepted subset and cannot be compared directly with the historical percentage. -\paragraph{Independent-port result.} All five independent language implementations returned success for 121 of 4{,}846 regions (2.5\% of the corpus). Among those 121 jointly canonicalizable regions, 119 produced the same SHA-256 digest, for 98.3\% conditional agreement and 2.5\% agreement over the full corpus. The implementations agreed on success-or-rejection status for 4{,}777 regions (98.6\%). Individual success rates ranged from 2.5\% to 3.6\%. The two jointly successful digest disagreements were localized to URL serialization. Among the Rust reference's 4{,}672 failures, 4{,}196 were classified as unsupported parser forms, 474 as HTTPS URL-policy violations, and two as attribute-canonicalization failures. Deployment tooling therefore needs to author or extract conforming regions and report preflight failures. +\paragraph{Independent-port result.} All five independent language implementations returned success for 121 of 4{,}846 regions (2.5\% of the corpus). Among those 121 jointly canonicalizable regions, 119 produced the same SHA-256 digest, for 98.3\% conditional agreement. The denominator matters: only those 119 regions, or 2.46\% of the full corpus, achieved the byte identity required for cross-implementation verification. The implementations agreed on success-or-rejection status for 4{,}777 regions (98.6\%), mostly because all ports rejected the same inputs. Individual success rates ranged from 2.5\% to 3.6\%. The two jointly successful digest disagreements were localized to URL serialization. Among the Rust reference's 4{,}672 failures, 4{,}196 were classified as unsupported parser forms, 474 as HTTPS URL-policy violations, and two as attribute-canonicalization failures. Strict rejection makes these failures explicit, while authoring and extraction of broadly portable real-web regions remain unresolved engineering work. \paragraph{Publishing transformations.} E2 applied source-level transformations to the 121 regions successfully canonicalized by the independent Python binding. Re-serialization through Python's \texttt{html.parser} preserved 121 of 121 hashes. Re-serialization through lxml caused all 121 transformed inputs to fail the v1 preflight. Inserting whitespace between tags preserved 89 of 121 hashes (73.6\%). These probes measure byte-level signature stability and do not establish that every transformation preserves rendered meaning. @@ -195,7 +195,7 @@ \section{Implementation and Results} \paragraph{Signing performance.} In one pinned Node.js process, synthetic signed sections from 1 KiB through 1 MiB were canonicalized, signed with Ed25519, and verified over 20 measured iterations after three warmups. Median total times were 0.640 ms, 1.364 ms, 8.540 ms, and 97.106 ms at 1 KiB, 10 KiB, 100 KiB, and 1 MiB. Median signature-verification time ranged from 0.066 ms to 0.082 ms. The signature was 64 bytes, and the generated signed-section envelope added 423 bytes at every size \cite{HTMLTrustStudy1}. The benchmark excludes process startup, browser work, network fetches, memory use, and user-perceived latency. -\paragraph{Browser lifecycle and integration.} The reference Chromium extension verified a signed source snapshot, placed its indicator immediately after the signed section, changed the indicator after a post-load DOM mutation, and returned to the verified state after reload \cite{HTMLTrustBrowserReference}. A local HTTPS integration simulation with three authors, five consumers, eight articles, and 18 visits recorded 18 successful verifications and 18 source-to-rendered matches \cite{HTMLTrustE2E}. Its two synthetic metadata mismatches were reported with no false positives in the visited set. These tests establish prototype lifecycle behavior in one controlled Chromium environment. They do not measure content truth, production detection, user comprehension, or other browser engines. +\paragraph{Browser lifecycle and integration.} Tests import the reference extension's production content script and exercise frozen source mapping, failure on incomplete source-to-live mappings, indicators outside the outermost signed section, mutation-triggered re-verification, and navigation snapshot reset \cite{HTMLTrustBrowserReference}. A separate Chromium check runs the integration harness's production DOM walker and confirms missing-source failure, nested marker placement, mutation invalidation, and recovery with a fresh snapshot after navigation \cite{HTMLTrustE2E}. These isolated lifecycle tests inject verifier results, so they establish control flow rather than cryptographic correctness. A local HTTPS simulation with three authors, five consumers, eight articles, and 18 visits recorded 18 successful verifications and 18 source-to-rendered matches. The seed-42 scenario planted five mismatched article records across two author identities; its author-level detector reported both identities and no others. These tests establish prototype lifecycle behavior in one controlled Chromium environment. They do not measure content truth, production detection, user comprehension, or other browser engines. \paragraph{Sybil policy sensitivity.} An illustrative model starts with 20 honest endorsements across five configured directories. Raw endorsement counting gives an attacker a majority at 21 identities. With a cap of five endorsements per open directory, an attacker needs five controlled directories for a majority under the model's assumptions. A 3-of-5 configured-directory quorum fails after three configured directories are compromised \cite{HTMLTrustStudy1}. These thresholds are deterministic model outputs; they do not estimate attacker cost, directory prevalence, or empirical resistance. @@ -217,7 +217,7 @@ \section{Future Work} \section{Conclusion} -HTMLTrust v1 defines an in-band signature for semantic HTML regions. The signer binds canonical text, four semantic attributes, claims, a publication location, a key identifier, and a selected algorithm in a versioned signing object. The 123-fixture conformance suite and the Ed25519 vector at revision \nolinkurl{b0c8f305425de190a7f209ac117d34f88c2b1946} provide reproducible implementation evidence \cite{HTMLTrustCanon}. In the real-web operational sample, Rust accepted 174 of 4{,}846 regions (3.6\%), while all five independent ports jointly accepted 121 (2.5\%). Of those 121, 119 produced identical digests, for 98.3\% conditional agreement. These results make parser preflight and conforming authoring support concrete deployment requirements. +HTMLTrust v1 defines an in-band signature for semantic HTML regions. The signer binds canonical text, four semantic attributes, claims, a publication location, a key identifier, and a selected algorithm in a versioned signing object. The 123-fixture conformance suite and the Ed25519 vector at revision \nolinkurl{b0c8f305425de190a7f209ac117d34f88c2b1946} provide reproducible implementation evidence \cite{HTMLTrustCanon}. The historical permissive profile produced identical output for 31.4\% of jointly accepted regions on a different corpus. In the strict v1 real-web sample, Rust accepted 174 of 4{,}846 regions (3.6\%), while all five independent ports jointly accepted 121 (2.5\%). Of those 121, 119 produced identical digests. The resulting 98.3\% conditional agreement covers 2.46\% of the full corpus. Byte-identical handling of ordinary web HTML therefore remains the central engineering issue. Parser preflight exposes unsupported inputs, and practical deployment also requires authoring or extraction tools that produce portable regions. Cryptographic validity covers the accepted source region and its selected location. Trust directories, endorsements, and client policy add optional social context. This paper presents protocol and prototype evidence. It reports no user study, production deployment, or empirical Sybil-resistance result. diff --git a/paper/references.bib b/paper/references.bib index 19ea751..c9a1791 100644 --- a/paper/references.bib +++ b/paper/references.bib @@ -280,14 +280,14 @@ @misc{HTMLTrustBrowserReference title = {{HTMLTrust Reference Browser Extension}}, author = {Grey, Jason}, year = {2026}, - note = {Revision \texttt{5237f070}, \url{https://github.com/HTMLTrust/htmltrust-browser-reference/tree/5237f070}} + note = {Revision \texttt{407bace3}, \url{https://github.com/HTMLTrust/htmltrust-browser-reference/tree/407bace3}} } @misc{HTMLTrustE2E, title = {{HTMLTrust End-to-End Integration Harness}}, author = {Grey, Jason}, year = {2026}, - note = {Revision \texttt{034af226}, \url{https://github.com/HTMLTrust/htmltrust-e2e/tree/034af226}} + note = {Revision \texttt{6354706d}, \url{https://github.com/HTMLTrust/htmltrust-e2e/tree/6354706d}} } @misc{CommonCrawlNews,