xmldsig 0.6.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +10 -0
- data/README.md +6 -0
- data/lib/xmldsig/reference.rb +24 -11
- data/lib/xmldsig/signature.rb +17 -3
- data/lib/xmldsig/signed_document.rb +3 -2
- data/lib/xmldsig/transforms/xpath.rb +22 -0
- data/lib/xmldsig/transforms.rb +2 -0
- data/lib/xmldsig/version.rb +1 -1
- data/lib/xmldsig.rb +1 -0
- data/spec/fixtures/signed_signature_namespace.xml +23 -0
- data/spec/fixtures/signed_with_cid_reference.xml +15 -0
- data/spec/fixtures/unsigned/with_xpath_algorithm.xml +35 -0
- data/spec/fixtures/unsigned_signature_namespace.xml +23 -0
- data/spec/fixtures/unsigned_with_cid_reference.xml +15 -0
- data/spec/lib/xmldsig/reference_spec.rb +24 -0
- data/spec/lib/xmldsig/signature_spec.rb +1 -0
- data/spec/lib/xmldsig/signed_document_spec.rb +9 -0
- data/spec/lib/xmldsig/transforms/xpath_spec.rb +18 -0
- data/spec/lib/xmldsig_spec.rb +27 -0
- metadata +19 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 92d413835667c8486d402baf1eb4c6670a187c99d92184f1ef9c5b890d5da0dc
         | 
| 4 | 
            +
              data.tar.gz: d495328b5b32f196390d13281001b2c2f11f409b2cc9932c1acb2666b55ba713
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: abca8c44733682d84924d867a87d1e21644a0c031447c2fb4eec2321327bcfe324427662115f58d8336e9679f5dd4a1b8e06cd84afdb4e988f441177c30fd75e
         | 
| 7 | 
            +
              data.tar.gz: ce2e1bea0c913770f9abd614655361c5bd482aa5ffaeb71d38ede414a8902c9bdc2cacb66a2a3e2316475c55afd6ddb2e64d81e412f7f9bcf4c0749f03b8b664
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,4 +1,14 @@ | |
| 1 1 | 
             
            # Changelog
         | 
| 2 | 
            +
            v0.7.0
         | 
| 3 | 
            +
            - Changed ReferencedNodeNotFound parent class to Xmldsig::Error for easier error handling
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            v0.6.6
         | 
| 6 | 
            +
            - Add support for cid references to external documents. (iterateNZ)
         | 
| 7 | 
            +
            - Add support for http://www.w3.org/TR/1999/REC-xpath-19991116 transforms (iterateNZ)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            v0.6.5
         | 
| 10 | 
            +
            - Added inclusive namespace prefix list for canonicalization method (jmhooper)
         | 
| 11 | 
            +
             | 
| 2 12 | 
             
            v0.6.4
         | 
| 3 13 | 
             
            - Allow a custom XSD file for schema verifiation
         | 
| 4 14 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -24,6 +24,9 @@ unsigned_xml = <<-XML | |
| 24 24 | 
             
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 25 25 | 
             
            <foo:Foo ID="foo" xmlns:foo="http://example.com/foo#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 26 26 | 
             
              <foo:Bar>bar</foo:Bar>
         | 
| 27 | 
            +
              <foo:Baz>
         | 
| 28 | 
            +
                <foo:Qux>quuz</foo:Qux>
         | 
| 29 | 
            +
              </foo:Baz>
         | 
| 27 30 | 
             
              <ds:Signature>
         | 
| 28 31 | 
             
                <ds:SignedInfo>
         | 
| 29 32 | 
             
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         | 
| @@ -31,6 +34,9 @@ unsigned_xml = <<-XML | |
| 31 34 | 
             
                  <ds:Reference URI="#foo">
         | 
| 32 35 | 
             
                    <ds:Transforms>
         | 
| 33 36 | 
             
                      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
         | 
| 37 | 
            +
                      <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
         | 
| 38 | 
            +
                        <ds:XPath>not(ancestor-or-self::foo:Baz)</ds:XPath>
         | 
| 39 | 
            +
                      </ds:Transform>
         | 
| 34 40 | 
             
                      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 35 41 | 
             
                        <ec:InclusiveNamespaces PrefixList="foo"/>
         | 
| 36 42 | 
             
                      </ds:Transform>
         | 
    
        data/lib/xmldsig/reference.rb
    CHANGED
    
    | @@ -2,13 +2,14 @@ module Xmldsig | |
| 2 2 | 
             
              class Reference
         | 
| 3 3 | 
             
                attr_accessor :reference, :errors, :id_attr
         | 
| 4 4 |  | 
| 5 | 
            -
                class ReferencedNodeNotFound <  | 
| 5 | 
            +
                class ReferencedNodeNotFound < Xmldsig::Error
         | 
| 6 6 | 
             
                end
         | 
| 7 7 |  | 
| 8 | 
            -
                def initialize(reference, id_attr = nil)
         | 
| 8 | 
            +
                def initialize(reference, id_attr = nil, referenced_documents = {})
         | 
| 9 9 | 
             
                  @reference = reference
         | 
| 10 10 | 
             
                  @errors    = []
         | 
| 11 11 | 
             
                  @id_attr = id_attr
         | 
| 12 | 
            +
                  @referenced_documents = referenced_documents
         | 
| 12 13 | 
             
                end
         | 
| 13 14 |  | 
| 14 15 | 
             
                def document
         | 
| @@ -21,16 +22,28 @@ module Xmldsig | |
| 21 22 |  | 
| 22 23 | 
             
                def referenced_node
         | 
| 23 24 | 
             
                  if reference_uri && reference_uri != ""
         | 
| 24 | 
            -
                     | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                       | 
| 25 | 
            +
                    if @id_attr.nil? && reference_uri.start_with?("cid:")
         | 
| 26 | 
            +
                      content_id = reference_uri[4..-1]
         | 
| 27 | 
            +
                      if @referenced_documents.has_key?(content_id)
         | 
| 28 | 
            +
                        @referenced_documents[content_id].dup
         | 
| 29 | 
            +
                      else
         | 
| 30 | 
            +
                        raise(
         | 
| 31 | 
            +
                            ReferencedNodeNotFound,
         | 
| 32 | 
            +
                            "Could not find referenced document with ContentId #{content_id}"
         | 
| 33 | 
            +
                        )
         | 
| 34 | 
            +
                      end
         | 
| 29 35 | 
             
                    else
         | 
| 30 | 
            -
                       | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
                      )
         | 
| 36 | 
            +
                      id = reference_uri[1..-1]
         | 
| 37 | 
            +
                      referenced_node_xpath = @id_attr ? "//*[@#{@id_attr}=$uri]" : "//*[@ID=$uri or @wsu:Id=$uri]"
         | 
| 38 | 
            +
                      variable_bindings = { 'uri' => id }
         | 
| 39 | 
            +
                      if ref = document.dup.at_xpath(referenced_node_xpath, NAMESPACES, variable_bindings)
         | 
| 40 | 
            +
                        ref
         | 
| 41 | 
            +
                      else
         | 
| 42 | 
            +
                        raise(
         | 
| 43 | 
            +
                            ReferencedNodeNotFound,
         | 
| 44 | 
            +
                            "Could not find the referenced node #{id}'"
         | 
| 45 | 
            +
                        )
         | 
| 46 | 
            +
                      end
         | 
| 34 47 | 
             
                    end
         | 
| 35 48 | 
             
                  else
         | 
| 36 49 | 
             
                    document.dup.root
         | 
    
        data/lib/xmldsig/signature.rb
    CHANGED
    
    | @@ -2,14 +2,15 @@ module Xmldsig | |
| 2 2 | 
             
              class Signature
         | 
| 3 3 | 
             
                attr_accessor :signature
         | 
| 4 4 |  | 
| 5 | 
            -
                def initialize(signature, id_attr = nil)
         | 
| 5 | 
            +
                def initialize(signature, id_attr = nil, referenced_documents = {})
         | 
| 6 6 | 
             
                  @signature = signature
         | 
| 7 7 | 
             
                  @id_attr = id_attr
         | 
| 8 | 
            +
                  @referenced_documents = referenced_documents
         | 
| 8 9 | 
             
                end
         | 
| 9 10 |  | 
| 10 11 | 
             
                def references
         | 
| 11 12 | 
             
                  @references ||= signature.xpath("descendant::ds:Reference", NAMESPACES).map do |node|
         | 
| 12 | 
            -
                    Reference.new(node, @id_attr)
         | 
| 13 | 
            +
                    Reference.new(node, @id_attr, @referenced_documents)
         | 
| 13 14 | 
             
                  end
         | 
| 14 15 | 
             
                end
         | 
| 15 16 |  | 
| @@ -54,7 +55,20 @@ module Xmldsig | |
| 54 55 | 
             
                end
         | 
| 55 56 |  | 
| 56 57 | 
             
                def canonicalized_signed_info
         | 
| 57 | 
            -
                  Canonicalizer.new( | 
| 58 | 
            +
                  Canonicalizer.new(
         | 
| 59 | 
            +
                    signed_info,
         | 
| 60 | 
            +
                    canonicalization_method,
         | 
| 61 | 
            +
                    inclusive_namespaces_for_canonicalization
         | 
| 62 | 
            +
                  ).canonicalize
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def inclusive_namespaces_for_canonicalization
         | 
| 66 | 
            +
                  namespaces_node = signed_info.at_xpath(
         | 
| 67 | 
            +
                    'descendant::ds:CanonicalizationMethod/ec:InclusiveNamespaces',
         | 
| 68 | 
            +
                    NAMESPACES
         | 
| 69 | 
            +
                  )
         | 
| 70 | 
            +
                  return unless namespaces_node && namespaces_node.get_attribute('PrefixList')
         | 
| 71 | 
            +
                  namespaces_node.get_attribute('PrefixList').split(/\W+/)
         | 
| 58 72 | 
             
                end
         | 
| 59 73 |  | 
| 60 74 | 
             
                def calculate_signature_value(private_key, &block)
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module Xmldsig
         | 
| 2 2 | 
             
              class SignedDocument
         | 
| 3 | 
            -
                attr_accessor :document, :id_attr, :force
         | 
| 3 | 
            +
                attr_accessor :document, :id_attr, :force, :referenced_documents
         | 
| 4 4 |  | 
| 5 5 | 
             
                def initialize(document, options = {})
         | 
| 6 6 | 
             
                  @document = if document.kind_of?(Nokogiri::XML::Document)
         | 
| @@ -10,6 +10,7 @@ module Xmldsig | |
| 10 10 | 
             
                  end
         | 
| 11 11 | 
             
                  @id_attr  = options[:id_attr] if options[:id_attr]
         | 
| 12 12 | 
             
                  @force    = options[:force]
         | 
| 13 | 
            +
                  @referenced_documents = options.fetch(:referenced_documents, {})
         | 
| 13 14 | 
             
                end
         | 
| 14 15 |  | 
| 15 16 | 
             
                def validate(certificate = nil, schema = nil, &block)
         | 
| @@ -35,7 +36,7 @@ module Xmldsig | |
| 35 36 | 
             
                def signatures
         | 
| 36 37 | 
             
                  document.xpath("//ds:Signature", NAMESPACES).
         | 
| 37 38 | 
             
                      sort { |left, right| left.ancestors.size <=> right.ancestors.size }.
         | 
| 38 | 
            -
                      collect { |node| Signature.new(node, @id_attr) } || []
         | 
| 39 | 
            +
                      collect { |node| Signature.new(node, @id_attr, referenced_documents) } || []
         | 
| 39 40 | 
             
                end
         | 
| 40 41 | 
             
              end
         | 
| 41 42 | 
             
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module Xmldsig
         | 
| 2 | 
            +
              class Transforms < Array
         | 
| 3 | 
            +
                class XPath < Transform
         | 
| 4 | 
            +
                  attr_reader :xpath_query
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  REC_XPATH_1991116_QUERY = "(//. | //@* | //namespace::*)"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def initialize(node, transform_node)
         | 
| 9 | 
            +
                    @xpath_query = transform_node.at_xpath("ds:XPath", NAMESPACES).text
         | 
| 10 | 
            +
                    super(node, transform_node)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def transform
         | 
| 14 | 
            +
                    node.xpath(REC_XPATH_1991116_QUERY)
         | 
| 15 | 
            +
                      .reject { |n| !n.respond_to?(:xpath) }
         | 
| 16 | 
            +
                      .reject { |n| n.xpath(@xpath_query, node.namespaces) }
         | 
| 17 | 
            +
                      .each(&:remove)
         | 
| 18 | 
            +
                    node
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
    
        data/lib/xmldsig/transforms.rb
    CHANGED
    
    | @@ -21,6 +21,8 @@ module Xmldsig | |
| 21 21 | 
             
                      Transforms::Canonicalize.new(node, transform_node)
         | 
| 22 22 | 
             
                    when "http://www.w3.org/2001/10/xml-exc-c14n#WithComments"
         | 
| 23 23 | 
             
                      Transforms::Canonicalize.new(node, transform_node, true)
         | 
| 24 | 
            +
                    when "http://www.w3.org/TR/1999/REC-xpath-19991116"
         | 
| 25 | 
            +
                      Transforms::XPath.new(node, transform_node)
         | 
| 24 26 | 
             
                  end
         | 
| 25 27 | 
             
                end
         | 
| 26 28 |  | 
    
        data/lib/xmldsig/version.rb
    CHANGED
    
    
    
        data/lib/xmldsig.rb
    CHANGED
    
    | @@ -25,6 +25,7 @@ require "xmldsig/signed_document" | |
| 25 25 | 
             
            require "xmldsig/transforms/transform"
         | 
| 26 26 | 
             
            require "xmldsig/transforms/canonicalize"
         | 
| 27 27 | 
             
            require "xmldsig/transforms/enveloped_signature"
         | 
| 28 | 
            +
            require "xmldsig/transforms/xpath"
         | 
| 28 29 | 
             
            require "xmldsig/transforms"
         | 
| 29 30 | 
             
            require "xmldsig/reference"
         | 
| 30 31 | 
             
            require "xmldsig/signature"
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <foo:Foo xmlns:foo="http://example.com/foo#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" ID="foo">
         | 
| 3 | 
            +
              <foo:Bar>bar</foo:Bar>
         | 
| 4 | 
            +
              <ds:Signature>
         | 
| 5 | 
            +
                <ds:SignedInfo>
         | 
| 6 | 
            +
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 7 | 
            +
                    <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="foo"/>
         | 
| 8 | 
            +
                  </ds:CanonicalizationMethod>
         | 
| 9 | 
            +
                  <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
         | 
| 10 | 
            +
                  <ds:Reference URI="#foo">
         | 
| 11 | 
            +
                    <ds:Transforms>
         | 
| 12 | 
            +
                      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
         | 
| 13 | 
            +
                      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 14 | 
            +
                        <ec:InclusiveNamespaces PrefixList="foo"/>
         | 
| 15 | 
            +
                      </ds:Transform>
         | 
| 16 | 
            +
                    </ds:Transforms>
         | 
| 17 | 
            +
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         | 
| 18 | 
            +
                    <ds:DigestValue>ftoSYFdze1AWgGHF5N9i9SFKThXkqH2AdyzA3/epbJw=</ds:DigestValue>
         | 
| 19 | 
            +
                  </ds:Reference>
         | 
| 20 | 
            +
                </ds:SignedInfo>
         | 
| 21 | 
            +
                <ds:SignatureValue>s3yYvk1UCZkIpljdy6GZTdbOi/FvhuvCnBSYmdPb3yQmtEpww5Q2tCKgqu/9ixxf1tmyUulRrIZk0mVarQUsykrJhOKBHo8ht487c/XT+fmv+zF4JeO4fV6VsAx1cFd/qMXdDyE6nOxgW+qppeRwkdfX2N5I8COzn0fHOLp9QTo=</ds:SignatureValue>
         | 
| 22 | 
            +
              </ds:Signature>
         | 
| 23 | 
            +
            </foo:Foo>
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <foo:Foo xmlns:foo="http://example.com/foo#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" ID="foo">
         | 
| 3 | 
            +
              <foo:Bar>bar</foo:Bar>
         | 
| 4 | 
            +
              <ds:Signature>
         | 
| 5 | 
            +
                <ds:SignedInfo>
         | 
| 6 | 
            +
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         | 
| 7 | 
            +
                  <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
         | 
| 8 | 
            +
                  <ds:Reference URI="cid:fooDocument">
         | 
| 9 | 
            +
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         | 
| 10 | 
            +
                    <ds:DigestValue>tdQEXD9Gb6kf4sxqvnkjKhpXzfEE96JucW4KHieJ33g=</ds:DigestValue>
         | 
| 11 | 
            +
                  </ds:Reference>
         | 
| 12 | 
            +
                </ds:SignedInfo>
         | 
| 13 | 
            +
                <ds:SignatureValue>JI5XLfznf8BsNA5vtm0kPG5kni983qrJV1EFx4oZnb6tPvARvPbtR1oEaxnB5ROQJ6xzBuuxDsUFT1BNNUR8vL1S2qPk80USXwNhl0Cfa4mDULNw1rRhN6q82VEvAC/Hb32mvgKDLlJZymdafZhUUeEmaQj+YHsTU54kPCY5w+E=</ds:SignatureValue>
         | 
| 14 | 
            +
              </ds:Signature>
         | 
| 15 | 
            +
            </foo:Foo>
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
         | 
| 3 | 
            +
              <soapenv:Body>
         | 
| 4 | 
            +
                <samlp:ArtifactResponse xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" ID="_91e79cb2e8cded9a7fd4d68dc480b49d2d1adf88" Version="2.0" IssueInstant="2013-01-17T09:02:44Z">
         | 
| 5 | 
            +
                  <ds:Signature>
         | 
| 6 | 
            +
                    <ds:SignedInfo>
         | 
| 7 | 
            +
                      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         | 
| 8 | 
            +
                      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
         | 
| 9 | 
            +
                      <ds:Reference>
         | 
| 10 | 
            +
                        <ds:Transforms>
         | 
| 11 | 
            +
                          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
         | 
| 12 | 
            +
                          <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
         | 
| 13 | 
            +
                            <ds:XPath>not(ancestor-or-self::samlp:Status)</ds:XPath>
         | 
| 14 | 
            +
                          </ds:Transform>
         | 
| 15 | 
            +
                          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 16 | 
            +
                            <ec:InclusiveNamespaces PrefixList="ds saml samlp xs"/>
         | 
| 17 | 
            +
                          </ds:Transform>
         | 
| 18 | 
            +
                        </ds:Transforms>
         | 
| 19 | 
            +
                        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         | 
| 20 | 
            +
                        <ds:DigestValue></ds:DigestValue>
         | 
| 21 | 
            +
                      </ds:Reference>
         | 
| 22 | 
            +
                    </ds:SignedInfo>
         | 
| 23 | 
            +
                    <ds:SignatureValue></ds:SignatureValue>
         | 
| 24 | 
            +
                  </ds:Signature>
         | 
| 25 | 
            +
                  <samlp:Status>
         | 
| 26 | 
            +
                    <samlp:StatusCode/>
         | 
| 27 | 
            +
                  </samlp:Status>
         | 
| 28 | 
            +
                  <samlp:Response ID="_5a88b4aeb1d290c86073874278e5ef302da66739" Version="2.0" IssueInstant="2013-01-17T09:02:44Z">
         | 
| 29 | 
            +
                    <samlp:Status>
         | 
| 30 | 
            +
                      <samlp:StatusCode/>
         | 
| 31 | 
            +
                    </samlp:Status>
         | 
| 32 | 
            +
                  </samlp:Response>
         | 
| 33 | 
            +
                </samlp:ArtifactResponse>
         | 
| 34 | 
            +
              </soapenv:Body>
         | 
| 35 | 
            +
            </soapenv:Envelope>
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <foo:Foo ID="foo" xmlns:foo="http://example.com/foo#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 3 | 
            +
              <foo:Bar>bar</foo:Bar>
         | 
| 4 | 
            +
              <ds:Signature>
         | 
| 5 | 
            +
                <ds:SignedInfo>
         | 
| 6 | 
            +
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 7 | 
            +
                    <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="foo"/>
         | 
| 8 | 
            +
                  </ds:CanonicalizationMethod>
         | 
| 9 | 
            +
                  <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
         | 
| 10 | 
            +
                  <ds:Reference URI="#foo">
         | 
| 11 | 
            +
                    <ds:Transforms>
         | 
| 12 | 
            +
                      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
         | 
| 13 | 
            +
                      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
         | 
| 14 | 
            +
                        <ec:InclusiveNamespaces PrefixList="foo"/>
         | 
| 15 | 
            +
                      </ds:Transform>
         | 
| 16 | 
            +
                    </ds:Transforms>
         | 
| 17 | 
            +
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         | 
| 18 | 
            +
                    <ds:DigestValue></ds:DigestValue>
         | 
| 19 | 
            +
                  </ds:Reference>
         | 
| 20 | 
            +
                </ds:SignedInfo>
         | 
| 21 | 
            +
                <ds:SignatureValue></ds:SignatureValue>
         | 
| 22 | 
            +
              </ds:Signature>
         | 
| 23 | 
            +
            </foo:Foo>
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            <?xml version="1.0" encoding="UTF-8"?>
         | 
| 2 | 
            +
            <foo:Foo xmlns:foo="http://example.com/foo#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" ID="foo">
         | 
| 3 | 
            +
              <foo:Bar>bar</foo:Bar>
         | 
| 4 | 
            +
              <ds:Signature>
         | 
| 5 | 
            +
                <ds:SignedInfo>
         | 
| 6 | 
            +
                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
         | 
| 7 | 
            +
                  <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
         | 
| 8 | 
            +
                  <ds:Reference URI="cid:fooDocument">
         | 
| 9 | 
            +
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
         | 
| 10 | 
            +
                    <ds:DigestValue></ds:DigestValue>
         | 
| 11 | 
            +
                  </ds:Reference>
         | 
| 12 | 
            +
                </ds:SignedInfo>
         | 
| 13 | 
            +
                <ds:SignatureValue></ds:SignatureValue>
         | 
| 14 | 
            +
              </ds:Signature>
         | 
| 15 | 
            +
            </foo:Foo>
         | 
| @@ -78,6 +78,30 @@ describe Xmldsig::Reference do | |
| 78 78 | 
             
                  expect { malicious_reference.referenced_node }.
         | 
| 79 79 | 
             
                    to raise_error(Xmldsig::Reference::ReferencedNodeNotFound)
         | 
| 80 80 | 
             
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                context "when the referenced node is prefixed with 'cid:'" do
         | 
| 83 | 
            +
                  let(:document) { Nokogiri::XML::Document.parse File.read("spec/fixtures/unsigned_with_cid_reference.xml") }
         | 
| 84 | 
            +
                  let(:foo_document) { "<test><ing>present</ing></test>" }
         | 
| 85 | 
            +
                  let(:referenced_documents) { { "fooDocument" => foo_document } }
         | 
| 86 | 
            +
                  let(:reference) { Xmldsig::Reference.new(document.at_xpath('//ds:Reference', Xmldsig::NAMESPACES), nil, referenced_documents) }
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  it "has the correct reference_uri" do
         | 
| 89 | 
            +
                    expect(reference.reference_uri).to eq "cid:fooDocument"
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                  it "returns the document referenced by the content id" do
         | 
| 93 | 
            +
                    expect(reference.referenced_node).to eq foo_document
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  context "when the document has no referenced_documents matching the referenced name" do
         | 
| 97 | 
            +
                    let(:referenced_documents) { Hash.new }
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    it "raises ReferencedNodeNotFound" do
         | 
| 100 | 
            +
                      expect { reference.referenced_node }.
         | 
| 101 | 
            +
                        to raise_error(Xmldsig::Reference::ReferencedNodeNotFound)
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
                end
         | 
| 81 105 | 
             
              end
         | 
| 82 106 |  | 
| 83 107 | 
             
              describe "#reference_uri" do
         | 
| @@ -106,6 +106,7 @@ describe Xmldsig::Signature do | |
| 106 106 |  | 
| 107 107 | 
             
                  it "returns false with the default validation scheme and true with the X509 serial fix scheme" do
         | 
| 108 108 | 
             
                    aggregate_failures do
         | 
| 109 | 
            +
                      break expect(signature.valid?(certificate)).to eq(true) if RUBY_ENGINE == 'jruby'
         | 
| 109 110 | 
             
                      expect { signature.valid?(certificate) }.to raise_error Xmldsig::SchemaError, /is not a valid value of the atomic type 'xs:integer'/
         | 
| 110 111 | 
             
                      expect(signature.valid?(certificate, Xmldsig::XSD_X509_SERIAL_FIX_FILE)).to eq(true)
         | 
| 111 112 | 
             
                      expect(signature.errors).to eql []
         | 
| @@ -125,6 +125,15 @@ describe Xmldsig::SignedDocument do | |
| 125 125 | 
             
                    expect(signed_document.signatures.last.signature_value).to_not be(unsigned_document.signatures.last.signature_value)
         | 
| 126 126 | 
             
                  end
         | 
| 127 127 | 
             
                end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                context 'with inclusive namespaces for the signature' do
         | 
| 130 | 
            +
                  let(:unsigned_xml) { File.read("spec/fixtures/unsigned_signature_namespace.xml") }
         | 
| 131 | 
            +
                  let(:signed_xml) { File.read("spec/fixtures/signed_signature_namespace.xml") }
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  it 'canonicalizes and signs correctly' do
         | 
| 134 | 
            +
                    expect(unsigned_document.sign(private_key)).to eq(signed_xml)
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
                end
         | 
| 128 137 | 
             
              end
         | 
| 129 138 |  | 
| 130 139 | 
             
              describe "Nested Signatures" do
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Xmldsig::Transforms::XPath do
         | 
| 4 | 
            +
              let(:expected_xpath_query) { "not(ancestor-or-self::samlp:Status)" }
         | 
| 5 | 
            +
              let(:unsigned_xml) { File.read('spec/fixtures/unsigned/with_xpath_algorithm.xml') }
         | 
| 6 | 
            +
              let(:unsigned_document) { Xmldsig::SignedDocument.new(unsigned_xml) }
         | 
| 7 | 
            +
              let(:transform_node) { unsigned_document.signatures.first.references.first.transforms[1] }
         | 
| 8 | 
            +
              subject(:xpath_transform) { described_class.new(unsigned_document.document, transform_node) }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              it 'reads the xpath' do
         | 
| 11 | 
            +
                expect(xpath_transform.xpath_query).to eq expected_xpath_query
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              it 'filters out the nodes matching the xpath expression' do
         | 
| 15 | 
            +
                transformed_node = xpath_transform.transform
         | 
| 16 | 
            +
                expect(transform_node.children).to all(satisfy { |n| n.xpath(expected_xpath_query, unsigned_document.document.namespaces) })
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
    
        data/spec/lib/xmldsig_spec.rb
    CHANGED
    
    | @@ -81,4 +81,31 @@ describe Xmldsig do | |
| 81 81 | 
             
                  end
         | 
| 82 82 | 
             
                end
         | 
| 83 83 | 
             
              end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              describe "Allows passing referenced documents" do
         | 
| 86 | 
            +
                let(:referenced_documents) { { 'fooDocument' => 'ABC' } }
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                describe "an unsigned document" do
         | 
| 89 | 
            +
                  let(:unsigned_xml) { File.read("spec/fixtures/unsigned_with_cid_reference.xml") }
         | 
| 90 | 
            +
                  let(:unsigned_document) { Xmldsig::SignedDocument.new(unsigned_xml, referenced_documents: referenced_documents) }
         | 
| 91 | 
            +
                  let(:signed_document) { unsigned_document.sign(private_key) }
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  it "should be signable an validateable" do
         | 
| 94 | 
            +
                    expect(Xmldsig::SignedDocument.new(signed_document, referenced_documents: referenced_documents).validate(certificate)).to eq(true)
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  it 'should have at least 1 signature element' do
         | 
| 98 | 
            +
                    expect(Xmldsig::SignedDocument.new(signed_document).signatures.count).to be >= 1
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                context "a signed document" do
         | 
| 103 | 
            +
                  let(:signed_xml) { File.read("spec/fixtures/signed_with_cid_reference.xml") }
         | 
| 104 | 
            +
                  let(:signed_document) { Xmldsig::SignedDocument.new(signed_xml, referenced_documents: referenced_documents) }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                  it "should be validateable" do
         | 
| 107 | 
            +
                    expect(signed_document.validate(certificate)).to eq(true)
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
              end
         | 
| 84 111 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: xmldsig
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.7.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - benoist
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2022-06-16 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: nokogiri
         | 
| @@ -55,6 +55,7 @@ files: | |
| 55 55 | 
             
            - lib/xmldsig/transforms/canonicalize.rb
         | 
| 56 56 | 
             
            - lib/xmldsig/transforms/enveloped_signature.rb
         | 
| 57 57 | 
             
            - lib/xmldsig/transforms/transform.rb
         | 
| 58 | 
            +
            - lib/xmldsig/transforms/xpath.rb
         | 
| 58 59 | 
             
            - lib/xmldsig/version.rb
         | 
| 59 60 | 
             
            - lib/xmldsig/xmldsig-core-schema-x509-serial-fix.xsd
         | 
| 60 61 | 
             
            - lib/xmldsig/xmldsig-core-schema.xsd
         | 
| @@ -69,6 +70,8 @@ files: | |
| 69 70 | 
             
            - spec/fixtures/signed/shib.cert
         | 
| 70 71 | 
             
            - spec/fixtures/signed/shib.xml
         | 
| 71 72 | 
             
            - spec/fixtures/signed_custom_attribute_id.xml
         | 
| 73 | 
            +
            - spec/fixtures/signed_signature_namespace.xml
         | 
| 74 | 
            +
            - spec/fixtures/signed_with_cid_reference.xml
         | 
| 72 75 | 
             
            - spec/fixtures/signed_xml-exc-c14n#with_comments.xml
         | 
| 73 76 | 
             
            - spec/fixtures/unsigned-invalid.xml
         | 
| 74 77 | 
             
            - spec/fixtures/unsigned-malicious.xml
         | 
| @@ -86,6 +89,7 @@ files: | |
| 86 89 | 
             
            - spec/fixtures/unsigned/unsigned_nested_signature_at_bottom.xml
         | 
| 87 90 | 
             
            - spec/fixtures/unsigned/unsigned_nested_signature_at_top.xml
         | 
| 88 91 | 
             
            - spec/fixtures/unsigned/with_soap_envelope.xml
         | 
| 92 | 
            +
            - spec/fixtures/unsigned/with_xpath_algorithm.xml
         | 
| 89 93 | 
             
            - spec/fixtures/unsigned/without_canonicalization.xml
         | 
| 90 94 | 
             
            - spec/fixtures/unsigned/without_namespace_prefix.xml
         | 
| 91 95 | 
             
            - spec/fixtures/unsigned/without_reference_uri.xml
         | 
| @@ -93,11 +97,14 @@ files: | |
| 93 97 | 
             
            - spec/fixtures/unsigned_multiple_references.xml
         | 
| 94 98 | 
             
            - spec/fixtures/unsigned_nested_signature.xml
         | 
| 95 99 | 
             
            - spec/fixtures/unsigned_nested_signed_signature.xml
         | 
| 100 | 
            +
            - spec/fixtures/unsigned_signature_namespace.xml
         | 
| 101 | 
            +
            - spec/fixtures/unsigned_with_cid_reference.xml
         | 
| 96 102 | 
             
            - spec/lib/xmldsig/reference_spec.rb
         | 
| 97 103 | 
             
            - spec/lib/xmldsig/signature_spec.rb
         | 
| 98 104 | 
             
            - spec/lib/xmldsig/signed_document_spec.rb
         | 
| 99 105 | 
             
            - spec/lib/xmldsig/transforms/enveloped_signature_spec.rb
         | 
| 100 106 | 
             
            - spec/lib/xmldsig/transforms/transform_spec.rb
         | 
| 107 | 
            +
            - spec/lib/xmldsig/transforms/xpath_spec.rb
         | 
| 101 108 | 
             
            - spec/lib/xmldsig_spec.rb
         | 
| 102 109 | 
             
            - spec/spec_helper.rb
         | 
| 103 110 | 
             
            - xmldsig.gemspec
         | 
| @@ -105,7 +112,7 @@ homepage: https://github.com/benoist/xmldsig | |
| 105 112 | 
             
            licenses:
         | 
| 106 113 | 
             
            - MIT
         | 
| 107 114 | 
             
            metadata: {}
         | 
| 108 | 
            -
            post_install_message: | 
| 115 | 
            +
            post_install_message:
         | 
| 109 116 | 
             
            rdoc_options: []
         | 
| 110 117 | 
             
            require_paths:
         | 
| 111 118 | 
             
            - lib
         | 
| @@ -120,9 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 120 127 | 
             
                - !ruby/object:Gem::Version
         | 
| 121 128 | 
             
                  version: '0'
         | 
| 122 129 | 
             
            requirements: []
         | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
            signing_key: 
         | 
| 130 | 
            +
            rubygems_version: 3.3.7
         | 
| 131 | 
            +
            signing_key:
         | 
| 126 132 | 
             
            specification_version: 4
         | 
| 127 133 | 
             
            summary: This gem is a (partial) implementation of the XMLDsig specification (http://www.w3.org/TR/xmldsig-core)
         | 
| 128 134 | 
             
            test_files:
         | 
| @@ -136,6 +142,8 @@ test_files: | |
| 136 142 | 
             
            - spec/fixtures/signed/shib.cert
         | 
| 137 143 | 
             
            - spec/fixtures/signed/shib.xml
         | 
| 138 144 | 
             
            - spec/fixtures/signed_custom_attribute_id.xml
         | 
| 145 | 
            +
            - spec/fixtures/signed_signature_namespace.xml
         | 
| 146 | 
            +
            - spec/fixtures/signed_with_cid_reference.xml
         | 
| 139 147 | 
             
            - spec/fixtures/signed_xml-exc-c14n#with_comments.xml
         | 
| 140 148 | 
             
            - spec/fixtures/unsigned-invalid.xml
         | 
| 141 149 | 
             
            - spec/fixtures/unsigned-malicious.xml
         | 
| @@ -153,6 +161,7 @@ test_files: | |
| 153 161 | 
             
            - spec/fixtures/unsigned/unsigned_nested_signature_at_bottom.xml
         | 
| 154 162 | 
             
            - spec/fixtures/unsigned/unsigned_nested_signature_at_top.xml
         | 
| 155 163 | 
             
            - spec/fixtures/unsigned/with_soap_envelope.xml
         | 
| 164 | 
            +
            - spec/fixtures/unsigned/with_xpath_algorithm.xml
         | 
| 156 165 | 
             
            - spec/fixtures/unsigned/without_canonicalization.xml
         | 
| 157 166 | 
             
            - spec/fixtures/unsigned/without_namespace_prefix.xml
         | 
| 158 167 | 
             
            - spec/fixtures/unsigned/without_reference_uri.xml
         | 
| @@ -160,10 +169,13 @@ test_files: | |
| 160 169 | 
             
            - spec/fixtures/unsigned_multiple_references.xml
         | 
| 161 170 | 
             
            - spec/fixtures/unsigned_nested_signature.xml
         | 
| 162 171 | 
             
            - spec/fixtures/unsigned_nested_signed_signature.xml
         | 
| 172 | 
            +
            - spec/fixtures/unsigned_signature_namespace.xml
         | 
| 173 | 
            +
            - spec/fixtures/unsigned_with_cid_reference.xml
         | 
| 163 174 | 
             
            - spec/lib/xmldsig/reference_spec.rb
         | 
| 164 175 | 
             
            - spec/lib/xmldsig/signature_spec.rb
         | 
| 165 176 | 
             
            - spec/lib/xmldsig/signed_document_spec.rb
         | 
| 166 177 | 
             
            - spec/lib/xmldsig/transforms/enveloped_signature_spec.rb
         | 
| 167 178 | 
             
            - spec/lib/xmldsig/transforms/transform_spec.rb
         | 
| 179 | 
            +
            - spec/lib/xmldsig/transforms/xpath_spec.rb
         | 
| 168 180 | 
             
            - spec/lib/xmldsig_spec.rb
         | 
| 169 181 | 
             
            - spec/spec_helper.rb
         |