Release note · August 6, 2026

A transform has an attribute boundary

By SybilGambleyyu · DocFence 0.63.0

XMLDSIG transform markup has a compact direct attribute grammar. DocFence 0.63 now enforces it anywhere in a recognized OPC package signature, before its bounded static coverage audit can treat any declaration as evidence.

The container has none; the transform has one

XMLDSIG Core's TransformsType declares no attributes. Its TransformType declares one required attribute: Algorithm. A standard declaration therefore looks like this:

<ds:Transforms>
  <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</ds:Transforms>

In 0.63, an attribute-bearing ds:Transforms, or a ds:Transform with a missing, wrong, or extra attribute, closes the recognized signature shape. This complements OPC's existing requirement that every transform algorithm is one of the Relationship Transform URI or its two permitted canonicalization URIs.

Global structural evidence, not a coverage loophole

The rule applies to every transform in a recognized signature—not only a transform that happens to sit in the package-object binding or manifest selected for coverage. An extra attribute on an otherwise unrelated SignedInfo reference therefore cannot remain invisible while another manifest receives coverage credit. The same is true for a transform on a Word-manifest reference.

This remains a stored-markup boundary, not a general transform engine. DocFence does not validate arbitrary transform parameters or child markup, execute a transform, canonicalize XML, recompute a digest, verify XMLDSIG, validate certificates, or decide trust.

Evidence and use

The 73-test suite covers attribute-bearing Transforms and Transform markup both on a non-coverage SignedInfo reference and in a Word-manifest path. Across the 29 DOCX files in the public OOXML Signature Security artifacts, 63 Transforms containers are attribute-free and all 101 Transform elements carry only Algorithm. Every captured corpus outcome matches 0.62 byte-for-byte.

Two independent epoch-fixed builds were byte-identical. SHA-256: wheel 8e32d8430a3cb26ca31962d68a23a145ada0ed1f2aca89f148bc76ca4572ff9e; source distribution 58874ca4548ba0aeca4b8797c587d7cf3cc598a71b4761ac42c5e107510f56b4.

python -m pip install https://github.com/SybilGambleyyu/docfence/releases/download/v0.63.0/docfence-0.63.0-py3-none-any.whl

docfence check approved.docx candidate.docx --policy docfence.yml --format sarif --output docfence.sarif

The tagged policy reference, threat model, and validation notes define the boundary. A static assurance tool should not accept unrecognized attributes as though they were ordinary transform metadata.