{"id":282855,"date":"2026-02-21T17:03:45","date_gmt":"2026-02-21T17:03:45","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/archiviomd\/"},"modified":"2026-03-18T17:12:13","modified_gmt":"2026-03-18T17:12:13","slug":"archiviomd","status":"publish","type":"plugin","link":"https:\/\/cs.wordpress.org\/plugins\/archiviomd\/","author":23453963,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.19.2","stable_tag":"1.19.2","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"ArchivioMD","header_author":"Mountain View Provisions LLC","header_description":"Manage meta-docs, SEO files, and sitemaps with audit tools and HTML-rendered Markdown support.","assets_banners_color":"f8f8fa","last_updated":"2026-03-18 17:12:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/mountainviewprovisions.com\/ArchivioMD","header_author_uri":"https:\/\/mountainviewprovisions.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":447,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.16.0":{"tag":"1.16.0","author":"mtnviewpro","date":"2026-03-05 21:18:15"},"1.17.4":{"tag":"1.17.4","author":"mtnviewpro","date":"2026-03-06 05:42:46"},"1.17.5":{"tag":"1.17.5","author":"mtnviewpro","date":"2026-03-07 18:38:58"},"1.17.6":{"tag":"1.17.6","author":"mtnviewpro","date":"2026-03-07 18:47:46"},"1.17.7":{"tag":"1.17.7","author":"mtnviewpro","date":"2026-03-07 19:22:49"},"1.19.0":{"tag":"1.19.0","author":"mtnviewpro","date":"2026-03-12 02:01:15"},"1.19.1":{"tag":"1.19.1","author":"mtnviewpro","date":"2026-03-17 20:46:48"},"1.19.2":{"tag":"1.19.2","author":"mtnviewpro","date":"2026-03-18 17:12:13"},"1.7.0":{"tag":"1.7.0","author":"mtnviewpro","date":"2026-03-01 02:03:55"}},"upgrade_notice":{"1.19.1":"<p>Fixes verification badge text appearing in search engine title tags when Yoast SEO or other SEO plugins are active. Recommended for all users. No configuration changes required.<\/p>","1.19.0":"<p>Fixes custom markdown files returning 404 (<code>.well-known\/meta-docs\/<\/code> routing), unreliable rewrite flush after AJAX file creation, and REST endpoint security hardening. Recommended for all users. No configuration changes required.<\/p>","1.17.4":"<p>Fixes a version mismatch where the plugin header and MDSM_VERSION constant were not updated from 1.16.0. No functional changes; no configuration changes required.<\/p>","1.17.0":"<p>Adds DANE \/ DNS Key Corroboration. Flush permalinks after upgrading to activate <code>\/.well-known\/archiviomd-dns.json<\/code>.<\/p>","1.16.0":"<p>Adds RSA, CMS\/PKCS#7, and JSON-LD\/W3C Data Integrity signing methods. All opt-in, disabled by default. Flush permalinks after upgrading to activate <code>\/.well-known\/did.json<\/code> and <code>\/.well-known\/rsa-pubkey.pem<\/code>.<\/p>","1.15.0":"<p>Adds ECDSA P-256 signing (Enterprise \/ Compliance Mode). Opt-in, disabled by default. Flush permalinks after upgrading to activate <code>\/.well-known\/ecdsa-cert.pem<\/code>.<\/p>","1.13.1":"<p>Security hardening for Canary Tokens: SSRF fix, rate limiter bypass fix, evidence receipt integrity fix, ReDoS fix, and removal of <code>sslverify =&amp;gt; false<\/code>. Upgrade recommended for all sites using Canary Tokens.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3466506,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3466506,"resolution":"256x256","location":"assets","locale":""},"icon-32x32.png":{"filename":"icon-32x32.png","revision":3466506,"resolution":"32x32","location":"assets","locale":""},"icon-64x64.png":{"filename":"icon-64x64.png","revision":3466506,"resolution":"64x64","location":"assets","locale":""}},"assets_banners":{"banner-1600x800.png":{"filename":"banner-1600x800.png","revision":3466506,"resolution":"1600x800","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3485897,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"ArchivioMD \\u2014 Cryptographic Content Integrity\",\"description\":\"Live preview of ArchivioMD: content hashing, Ed25519 document signing, RFC 3161 timestamps, Canary Token fingerprinting, and compliance exports for WordPress.\",\"author\":\"mountainviewprovisions\",\"categories\":[\"security\",\"compliance\",\"cryptography\"]},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=archiviomd-verification\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"login\":true,\"siteOptions\":{\"blogname\":\"ArchivioMD Demo Site\",\"blogdescription\":\"Cryptographic content integrity for WordPress\"},\"plugins\":[\"archiviomd\"],\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"archiviomd\"}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"ArchivioMD Demo Site\",\"blogdescription\":\"Cryptographic content integrity for WordPress\",\"permalink_structure\":\"\\\/%postname%\\\/\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once 'wordpress\\\/wp-load.php';\\n\\n\\\/\\\/ Enable content hashing with SHA-256\\nupdate_option('archiviomd_enabled', true);\\nupdate_option('archiviomd_algorithm', 'sha256');\\nupdate_option('archiviomd_badge_visible', true);\\nupdate_option('archiviomd_post_types', ['post', 'page']);\\n\\n\\\/\\\/ Create a demo post that gets hashed and signed\\n$post_id = wp_insert_post([\\n  'post_title'   => 'Demo: Cryptographic Integrity in Action',\\n  'post_content' => '<p>This post was hashed and signed automatically on publish by ArchivioMD.<\\\/p>\\n<p>The SHA-256 hash below is a deterministic fingerprint of this content. If even a single character were changed after publishing, the hash would no longer match and the verification badge would display \\\\u2717 Unverified.<\\\/p>\\n<p>Navigate to <strong>Meta Docs &amp; SEO<\\\/strong> in the sidebar to manage compliance documents, or visit <strong>Tools &rarr; ArchivioMD<\\\/strong> to run compliance exports and view the audit log.<\\\/p>\\n<p>You can also enable Ed25519 document signing, RFC 3161 trusted timestamps, Sigstore\\\/Rekor transparency log anchoring, DANE\\\/DNS key corroboration, and steganographic Canary Token fingerprinting from the plugin settings.<\\\/p>',\\n  'post_status'  => 'publish',\\n  'post_author'  => 1,\\n]);\\n\\n\\\/\\\/ Create a demo page\\nwp_insert_post([\\n  'post_title'   => 'About This Demo',\\n  'post_content' => '<p>This is a live WordPress Playground running ArchivioMD. Everything here is temporary and isolated to your browser session.<\\\/p>\\n<h2>What to explore<\\\/h2>\\n<ul>\\n<li><strong>Meta Docs &amp; SEO<\\\/strong> &mdash; Create and manage security.txt, privacy policy, robots.txt, llms.txt, and other compliance documents with automatic UUID assignment and append-only changelogs.<\\\/li>\\n<li><strong>Tools &rarr; ArchivioMD<\\\/strong> &mdash; Run compliance exports (CSV, JSON, ZIP), view the anchor activity log, and manually verify document checksums.<\\\/li>\\n<li><strong>Cryptographic Verification settings<\\\/strong> &mdash; Enable HMAC integrity mode, Ed25519 document signing, SLH-DSA post-quantum signing, RFC 3161 timestamps, Rekor transparency log, and DANE\\\/DNS key corroboration.<\\\/li>\\n<li><strong>Canary Tokens<\\\/strong> &mdash; Configure steganographic content fingerprinting across Unicode, semantic, and structural encoding channels.<\\\/li>\\n<\\\/ul>',\\n  'post_status'  => 'publish',\\n  'post_type'    => 'page',\\n  'post_author'  => 1,\\n]);\\n\\n\\\/\\\/ Flush rewrite rules so .well-known\\\/ endpoints work\\nflush_rewrite_rules();\\n?>\"},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once 'wordpress\\\/wp-load.php';\\n\\n\\\/\\\/ Create the meta-docs directory and a sample security.txt document\\n$upload_dir = wp_upload_dir();\\n$meta_docs  = $upload_dir['basedir'] . '\\\/meta-docs';\\nif (!file_exists($meta_docs)) {\\n  wp_mkdir_p($meta_docs);\\n}\\n\\n$security_txt = $meta_docs . '\\\/security.txt.md';\\nif (!file_exists($security_txt)) {\\n  file_put_contents($security_txt,\\n    \\\"# Security Policy\\\\n\\\\n\\\" .\\n    \\\"Contact: mailto:security@example.com\\\\n\\\" .\\n    \\\"Expires: 2026-12-31T23:59:59Z\\\\n\\\" .\\n    \\\"Preferred-Languages: en\\\\n\\\\n\\\" .\\n    \\\"This file was created and is managed by ArchivioMD.\\\\n\\\" .\\n    \\\"Every save generates a new SHA-256 checksum and an append-only changelog entry.\\\\n\\\"\\n  );\\n}\\n?>\"},{\"step\":\"runPHP\",\"progress\":{\"caption\":\"Flushing permalinks...\"},\"code\":\"<?php\\nrequire_once 'wordpress\\\/wp-load.php';\\nupdate_option('rewrite_rules', '');\\nflush_rewrite_rules(true);\\n?>\"}]}"}},"all_blocks":[],"tagged_versions":["1.16.0","1.17.4","1.17.5","1.17.6","1.17.7","1.19.0","1.19.1","1.19.2","1.7.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3485896,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3485896,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3485896,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3485896,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3485896,"resolution":"5","location":"assets","locale":""}},"screenshots":{"1":"Cryptographic Verification \u2014 Settings tab showing HMAC Integrity Mode configuration, including key status indicators and wp-config.php setup instructions.","2":"Meta Documentation &amp; SEO Manager \u2014 central file manager for meta-documentation Markdown files, SEO configuration files, and XML sitemaps.","3":"Canary Tokens \u2014 semantic steganography channel settings, showing the full list of available fingerprinting channels (contraction encoding, synonym substitution, spelling variants, and more).","4":"Trusted Timestamps (RFC 3161) \u2014 anchoring configuration panel with TSA provider selection, anchor queue status, and activity log with export options.","5":"Rekor \/ Sigstore Transparency Log \u2014 server requirements check, Rekor anchoring settings, and activity log for submissions to the Sigstore public transparency log."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[14361,256815,169961,24307,600],"plugin_category":[55],"plugin_contributors":[257994],"plugin_business_model":[],"class_list":["post-282855","plugin","type-plugin","status-publish","hentry","plugin_tags-compliance","plugin_tags-content-integrity","plugin_tags-cryptography","plugin_tags-digital-signature","plugin_tags-security","plugin_category-seo-and-marketing","plugin_contributors-mtnviewpro","plugin_committers-mtnviewpro"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/archiviomd\/assets\/icon-128x128.png?rev=3466506","icon_2x":"https:\/\/ps.w.org\/archiviomd\/assets\/icon-256x256.png?rev=3466506","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/archiviomd\/assets\/screenshot-1.png?rev=3485896","caption":"Cryptographic Verification \u2014 Settings tab showing HMAC Integrity Mode configuration, including key status indicators and wp-config.php setup instructions."},{"src":"https:\/\/ps.w.org\/archiviomd\/assets\/screenshot-2.png?rev=3485896","caption":"Meta Documentation &amp; SEO Manager \u2014 central file manager for meta-documentation Markdown files, SEO configuration files, and XML sitemaps."},{"src":"https:\/\/ps.w.org\/archiviomd\/assets\/screenshot-3.png?rev=3485896","caption":"Canary Tokens \u2014 semantic steganography channel settings, showing the full list of available fingerprinting channels (contraction encoding, synonym substitution, spelling variants, and more)."},{"src":"https:\/\/ps.w.org\/archiviomd\/assets\/screenshot-4.png?rev=3485896","caption":"Trusted Timestamps (RFC 3161) \u2014 anchoring configuration panel with TSA provider selection, anchor queue status, and activity log with export options."},{"src":"https:\/\/ps.w.org\/archiviomd\/assets\/screenshot-5.png?rev=3485896","caption":"Rekor \/ Sigstore Transparency Log \u2014 server requirements check, Rekor anchoring settings, and activity log for submissions to the Sigstore public transparency log."}],"raw_content":"<!--section=description-->\n<p>ArchivioMD gives WordPress sites a cryptographic proof layer. Every post, page, and document gets a verifiable integrity record \u2014 independently checkable without trusting the platform, the host, or the database.<\/p>\n\n<p>Built for journalists, compliance teams, legal publishers, and anyone for whom the question \"was this changed after it was published?\" has a real answer.<\/p>\n\n<h4>Content Hashing<\/h4>\n\n<p>Every post and page is hashed deterministically on publish and update. A verification badge (\u2713 Verified \/ \u2717 Unverified \/ \u2212 Not Signed) appears on every post. Verification files are downloadable for offline confirmation. Shortcode: <code>[hash_verify]<\/code>.<\/p>\n\n<p>Supported algorithms include SHA-256\/384\/512 family, SHA-3, BLAKE2b\/2s, BLAKE3, SHAKE, RIPEMD-160, Whirlpool, and GOST variants.<\/p>\n\n<p><strong>HMAC Integrity Mode<\/strong> adds a shared-secret layer on top of hashing. The key lives in <code>wp-config.php<\/code> \u2014 never the database \u2014 so an adversary with database access alone cannot silently update a hash.<\/p>\n\n<pre><code>define('ARCHIVIOMD_HMAC_KEY', 'your-secret-key');\n<\/code><\/pre>\n\n<h4>Document Signing<\/h4>\n\n<p>All signing methods sign the same canonical message and run independently. Any combination can be active simultaneously.<\/p>\n\n<p><strong>Ed25519<\/strong> (recommended for most sites) \u2014 uses PHP sodium (<code>ext-sodium<\/code>). Private key in <code>wp-config.php<\/code>; public key published at <code>\/.well-known\/ed25519-pubkey.txt<\/code>. In-browser keypair generator included. Supports DSSE envelope mode (Sigstore spec) with PAE binding to prevent cross-protocol replay.<\/p>\n\n<p><strong>SLH-DSA \/ SPHINCS+ (post-quantum)<\/strong> \u2014 pure-PHP implementation of NIST FIPS 205. No extensions, no Composer dependencies; works on any shared host running PHP 7.4+. Security rests on SHA-256 alone \u2014 not on factoring or discrete logarithms. Four parameter sets: SLH-DSA-SHA2-128s (default, 7,856-byte signatures), -128f (faster, 17,088 bytes), -192s, -256s. Signing takes 200\u2013600 ms on shared hosting per publish event \u2014 front-end rendering is not affected. Running Ed25519 and SLH-DSA together (hybrid mode) provides both classical and quantum verifiability from a single DSSE envelope.<\/p>\n\n<p><strong>ECDSA P-256<\/strong> \u26a0\ufe0f Enterprise\/compliance mode only. Enable when an external framework (eIDAS, SOC 2, HIPAA, government PKI) explicitly requires X.509 certificate-backed ECDSA. For all other sites, Ed25519 is recommended. Nonce generation is 100% delegated to OpenSSL.<\/p>\n\n<p><strong>RSA<\/strong> \u26a0\ufe0f Legacy compatibility only. Enable when a downstream system cannot accept Ed25519, ECDSA, or SLH-DSA keys.<\/p>\n\n<p><strong>CMS \/ PKCS#7<\/strong> \u2014 Detached DER signatures importable into Adobe Acrobat, Windows Explorer, and enterprise DMS platforms. Reuses your ECDSA or RSA key.<\/p>\n\n<p><strong>JSON-LD \/ W3C Data Integrity<\/strong> \u2014 Produces <code>eddsa-rdfc-2022<\/code> and <code>ecdsa-rdfc-2019<\/code> proof blocks per post and publishes a <code>did:web<\/code> DID document at <code>\/.well-known\/did.json<\/code>. Compatible with ActivityPub, W3C Verifiable Credentials, and decentralised identity wallets.<\/p>\n\n<p>All private keys are stored in <code>wp-config.php<\/code> \u2014 never in the database. PEM files uploaded via the admin UI are stored outside <code>DOCUMENT_ROOT<\/code>, chmod 0600, with an <code>.htaccess<\/code> Deny guard.<\/p>\n\n<h4>DANE \/ DNS Key Corroboration<\/h4>\n\n<p>Publishes every active signing key as a DNSSEC-protected DNS TXT record, giving verifiers a trust path entirely independent of your web server and TLS certificate. An attacker must compromise both your web host and your DNS zone simultaneously to forge a key.<\/p>\n\n<p>Records use the <code>amd1<\/code> tag-value format (modelled on DKIM):<\/p>\n\n<pre><code>_archiviomd._domainkey.example.com.  IN TXT \"v=amd1; k=ed25519; p=&lt;base64-pubkey&gt;\"\n<\/code><\/pre>\n\n<p>When ECDSA P-256 is configured, an optional TLSA record (RFC 6698, DANE-EE, Selector=1) binds the leaf certificate to your HTTPS service. A machine-readable discovery endpoint at <code>\/.well-known\/archiviomd-dns.json<\/code> lists all active records and expected values. A self-describing format specification is served at <code>\/.well-known\/archiviomd-dns-spec.json<\/code> regardless of whether DANE is enabled.<\/p>\n\n<p>Weekly passive health checks via wp-cron surface failures as dismissible admin notices. Key rotation mode suppresses false-positive mismatch warnings during DNS TTL expiry. Full WP-CLI support: <code>wp archiviomd dane-check<\/code>.<\/p>\n\n<p>DNSSEC is required for DANE to provide actual security. Most registrars offer it with a single toggle.<\/p>\n\n<h4>External Anchoring<\/h4>\n\n<p><strong>RFC 3161 Trusted Timestamps<\/strong> \u2014 Sends content hashes to a Time Stamp Authority on every anchor job. The signed <code>.tsr<\/code> token binds the hash to a specific time and is independently verifiable offline with OpenSSL. Built-in providers: FreeTSA.org, DigiCert, GlobalSign, Sectigo. Custom endpoint supported.<\/p>\n\n<p><strong>Sigstore \/ Rekor Transparency Log<\/strong> \u2014 Submits a <code>hashedrekord<\/code> entry to the public Rekor append-only log (rekor.sigstore.dev) on every anchor job. Entries are immutable and publicly verifiable without an account or API key. When Ed25519 keys are configured, entries are signed with the site key; otherwise an ephemeral keypair is generated automatically.<\/p>\n\n<p><strong>Git Repository Anchoring<\/strong> \u2014 Commits integrity records to GitHub or GitLab (public, private, or self-hosted) on every anchor job, creating an independent audit trail in commit history.<\/p>\n\n<p>All three anchoring methods can run simultaneously on every job.<\/p>\n\n<h4>Document Management<\/h4>\n\n<p>Browser-based editing (no FTP) for Markdown meta-documentation (security.txt, privacy policy, terms of service, etc.) and SEO\/compliance files: robots.txt, llms.txt, ads.txt, app-ads.txt, sellers.json, ai.txt. Documents get automatic UUID assignment, SHA-256 checksum tracking, and an append-only changelog. Standard and comprehensive XML sitemaps included.<\/p>\n\n<h4>Compliance &amp; Audit Tools<\/h4>\n\n<p>Metadata CSV, Compliance JSON, and Backup ZIP exports each generate a companion <code>.sig.json<\/code> integrity receipt (SHA-256 hash + optional cryptographic signature). The Compliance JSON export preserves full relationships between posts, hash history, anchor log entries, and RFC 3161 TSR manifests \u2014 suitable for legal evidence packages and SIEM ingestion.<\/p>\n\n<p>Manual checksum verification (read-only; does not modify anything). Backup &amp; Restore with mandatory dry-run before any restore operation.<\/p>\n\n<p>WP-CLI: <code>wp archiviomd process-queue<\/code>, <code>anchor-post &lt;id&gt;<\/code>, <code>verify &lt;id&gt;<\/code>, <code>prune-log<\/code>.<\/p>\n\n<h4>Canary Tokens (Steganographic Fingerprinting)<\/h4>\n\n<p><strong>Entirely opt-in. Nothing is injected unless you explicitly enable it.<\/strong><\/p>\n\n<p>Embeds an invisible, HMAC-authenticated fingerprint (post ID + timestamp + 48-bit MAC) into published content at render time \u2014 stored content is never modified. Fingerprints survive copy-paste and can identify the source of scraped content. A built-in decoder and DMCA Notice Generator are included. Signed evidence packages (<code>.sig.json<\/code>) can be generated after a successful decode for use in legal proceedings.<\/p>\n\n<p>Encoding operates across up to 14 channels in three layers:<\/p>\n\n<p><em>Unicode layer<\/em> (survives copy-paste; stripped by OCR): zero-width characters, thin-space variants, apostrophe variants, soft hyphens.<\/p>\n\n<p><em>Semantic layer<\/em> (survives OCR and Unicode normalisation; each opt-in): contraction encoding, synonym substitution, punctuation choice, spelling variants, hyphenation choices, number\/date style, punctuation style II, citation\/title style.<\/p>\n\n<p><em>Structural layer<\/em> (CDN-proof): sentence-count parity, word-count parity.<\/p>\n\n<p>Each bit is encoded three times per active channel with majority-vote redundancy. A cache compatibility layer ensures fingerprints survive HTML minification by WP Super Cache, W3 Total Cache, LiteSpeed Cache, WP Rocket, and similar plugins. The Canary Coverage meta box on the post edit screen shows per-channel slot availability before you publish.<\/p>\n\n<h4>Ideal For<\/h4>\n\n<ul>\n<li>Journalists and news publishers requiring tamper-evident records<\/li>\n<li>Legal teams and compliance departments needing auditable document trails<\/li>\n<li>Organisations subject to HIPAA, ISO 27001, SOC 2, or NIST SP 800-171 requirements<\/li>\n<li>Whistleblower platforms and activist publishers requiring integrity without platform trust<\/li>\n<li>Security researchers requiring transparent, verifiable publish records<\/li>\n<\/ul>\n\n<h4>Important Notes<\/h4>\n\n<p>All metadata is stored in the WordPress database. Regular database backups are required. All verification, export, and backup operations are admin-triggered and read-only \u2014 the plugin does not prevent or block modifications. Markdown and SEO files are stored in <code>uploads\/meta-docs\/<\/code> and are preserved on uninstall.<\/p>\n\n<h3>Getting Started<\/h3>\n\n<ol>\n<li><p><strong>Flush Permalinks<\/strong> \u2014 Settings \u2192 Permalinks \u2192 Save Changes. Required for all <code>.well-known\/<\/code> endpoints.<\/p><\/li>\n<li><p><strong>Create your first document<\/strong> \u2014 Go to Meta Docs &amp; SEO, pick a predefined file (e.g. security.txt.md), enter content, save. UUID and first changelog entry are created automatically.<\/p><\/li>\n<li><p><strong>Enable content hashing<\/strong> \u2014 Go to Cryptographic Verification \u2192 Settings, choose a hash algorithm (SHA-256 default), save. New and updated posts are hashed automatically from that point.<\/p><\/li>\n<li><p><strong>Configure Ed25519 signing<\/strong> (optional) \u2014 Use the in-browser keypair generator, add both constants to <code>wp-config.php<\/code>, enable signing. Posts, pages, and media are signed automatically on save.<\/p><\/li>\n<li><p><strong>Configure SLH-DSA<\/strong> (optional) \u2014 Navigate to Cryptographic Verification \u2192 Settings \u2192 SLH-DSA. Select a parameter set, generate a keypair server-side, add the three constants to <code>wp-config.php<\/code>, enable. Can run alongside Ed25519 (hybrid mode) or standalone.<\/p><\/li>\n<li><p><strong>Enable Rekor \/ RFC 3161 \/ Git anchoring<\/strong> (optional) \u2014 Each is configured independently under the ArchivioMD Tools menu. All three can run simultaneously on every anchor job.<\/p><\/li>\n<li><p><strong>Configure DANE<\/strong> (optional) \u2014 Requires at least one signing key. Publish the DNS TXT records shown in the admin panel, enable DNSSEC on your zone, then enable DANE Corroboration and run the health check.<\/p><\/li>\n<\/ol>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Log in to your WordPress admin panel<\/li>\n<li>Navigate to Plugins \u2192 Add New<\/li>\n<li>Search for \"ArchivioMD\"<\/li>\n<li>Click \"Install Now\" and then \"Activate\"<\/li>\n<li>Navigate to Settings \u2192 Permalinks and click \"Save Changes\" (required for <code>.well-known\/<\/code> file serving)<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file<\/li>\n<li>Upload via Plugins \u2192 Add New \u2192 Upload Plugin<\/li>\n<li>Activate the plugin<\/li>\n<li>Navigate to Settings \u2192 Permalinks and click \"Save Changes\"<\/li>\n<\/ol>\n\n<p>After activation you will see <strong>Meta Docs &amp; SEO<\/strong> in the admin sidebar and <strong>ArchivioMD<\/strong> under the Tools menu.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20my%20files%20stored%3F\"><h3>Where are my files stored?<\/h3><\/dt>\n<dd><p>Markdown and SEO files are stored in <code>uploads\/meta-docs\/<\/code>. Metadata (UUIDs, checksums, changelogs) is stored in <code>wp_options<\/code> with the prefix <code>mdsm_doc_meta_<\/code>.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20back%20up%20the%20database%3F\"><h3>Do I need to back up the database?<\/h3><\/dt>\n<dd><p>Yes. All metadata is stored in the database. The plugin's Backup &amp; Restore tool provides portable archives, but standard database backups are still required.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20uninstall%20the%20plugin%3F\"><h3>What happens if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>All files remain in the uploads directory. Database options are only deleted if you explicitly enable metadata cleanup before uninstalling.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20enforce%20file%20integrity%3F\"><h3>Does this plugin enforce file integrity?<\/h3><\/dt>\n<dd><p>No. It tracks integrity and provides manual verification tools. Verification is admin-triggered and read-only \u2014 it does not prevent or block modifications.<\/p><\/dd>\n<dt id=\"can%20i%20verify%20signatures%20without%20wordpress%3F\"><h3>Can I verify signatures without WordPress?<\/h3><\/dt>\n<dd><p>Yes. All signing methods are independently verifiable with standard tooling \u2014 no WordPress dependency required.<\/p>\n\n<ul>\n<li><strong>Ed25519:<\/strong> retrieve the public key from <code>\/.well-known\/ed25519-pubkey.txt<\/code> and verify with any sodium-compatible tool.<\/li>\n<li><strong>SLH-DSA:<\/strong> retrieve the public key from <code>\/.well-known\/slhdsa-pubkey.txt<\/code> and verify with any FIPS 205-compatible library (e.g. pyspx).<\/li>\n<li><strong>ECDSA P-256:<\/strong> retrieve the certificate from <code>\/.well-known\/ecdsa-cert.pem<\/code> and verify with OpenSSL or the Python <code>cryptography<\/code> library.<\/li>\n<li><strong>RSA:<\/strong> retrieve the public key from <code>\/.well-known\/rsa-pubkey.pem<\/code> and verify with OpenSSL.<\/li>\n<li><strong>CMS\/PKCS#7:<\/strong> decode the base64 DER blob and verify with OpenSSL, Adobe Acrobat, Java Bouncy Castle, or Windows CertUtil.<\/li>\n<li><strong>JSON-LD:<\/strong> retrieve the DID document from <code>\/.well-known\/did.json<\/code> and verify with <code>@digitalbazaar\/jsonld-signatures<\/code> (JS) or <code>pyld<\/code> + <code>cryptography<\/code> (Python).<\/li>\n<li><strong>RFC 3161:<\/strong> download the <code>.tsr<\/code> and <code>.tsq<\/code> files from the compliance tools page and run <code>openssl ts -verify -in response.tsr -queryfile request.tsq -CAfile tsa.crt<\/code>.<\/li>\n<li><strong>Rekor:<\/strong> use <code>rekor-cli verify --artifact-hash sha256:&lt;HASH&gt; --log-index &lt;INDEX&gt;<\/code> or look up the entry at <code>https:\/\/search.sigstore.dev\/?logIndex=&lt;INDEX&gt;<\/code>.<\/li>\n<\/ul><\/dd>\n<dt id=\"when%20should%20i%20use%20ecdsa%20p-256%20instead%20of%20ed25519%3F\"><h3>When should I use ECDSA P-256 instead of Ed25519?<\/h3><\/dt>\n<dd><p>Only when an external compliance framework explicitly requires X.509 certificate-backed ECDSA \u2014 for example, eIDAS qualified signatures, certain government PKI mandates, SOC 2 audit requirements specifying certificate-bound signatures, or HIPAA requirements from a specific assessor. For all other sites, Ed25519 is recommended: simpler to configure, no certificate expiry to manage, and equally secure.<\/p><\/dd>\n<dt id=\"when%20should%20i%20use%20the%20extended%20signing%20formats%20%28rsa%2C%20cms%2C%20json-ld%29%3F\"><h3>When should I use the extended signing formats (RSA, CMS, JSON-LD)?<\/h3><\/dt>\n<dd><p>Use <strong>RSA<\/strong> only when a downstream system cannot accept Ed25519, ECDSA, or SLH-DSA keys \u2014 for example, older HSMs or legacy enterprise toolchains hardcoded to RSA. Use <strong>CMS\/PKCS#7<\/strong> when a DMS, Adobe Acrobat workflow, or regulated-industry audit tool specifically requires <code>.p7s<\/code> format. Use <strong>JSON-LD \/ W3C Data Integrity<\/strong> when building interoperability with ActivityPub implementations, W3C Verifiable Credential ecosystems, or decentralised identity wallets. For general integrity verification, Ed25519 covers all common use cases with far less operational overhead.<\/p><\/dd>\n<dt id=\"why%20is%20slh-dsa%20signing%20slow%3F\"><h3>Why is SLH-DSA signing slow?<\/h3><\/dt>\n<dd><p>SLH-DSA (SPHINCS+) builds a Merkle tree of hundreds of hash computations per signature. Because this implementation is pure PHP rather than a native C extension, expect 200\u2013600 ms on shared hosting for the default SHA2-128s parameter set. To reduce it, switch to SHA2-128f \u2014 same NIST Category 1 security, 5\u201310\u00d7 faster signing, larger signatures. This overhead occurs once per publish event and has no effect on front-end page rendering.<\/p><\/dd>\n<dt id=\"should%20i%20run%20ed25519%20and%20slh-dsa%20together%3F\"><h3>Should I run Ed25519 and SLH-DSA together?<\/h3><\/dt>\n<dd><p>Yes, if you need verifiability today and quantum resilience for the future. In hybrid mode the DSSE envelope carries both signatures. Existing verifiers that only understand Ed25519 continue to work unchanged.<\/p><\/dd>\n<dt id=\"does%20rekor%20require%20an%20api%20key%3F\"><h3>Does Rekor require an API key?<\/h3><\/dt>\n<dd><p>No. The public good instance (rekor.sigstore.dev) is a free, unauthenticated API operated by the Linux Foundation's Sigstore project.<\/p><\/dd>\n<dt id=\"does%20dane%20corroboration%20require%20dnssec%3F\"><h3>Does DANE Corroboration require DNSSEC?<\/h3><\/dt>\n<dd><p>Yes. Without DNSSEC, DNS responses are unauthenticated and the TXT records provide no additional trust over the web server alone. Most registrars now offer DNSSEC with a single toggle.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20gdpr%20compliant%3F\"><h3>Is this plugin GDPR compliant?<\/h3><\/dt>\n<dd><p>The plugin does not collect, store, or process personal data from visitors. It stores administrative metadata associated with WordPress user accounts. Compliance with GDPR depends on how you use the plugin \u2014 consult your legal team.<\/p><\/dd>\n<dt id=\"can%20non-admin%20users%20access%20these%20features%3F\"><h3>Can non-admin users access these features?<\/h3><\/dt>\n<dd><p>No. All features require the <code>manage_options<\/code> capability (administrator role).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.19.2<\/h4>\n\n<ul>\n<li>Added five admin screenshots to the WordPress plugin directory listing, covering Cryptographic Verification settings, Meta Documentation &amp; SEO Manager, Canary Tokens channel settings, Trusted Timestamps (RFC 3161), and Rekor \/ Sigstore Transparency Log. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.19.1<\/h4>\n\n<ul>\n<li>Fixed verification badge text (\"Verified\") appearing as plain text in search engine title tags when Yoast SEO (and other SEO plugins) are active. SEO plugins call <code>get_the_title()<\/code> while building the <code>&lt;title&gt;<\/code> tag before <code>wp_head<\/code> completes; the badge HTML was being appended, stripped of its tags, and indexed as part of the post title. Badge now only injects after <code>wp_head<\/code> has fired, ensuring it renders in the page body only and is never seen by search engines.<\/li>\n<\/ul>\n\n<h4>1.19.0<\/h4>\n\n<ul>\n<li>Fixed custom markdown files returning 404. WordPress rewrite rules now register routes for both the root path and the <code>\/.well-known\/meta-docs\/<\/code> path, which is where the file manager stores custom files by default. Previously only the root-level route was registered, so any request to the <code>.well-known<\/code> path fell through to a 404.<\/li>\n<li>Fixed unreliable rewrite rule flushing after creating or deleting a custom markdown file via the admin UI. <code>flush_rewrite_rules()<\/code> called inside an AJAX handler does not always persist reliably; the fix schedules a guaranteed follow-up flush on the next real page load via a transient flag.<\/li>\n<li>Added ArchivioID PGP Validator support to the browser extension. The extension now calls the ArchivioID REST API (<code>\/wp-json\/archivio-id\/v1\/posts\/{id}\/signatures<\/code>), retrieves all PGP signature records, fetches public keys from <code>keys.openpgp.org<\/code> by fingerprint, and performs client-side cryptographic verification using OpenPGP.js (Ed25519, RSA, ECDSA supported). Results are surfaced as Step 8 in the full verification report.<\/li>\n<li>Hardened REST API verification endpoint: added per-IP rate limiting (60 req\/min), restricted URL resolution to the site's own domain to prevent cross-origin post enumeration, replaced table-name SQL interpolation with a whitelisted identifier check, changed <code>Cache-Control<\/code> on <code>\/verify<\/code> from <code>public<\/code> to <code>private<\/code> to prevent shared-proxy caching of verification status, and reduced <code>\/status<\/code> cache TTL to prevent stale feature-flag disclosure.<\/li>\n<\/ul>\n\n<h4>1.17.4<\/h4>\n\n<ul>\n<li>Fixed version mismatch: plugin header <code>Version<\/code> and <code>MDSM_VERSION<\/code> constant were stuck at 1.16.0 across the 1.17.x release series. Both now correctly read 1.17.4 and match the readme <code>Stable tag<\/code>.<\/li>\n<\/ul>\n\n<h4>1.17.3<\/h4>\n\n<ul>\n<li>Added <code>\/.well-known\/archiviomd-dns-spec.json<\/code> \u2014 a machine-readable, self-contained specification for the <code>amd1<\/code> TXT record format, the TLSA profile, the canonical message format, and the end-to-end verification flow.<\/li>\n<li><code>archiviomd-dns.json<\/code> now includes a <code>spec_url<\/code> field pointing to the spec endpoint.<\/li>\n<\/ul>\n\n<h4>1.17.2<\/h4>\n\n<ul>\n<li>Added TLSA cert-expiry staleness warning (\u2264 30 days warns, expired errors).<\/li>\n<li>Added <code>ARCHIVIOMD_DANE_TTL<\/code> constant; TTL now configurable and used consistently across rotation threshold, admin UI, and <code>Cache-Control<\/code> headers.<\/li>\n<li>Added ETag \/ <code>If-None-Match<\/code> \/ 304 conditional response support to the discovery endpoint.<\/li>\n<li>Fixed discovery endpoint returning HTTP 404 when DANE disabled \u2014 now returns HTTP 200 with <code>{\"enabled\":false}<\/code> so verifiers can distinguish module-off from a wrong URL.<\/li>\n<li>Fixed DoH network timeout surfacing as a false \"DNSSEC not validated\" admin notice.<\/li>\n<\/ul>\n\n<h4>1.17.1<\/h4>\n\n<ul>\n<li>Added TLSA \/ DANE-EE support (RFC 6698) for the ECDSA P-256 certificate. Selector=1 (SubjectPublicKeyInfo) so the record survives certificate renewal without a key change.<\/li>\n<li>Added copy-to-clipboard buttons for all DNS TXT record values in the admin UI.<\/li>\n<li>Fixed <code>Cache-Control<\/code> bug in the discovery endpoint that overwrote the intended <code>public, max-age=3600<\/code> header.<\/li>\n<li>Added <code>--enable<\/code> and <code>--disable<\/code> flags to <code>wp archiviomd dane-check<\/code>.<\/li>\n<\/ul>\n\n<h4>1.17.0<\/h4>\n\n<ul>\n<li>Added DANE \/ DNS Key Corroboration. Publishes Ed25519, SLH-DSA, ECDSA P-256, and RSA public keys as DNSSEC-protected DNS TXT records in the custom <code>amd1<\/code> format. DoH-based health checks, weekly passive cron, key rotation workflow, machine-readable discovery endpoint at <code>\/.well-known\/archiviomd-dns.json<\/code>, JSON-LD integration, and WP-CLI <code>wp archiviomd dane-check<\/code>.<\/li>\n<\/ul>\n\n<h4>1.16.0<\/h4>\n\n<ul>\n<li>Added RSA Compatibility Signing (Extended Format). RSA-PSS\/SHA-256 (recommended) and PKCS#1 v1.5\/SHA-256. Minimum key size 2048 bits enforced. Public key published at <code>\/.well-known\/rsa-pubkey.pem<\/code>.<\/li>\n<li>Added CMS \/ PKCS#7 Detached Signatures (Extended Format). DER blob importable directly into Adobe Acrobat and enterprise DMS platforms as <code>.p7s<\/code>. Reuses existing ECDSA or RSA key.<\/li>\n<li>Added JSON-LD \/ W3C Data Integrity Proofs (Extended Format). Cryptosuites <code>eddsa-rdfc-2022<\/code> and <code>ecdsa-rdfc-2019<\/code>. DID document at <code>\/.well-known\/did.json<\/code>.<\/li>\n<li>All three new methods are opt-in, disabled by default, and sign the same canonical message as all other methods.<\/li>\n<\/ul>\n\n<h4>1.15.0<\/h4>\n\n<ul>\n<li>Added ECDSA P-256 document signing (Enterprise \/ Compliance Mode). Nonce generation delegated entirely to OpenSSL. Certificate validated on every signing operation. Private keys stored outside <code>DOCUMENT_ROOT<\/code>, chmod 0600. Leaf certificate published at <code>\/.well-known\/ecdsa-cert.pem<\/code>.<\/li>\n<\/ul>\n\n<h4>1.14.0<\/h4>\n\n<ul>\n<li>Added SLH-DSA (SPHINCS+) post-quantum document signing \u2014 NIST FIPS 205, pure PHP, no extensions or Composer dependencies. Four parameter sets: SHA2-128s (default), SHA2-128f, SHA2-192s, SHA2-256s. Hybrid mode with Ed25519 via shared DSSE envelope.<\/li>\n<\/ul>\n\n<h4>1.13.1<\/h4>\n\n<ul>\n<li>Fixed SSRF in the URL decoder (<code>ajax_decode_url()<\/code>): hostname now resolved via <code>dns_get_record()<\/code> with full private\/loopback range rejection and cURL IP pinning to prevent TOCTOU.<\/li>\n<li>Fixed rate limiter bypass via <code>X-Forwarded-For<\/code>: now uses rightmost IP with private-range validation, falls back to <code>REMOTE_ADDR<\/code>.<\/li>\n<li>Fixed evidence receipts signed over arbitrary POST data: handler now fetches the authoritative server-written log row by ID.<\/li>\n<li>Fixed key rotation warning that could not be dismissed (wrong option key names in delete calls).<\/li>\n<li>Fixed three canary option keys missing from the site-specific obfuscation map (fell through to a site-agnostic fallback, defeating the scheme).<\/li>\n<li>Fixed ReDoS in <code>extract_main_content()<\/code>: input capped at 2 MB; <code>DOMDocument<\/code> used as primary extractor; regex fallback uses bounded quantifiers.<\/li>\n<li>Removed <code>sslverify =&gt; false<\/code> from all outbound fetches.<\/li>\n<li>Added persistent admin notice when <code>ARCHIVIOMD_HMAC_KEY<\/code> is not defined in <code>wp-config.php<\/code>.<\/li>\n<\/ul>\n\n<h4>1.13.0<\/h4>\n\n<ul>\n<li>Added Ch.13 (Sentence-count parity) and Ch.14 (Word-count parity) structural fingerprinting channels \u2014 CDN-proof, survive Unicode normalisation.<\/li>\n<li>Added <code>Cache-Control: no-transform<\/code> header on all fingerprinted responses.<\/li>\n<li>Renamed REST endpoints from <code>archiviomd\/v1\/canary-check<\/code> to <code>content\/v1\/verify<\/code> to reduce plugin fingerprinting via API enumeration.<\/li>\n<li>Added <code>.htaccess<\/code> to plugin root blocking direct HTTP access to <code>.php<\/code>, <code>.txt<\/code>, <code>.json<\/code>, and other source files.<\/li>\n<li>Added key-derived pair selection for Ch.5\/6\/8\/9: active dictionary subset is site-specific, making adversarial reversal equivalent to key brute-force.<\/li>\n<li>Added <code>wp_options<\/code> key obfuscation for all Canary Token settings.<\/li>\n<\/ul>\n\n<h4>1.12.0<\/h4>\n\n<ul>\n<li>Added Cache Compatibility Layer. Detects and repairs Unicode fingerprint stripping by WP Super Cache, W3 Total Cache, LiteSpeed Cache, WP Rocket, and other HTML-minifying caching plugins \u2014 no caching plugin configuration required.<\/li>\n<\/ul>\n\n<h4>1.11.0<\/h4>\n\n<ul>\n<li>Added Canary Token channels Ch.8\u2013Ch.12: Spelling Variants (60+ British\/American pairs), Hyphenation Choices (30+ compound pairs), Number\/Date Style, Punctuation Style II, Citation\/Title Style.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>Added REST API fingerprinting (closes WP REST API scraping path).<\/li>\n<li>Added rate limiting on public verification endpoint (60 req\/min; HTTP 429).<\/li>\n<li>Added Key Health Monitor with persistent admin notice on HMAC key change.<\/li>\n<li>Added Discovery Log (<code>wp_archivio_canary_log<\/code>) with CSV export.<\/li>\n<li>Added Signed Evidence Package \u2014 <code>.sig.json<\/code> receipt with SHA-256 + optional Ed25519 signature for each decode event.<\/li>\n<li>Added Re-fingerprint All Posts bulk action (single atomic SQL upsert).<\/li>\n<li>Added Canary Coverage meta box on the post edit screen.<\/li>\n<li>Added Ch.7 (Punctuation Choice: Oxford comma, em-dash\/parentheses).<\/li>\n<li>Added URL Decoder and DMCA Notice Generator tabs.<\/li>\n<\/ul>\n\n<p>For versions prior to 1.8.0, see the full changelog on the plugin's development repository.<\/p>","raw_excerpt":"Cryptographic content integrity for WordPress \u2014 hashing, signing, RFC 3161 timestamps, Rekor transparency log, and DANE corroboration.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/282855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=282855"}],"author":[{"embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mtnviewpro"}],"wp:attachment":[{"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=282855"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=282855"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=282855"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=282855"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=282855"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=282855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}