Je veux signer une chaîne XML qui ressemble à ceci:Signature XML sur XML avec la signature existante
<Foo>
<ds:Signature Id="REC">
<ds:SignedInfo>
<ds:CanonicalizationMethod />
<ds:SignatureMethod />
<ds:Reference>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod>
<ds:DigestValue>
</ds:Reference>
<ds:Reference /> etc.
</ds:SignedInfo>
<ds:SignatureValue />
<ds:KeyInfo />
<ds:Object />
</ds:Signature>
</Foo>
Alors qu'il ajoute une autre signature (avec le DigestValue et SignatureValue correspondant) et il devrait ressembler à ceci:
<Foo>
<ds:Signature Id="REC">
<ds:SignedInfo>
<ds:CanonicalizationMethod />
<ds:SignatureMethod />
<ds:Reference>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod>
<ds:DigestValue>
</ds:Reference>
<ds:Reference /> etc.
</ds:SignedInfo>
<ds:SignatureValue />
<ds:KeyInfo />
<ds:Object />
</ds:Signature>
<ds:Signature Id="PAC">
<ds:SignedInfo>
<ds:CanonicalizationMethod />
<ds:SignatureMethod />
<ds:Reference>
<ds:Transforms>
<ds:DigestMethod>
<ds:DigestValue>[DIGEST VALUE OF ALL THE PREVIOUS XML]</ds:DigestValue>
</ds:Reference>
<ds:Reference /> etc.
</ds:SignedInfo>
<ds:SignatureValue />
<ds:KeyInfo />
<ds:Object />
</ds:Signature>
</Foo>
Le code java qui fait ma transformation est:
_TRANSFORM = "not(ancestor-or-self::ds:Signature)";
XPathContainer xpathC = new XPathContainer(doc2);
xpathC.setXPath(_TRANSFORM);
Transforms transforms = new Transforms(doc2);
transforms.addTransform("http://www.w3.org/TR/1999/REC-xpath-19991116",xpathC.getElement());
signature.addDocument("", transforms);
Qu'est-ce que XPATH EXPRE ssion dois-je utiliser pour obtenir une digestion de tout le XML et pas seulement "Foo" (comme je l'ai fait avec le précédent)?
Jusqu'à présent, Ive a essayé:
- pas (ancêtre ou auto-:: ds: Signature [@ id = 'PAC'])
- (ancêtre ou self :: Foo et non (ancestor-or-self :: ds: Signature [@Id = 'PAC'])) ou ancêtre-ou-self :: ds: Signature [@Id = 'REC']
- pas (ancêtre ou soi) :: ds: Signature [@ Id = 'PAC']) ou (ancêtre-ou-soi :: ds: Signature [@ Id = 'REC'])
... sans chance.
Nous vous remercions de votre temps.