class Xmldsig::Reference
Attributes
errors[RW]
id_attr[RW]
reference[RW]
Public Class Methods
new(reference, id_attr = nil, referenced_documents = {})
click to toggle source
# File lib/xmldsig/reference.rb, line 8 def initialize(reference, id_attr = nil, referenced_documents = {}) @reference = reference @errors = [] @id_attr = id_attr @referenced_documents = referenced_documents end
Public Instance Methods
calculate_digest_value()
click to toggle source
# File lib/xmldsig/reference.rb, line 61 def calculate_digest_value transformed = transforms.apply(referenced_node) case transformed when String digest_method.digest transformed when Nokogiri::XML::Node digest_method.digest Canonicalizer.new(transformed).canonicalize end end
digest_method()
click to toggle source
# File lib/xmldsig/reference.rb, line 71 def digest_method algorithm = reference.at_xpath("descendant::ds:DigestMethod", NAMESPACES).get_attribute("Algorithm") case algorithm =~ /sha(.*?)$/i && $1.to_i when 512 Digest::SHA512 when 256 Digest::SHA256 when 1 Digest::SHA1 else Digest::SHA256 end end
digest_value()
click to toggle source
# File lib/xmldsig/reference.rb, line 57 def digest_value Base64.decode64 reference.at_xpath("descendant::ds:DigestValue", NAMESPACES).content end
digest_value=(digest_value)
click to toggle source
# File lib/xmldsig/reference.rb, line 85 def digest_value=(digest_value) reference.at_xpath("descendant::ds:DigestValue", NAMESPACES).content = Base64.strict_encode64(digest_value).chomp end
document()
click to toggle source
# File lib/xmldsig/reference.rb, line 15 def document reference.document end
reference_uri()
click to toggle source
# File lib/xmldsig/reference.rb, line 53 def reference_uri reference.get_attribute("URI") end
referenced_node()
click to toggle source
# File lib/xmldsig/reference.rb, line 23 def referenced_node if reference_uri && reference_uri != "" if @id_attr.nil? && reference_uri.start_with?("cid:") content_id = reference_uri[4..-1] if @referenced_documents.has_key?(content_id) @referenced_documents[content_id].dup else raise( ReferencedNodeNotFound, "Could not find referenced document with ContentId #{content_id}" ) end else id = reference_uri[1..-1] referenced_node_xpath = @id_attr ? "//*[@#{@id_attr}=$uri]" : "//*[@ID=$uri or @wsu:Id=$uri]" variable_bindings = { 'uri' => id } if ref = document.dup.at_xpath(referenced_node_xpath, NAMESPACES, variable_bindings) ref else raise( ReferencedNodeNotFound, "Could not find the referenced node #{id}'" ) end end else document.dup.root end end
sign()
click to toggle source
# File lib/xmldsig/reference.rb, line 19 def sign self.digest_value = calculate_digest_value end
transforms()
click to toggle source
# File lib/xmldsig/reference.rb, line 90 def transforms Transforms.new(reference.xpath("descendant::ds:Transform", NAMESPACES)) end
validate_digest_value()
click to toggle source
# File lib/xmldsig/reference.rb, line 94 def validate_digest_value unless digest_value == calculate_digest_value @errors << :digest_value end end