När en inbäddad XML-signatur genereras, infogas signaturelementen i den signerade informationen. Om du exempelvis har signerat följande meddelande med en struktur för en inbäddad signatur:
<message>
<data>...</data>
</message>
Ser det resulterande signerade dokumentet ut så här:
<message>
<data>...</data>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>yv6...Z0Y=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>cCY...LQ==</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MII...4e</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</message>
Observera att signaturen innehåller ett enda Reference-element med en tom sträng som dess URI. En tom sträng i den här kontexten refererar till dokumentets rot.
Observera också att transformeringsalgoritmen anger att en transformering av en inbäddad signatur har tillämpats. När den här typen av transformering har tillämpats tar XMLSignatureValidator automatiskt bort signaturen i dokumentet innan sammanfattningen beräknas. Det betyder att IURIDereferencer inte behöver ta bort Signature-elementet när informationen returneras.
Följande exempel illustrerar en IURIDereferencer för inbäddade signaturer:
package
{
import flash.events.ErrorEvent;
import flash.events.EventDispatcher;
import flash.security.IURIDereferencer;
import flash.utils.ByteArray;
import flash.utils.IDataInput;
public class EnvelopedDereferencer
extends EventDispatcher implements IURIDereferencer
{
private var signedMessage:XML;
public function EnvelopedDereferencer( signedMessage:XML )
{
this.signedMessage = signedMessage;
}
public function dereference( uri:String ):IDataInput
{
try
{
if( uri.length != 0 )
{
throw( new Error("Unsupported signature type.") );
}
var data:ByteArray = new ByteArray();
data.writeUTFBytes( signedMessage.toXMLString() );
data.position = 0;
}
catch (e:Error)
{
var error:ErrorEvent =
new ErrorEvent("Ref error " + uri + " ", false, false, e.message);
this.dispatchEvent(error);
data = null;
throw new Error("Reference not resolvable: " + uri + ", " + e.message);
}
finally
{
return data;
}
}
}
}
Den här IURIDereferencer-klassen använder en konstruktorfunktion med en parameter,
signedMessage
, för att göra dokumentet med den inbäddade signaturen tillgängligt för
dereference()
-metoden. Eftersom referensen i en inbäddad signatur alltid refererar till roten för den signerade informationen skriver
dereferencer()
-metoden dokumentet till en bytearray och returnerar ByteArray-objektet.