XML Enveloping Signatures Explained
An enveloping XML signature is a digital signature structure where
the <Signature> element acts as the parent container
that directly wraps the signed payload within itself. This article
details how XML Signature (XMLDSIG) implements enveloping signatures,
focusing on the role of the <Object> element, the
internal referencing mechanisms used to locate the embedded payload, and
the step-by-step process of signing and verifying these self-contained
XML structures.
Anatomy of an Enveloping Signature
Unlike enveloped signatures (where the signature is placed inside the
data) or detached signatures (where the signature exists separately from
the data), an enveloping signature embeds the data inside a
<ds:Object> element located directly within the
<ds:Signature> element.
The standard structural hierarchy of an enveloping signature is as follows:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<ds:Reference URI="#payload1">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<ds:DigestValue>...</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue>
<ds:KeyInfo>...</ds:KeyInfo>
<ds:Object Id="payload1">
<!-- The actual signed XML data goes here -->
<DocumentData>
<Message>Confidential Content</Message>
</DocumentData>
</ds:Object>
</ds:Signature>How the Signature Wraps and References Data
The enveloping mechanism relies on internal URI fragment identifiers to link the cryptographic validation metadata to the wrapped payload:
- Embedding Data in
<ds:Object>: The data to be signed is placed inside one or more<ds:Object>elements. Each<ds:Object>is assigned a uniqueIdattribute (e.g.,Id="payload1"). - Internal Referencing: Inside
<ds:SignedInfo>, a<ds:Reference>element points to the target<ds:Object>using a URI attribute formatted as a same-document reference (e.g.,URI="#payload1"). - Data Transformation and Digesting:
- The XML processing engine locates the element matching the
Id. - Any specified canonicalization or transformation rules defined in
<ds:Transforms>are applied to ensure standard formatting. - The transformed object content is hashed using the algorithm
specified in
<ds:DigestMethod>, and the resulting hash is placed in<ds:DigestValue>.
- The XML processing engine locates the element matching the
- Signing
<ds:SignedInfo>: The cryptographic signature in<ds:SignatureValue>is calculated over the canonicalized<ds:SignedInfo>element, thereby securing the<ds:DigestValue>that represents the wrapped object.
The Verification Process
Validating an enveloping XML signature follows a strict two-stage process:
- Core Validity (Signature Verification): The
verifier canonicalizes
<ds:SignedInfo>and uses the sender’s public key (retrieved from<ds:KeyInfo>or an external trust store) to verify the<ds:SignatureValue>. This confirms that<ds:SignedInfo>has not been altered. - Reference Validation:
- The verifier resolves the URI reference (
#payload1) to find the corresponding<ds:Object>within the document. - The verifier applies the transforms specified in the reference to
the
<ds:Object>. - The verifier calculates the digest of the transformed
<ds:Object>and compares it against the<ds:DigestValue>in<ds:Reference>.
- The verifier resolves the URI reference (
If both the cryptographic signature and digest comparisons match, the enveloping signature is valid.
Key Benefits and Use Cases
- Self-Containment: Enveloping signatures produce a single, portable XML document that holds both the data and the proof of integrity, eliminating the need to manage multiple detached files.
- Unmodified Payloads: Because the data is wrapped
inside
<ds:Object>rather than altered to insert a<ds:Signature>child, the original schema and structure of the payload remain intact. - Multiple Objects: A single enveloping signature can
wrap multiple
<ds:Object>elements, securing disparate pieces of data under distinct references within one container.