Unchanged bytes can still violate policy.
A string contains a bidirectional control or zero-width character. The signature and digest both pass because the dangerous bytes were present when the producer signed them.
The correct failure
- Verify authenticity Keep the valid signature result. Do not mislabel the content hazard as tampering.
- Verify artifact integrity Keep the valid digest result when the received bytes are unchanged.
- Apply the required profile Validate the actual structured artifact or relevant predicate extension under the receiver's digest-pinned schema.
- Deny on content policy Report the exact field and rule that failed so the producer can normalize, reject, or explicitly justify the value.
Why this belongs in the provenance story
The profile and result travel with the evidence boundary, so a later recipient can tell the difference between “bytes changed” and “unchanged bytes were never acceptable.” That distinction matters for incident response and remediation.
Concrete content-policy check
| Input | A signed JSON artifact whose visible label contains a hidden bidirectional or control character. |
|---|---|
| Integrity result | The digest and signature can still pass because the bytes have not changed. |
| Profile result | A receiver-required bounded string rule rejects the exact field and reports the profile failure. |
| Remediation | The producer normalizes or rejects the field, creates new output bytes, and appends a new signed statement. |