require 'test_helper'
require 'xml_security'
class XmlSecurityTest < Test::Unit::TestCase
include XMLSecurity
context "XmlSecurity" do
setup do
@document = XMLSecurity::SignedDocument.new(Base64.decode64(response_document))
@base64cert = @document.elements["//ds:X509Certificate"].text
end
should "should run validate without throwing NS related exceptions" do
assert !@document.validate_doc(@base64cert, true)
end
should "should run validate with throwing NS related exceptions" do
assert_raise(Onelogin::Saml::ValidationError) do
@document.validate_doc(@base64cert, false)
end
end
should "not raise an error when softly validating the document multiple times" do
assert_nothing_raised do
2.times { @document.validate_doc(@base64cert, true) }
end
end
should "should raise Fingerprint mismatch" do
exception = assert_raise(Onelogin::Saml::ValidationError) do
@document.validate("no:fi:ng:er:pr:in:t", false)
end
assert_equal("Fingerprint mismatch", exception.message)
end
should "should raise Digest mismatch" do
exception = assert_raise(Onelogin::Saml::ValidationError) do
@document.validate_doc(@base64cert, false)
end
assert_equal("Digest mismatch", exception.message)
end
should "should raise Key validation error" do
response = Base64.decode64(response_document)
response.sub!("pJQ7MS/ek4KRRWGmv/H43ReHYMs=",
"b9xsAXLsynugg3Wc1CI3kpWku+0=")
document = XMLSecurity::SignedDocument.new(response)
base64cert = document.elements["//ds:X509Certificate"].text
exception = assert_raise(Onelogin::Saml::ValidationError) do
document.validate_doc(base64cert, false)
end
assert_equal("Key validation error", exception.message)
end
end
context "Algorithms" do
should "validate using SHA1" do
@document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
end
should "validate using SHA256" do
@document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
assert @document.validate("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA")
end
should "validate using SHA384" do
@document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, false))
assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
end
should "validate using SHA512" do
@document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
assert @document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
end
end
context "XmlSecurity::SignedDocument" do
context "#extract_inclusive_namespaces" do
should "support explicit namespace resolution for exclusive canonicalization" do
response = fixture(:open_saml_response, false)
document = XMLSecurity::SignedDocument.new(response)
inclusive_namespaces = document.send(:extract_inclusive_namespaces)
assert_equal %w[ xs ], inclusive_namespaces
end
should "support implicit namespace resolution for exclusive canonicalization" do
response = fixture(:no_signature_ns, false)
document = XMLSecurity::SignedDocument.new(response)
inclusive_namespaces = document.send(:extract_inclusive_namespaces)
assert_equal %w[ #default saml ds xs xsi ], inclusive_namespaces
end
should_eventually 'support inclusive canonicalization' do
response = Onelogin::Saml::Response.new(fixture("tdnf_response.xml"))
response.stubs(:conditions).returns(nil)
assert !response.is_valid?
settings = Onelogin::Saml::Settings.new
assert !response.is_valid?
response.settings = settings
assert !response.is_valid?
settings.idp_cert_fingerprint = "e6 38 9a 20 b7 4f 13 db 6a bc b1 42 6a e7 52 1d d6 56 d4 1b".upcase.gsub(" ", ":")
assert response.validate!
end
should "return an empty list when inclusive namespace element is missing" do
response = fixture(:no_signature_ns, false)
response.slice! %r{}
document = XMLSecurity::SignedDocument.new(response)
inclusive_namespaces = document.send(:extract_inclusive_namespaces)
assert inclusive_namespaces.empty?
end
end
context "StarfieldTMS" do
should "be able to validate a response" do
response = Onelogin::Saml::Response.new(fixture(:starfield_response))
response.settings = Onelogin::Saml::Settings.new(
:idp_cert_fingerprint => "8D:BA:53:8E:A3:B6:F9:F1:69:6C:BB:D9:D8:BD:41:B3:AC:4F:9D:4D"
)
assert response.validate!
end
end
end
end