@@ -480,7 +480,7 @@ SignedXml.prototype.validateReferences = function(doc) {
480
480
var hash = this . findHashAlgorithm ( ref . digestAlgorithm )
481
481
var digest = hash . getHash ( canonXml )
482
482
483
- if ( digest != ref . digestValue ) {
483
+ if ( ! validateDigestValue ( digest , ref . digestValue ) ) {
484
484
this . validationErrors . push ( "invalid signature: for uri " + ref . uri +
485
485
" calculated digest is " + digest +
486
486
" but the xml to validate supplies digest " + ref . digestValue )
@@ -491,6 +491,36 @@ SignedXml.prototype.validateReferences = function(doc) {
491
491
return true
492
492
}
493
493
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
+
494
524
SignedXml . prototype . loadSignature = function ( signatureNode ) {
495
525
if ( typeof signatureNode === 'string' ) {
496
526
this . signatureNode = signatureNode = new Dom ( ) . parseFromString ( signatureNode ) ;
0 commit comments