Skip to content

Commit 32fbbd5

Browse files
xdmnlLoneRifle
authored andcommitted
Decode DigestValue for validation (#160)
1 parent f425ed1 commit 32fbbd5

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

lib/signed-xml.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ SignedXml.prototype.validateReferences = function(doc) {
480480
var hash = this.findHashAlgorithm(ref.digestAlgorithm)
481481
var digest = hash.getHash(canonXml)
482482

483-
if (digest!=ref.digestValue) {
483+
if (!validateDigestValue(digest, ref.digestValue)) {
484484
this.validationErrors.push("invalid signature: for uri " + ref.uri +
485485
" calculated digest is " + digest +
486486
" but the xml to validate supplies digest " + ref.digestValue)
@@ -491,6 +491,36 @@ SignedXml.prototype.validateReferences = function(doc) {
491491
return true
492492
}
493493

494+
function validateDigestValue(digest, expectedDigest) {
495+
var buffer, expectedBuffer;
496+
497+
if (typeof Buffer.from === 'function') {
498+
buffer = Buffer.from(digest, 'base64');
499+
expectedBuffer = Buffer.from(expectedDigest, 'base64');
500+
} else {
501+
// Compatibility with Node < 5.10.0
502+
buffer = new Buffer(digest, 'base64');
503+
expectedBuffer = new Buffer(expectedDigest, 'base64');
504+
}
505+
506+
if (typeof buffer.equals === 'function') {
507+
return buffer.equals(expectedBuffer);
508+
}
509+
510+
// Compatibility with Node < 0.11.13
511+
if (buffer.length !== expectedBuffer.length) {
512+
return false;
513+
}
514+
515+
for (var i = 0; i < buffer.length; i++) {
516+
if (buffer[i] !== expectedBuffer[i]) {
517+
return false;
518+
}
519+
}
520+
521+
return true;
522+
}
523+
494524
SignedXml.prototype.loadSignature = function(signatureNode) {
495525
if (typeof signatureNode === 'string') {
496526
this.signatureNode = signatureNode = new Dom().parseFromString(signatureNode);

test/signature-unit-tests.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ module.exports = {
486486
passValidSignature(test, "./test/static/valid_signature_with_lowercase_id_attribute.xml");
487487
passValidSignature(test, "./test/static/valid_signature wsu.xml", "wssecurity")
488488
passValidSignature(test, "./test/static/valid_signature_with_reference_keyInfo.xml")
489+
passValidSignature(test, "./test/static/valid_signature_with_whitespace_in_digestvalue.xml")
489490
passValidSignature(test, "./test/static/valid_signature_utf8.xml")
490491
test.done()
491492
},
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<root><x xmlns="ns" Id="_0"/><y z_attr="value" a_attr1="foo" Id="_1"/><z><ns:w ns:attr="value" xmlns:ns="myns" Id="_2"/></z><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#_0"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>b5GCZ2xpP5T7tbLWBTkOl4CYupQ=
2+
</DigestValue></Reference><Reference URI="#_1"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>K4dI497ZCxzweDIrbndUSmtoezY=
3+
</DigestValue></Reference><Reference URI="#_2"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>sH1gxKve8wlU8LlFVa2l6w3HMJ0=
4+
</DigestValue></Reference></SignedInfo><SignatureValue>gGp+jskU2HohMdhaeGTdJBbN/rngzWrQs0+N4bqJDzHQEqUm6rVk0mDoFybJaW0AEXf/dSVhM0faYTwQK0p9aipsAORTaPq677GcdKwyEHHRnly064D8GlikyQ49451SEViy89kYZO1yf+x5MNHNyCi7VVRIixbsSLOUgu0A9Yo=</SignatureValue></Signature></root>

0 commit comments

Comments
 (0)