kl-ruby-saml 0.0.1

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.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +14 -0
  4. data/.travis.yml +17 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE +19 -0
  7. data/README.md +575 -0
  8. data/Rakefile +41 -0
  9. data/changelog.md +75 -0
  10. data/gemfiles/nokogiri-1.5.gemfile +5 -0
  11. data/lib/onelogin/ruby-saml.rb +17 -0
  12. data/lib/onelogin/ruby-saml/attribute_service.rb +57 -0
  13. data/lib/onelogin/ruby-saml/attributes.rb +128 -0
  14. data/lib/onelogin/ruby-saml/authrequest.rb +156 -0
  15. data/lib/onelogin/ruby-saml/http_error.rb +7 -0
  16. data/lib/onelogin/ruby-saml/idp_metadata_parser.rb +161 -0
  17. data/lib/onelogin/ruby-saml/logging.rb +30 -0
  18. data/lib/onelogin/ruby-saml/logoutrequest.rb +131 -0
  19. data/lib/onelogin/ruby-saml/logoutresponse.rb +241 -0
  20. data/lib/onelogin/ruby-saml/metadata.rb +123 -0
  21. data/lib/onelogin/ruby-saml/response.rb +722 -0
  22. data/lib/onelogin/ruby-saml/saml_message.rb +158 -0
  23. data/lib/onelogin/ruby-saml/settings.rb +165 -0
  24. data/lib/onelogin/ruby-saml/slo_logoutrequest.rb +258 -0
  25. data/lib/onelogin/ruby-saml/slo_logoutresponse.rb +136 -0
  26. data/lib/onelogin/ruby-saml/utils.rb +172 -0
  27. data/lib/onelogin/ruby-saml/validation_error.rb +7 -0
  28. data/lib/onelogin/ruby-saml/version.rb +5 -0
  29. data/lib/ruby-saml.rb +1 -0
  30. data/lib/schemas/saml-schema-assertion-2.0.xsd +283 -0
  31. data/lib/schemas/saml-schema-authn-context-2.0.xsd +23 -0
  32. data/lib/schemas/saml-schema-authn-context-types-2.0.xsd +821 -0
  33. data/lib/schemas/saml-schema-metadata-2.0.xsd +337 -0
  34. data/lib/schemas/saml-schema-protocol-2.0.xsd +302 -0
  35. data/lib/schemas/sstc-metadata-attr.xsd +35 -0
  36. data/lib/schemas/sstc-saml-attribute-ext.xsd +25 -0
  37. data/lib/schemas/sstc-saml-metadata-algsupport-v1.0.xsd +41 -0
  38. data/lib/schemas/sstc-saml-metadata-ui-v1.0.xsd +89 -0
  39. data/lib/schemas/xenc-schema.xsd +136 -0
  40. data/lib/schemas/xml.xsd +287 -0
  41. data/lib/schemas/xmldsig-core-schema.xsd +309 -0
  42. data/lib/xml_security.rb +358 -0
  43. data/ruby-saml.gemspec +57 -0
  44. data/test/certificates/certificate1 +12 -0
  45. data/test/certificates/certificate_without_head_foot +1 -0
  46. data/test/certificates/formatted_certificate +14 -0
  47. data/test/certificates/formatted_private_key +12 -0
  48. data/test/certificates/formatted_rsa_private_key +12 -0
  49. data/test/certificates/invalid_certificate1 +1 -0
  50. data/test/certificates/invalid_certificate2 +1 -0
  51. data/test/certificates/invalid_certificate3 +12 -0
  52. data/test/certificates/invalid_private_key1 +1 -0
  53. data/test/certificates/invalid_private_key2 +1 -0
  54. data/test/certificates/invalid_private_key3 +10 -0
  55. data/test/certificates/invalid_rsa_private_key1 +1 -0
  56. data/test/certificates/invalid_rsa_private_key2 +1 -0
  57. data/test/certificates/invalid_rsa_private_key3 +10 -0
  58. data/test/certificates/ruby-saml.crt +14 -0
  59. data/test/certificates/ruby-saml.key +15 -0
  60. data/test/idp_metadata_parser_test.rb +95 -0
  61. data/test/logging_test.rb +62 -0
  62. data/test/logout_requests/invalid_slo_request.xml +6 -0
  63. data/test/logout_requests/slo_request.xml +4 -0
  64. data/test/logout_requests/slo_request.xml.base64 +1 -0
  65. data/test/logout_requests/slo_request_deflated.xml.base64 +1 -0
  66. data/test/logout_requests/slo_request_with_session_index.xml +5 -0
  67. data/test/logout_responses/logoutresponse_fixtures.rb +67 -0
  68. data/test/logoutrequest_test.rb +211 -0
  69. data/test/logoutresponse_test.rb +258 -0
  70. data/test/metadata_test.rb +203 -0
  71. data/test/request_test.rb +282 -0
  72. data/test/response_test.rb +1094 -0
  73. data/test/responses/adfs_response_sha1.xml +46 -0
  74. data/test/responses/adfs_response_sha256.xml +46 -0
  75. data/test/responses/adfs_response_sha384.xml +46 -0
  76. data/test/responses/adfs_response_sha512.xml +46 -0
  77. data/test/responses/adfs_response_xmlns.xml +45 -0
  78. data/test/responses/attackxee.xml +13 -0
  79. data/test/responses/idp_descriptor.xml +3 -0
  80. data/test/responses/invalids/invalid_audience.xml.base64 +1 -0
  81. data/test/responses/invalids/invalid_issuer_assertion.xml.base64 +1 -0
  82. data/test/responses/invalids/invalid_issuer_message.xml.base64 +1 -0
  83. data/test/responses/invalids/invalid_signature_position.xml.base64 +1 -0
  84. data/test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 +1 -0
  85. data/test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 +1 -0
  86. data/test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 +1 -0
  87. data/test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 +1 -0
  88. data/test/responses/invalids/multiple_assertions.xml.base64 +2 -0
  89. data/test/responses/invalids/multiple_signed.xml.base64 +1 -0
  90. data/test/responses/invalids/no_id.xml.base64 +1 -0
  91. data/test/responses/invalids/no_saml2.xml.base64 +1 -0
  92. data/test/responses/invalids/no_signature.xml.base64 +1 -0
  93. data/test/responses/invalids/no_status.xml.base64 +1 -0
  94. data/test/responses/invalids/no_status_code.xml.base64 +1 -0
  95. data/test/responses/invalids/no_subjectconfirmation_data.xml.base64 +1 -0
  96. data/test/responses/invalids/no_subjectconfirmation_method.xml.base64 +1 -0
  97. data/test/responses/invalids/response_encrypted_attrs.xml.base64 +1 -0
  98. data/test/responses/invalids/response_invalid_signed_element.xml.base64 +1 -0
  99. data/test/responses/invalids/status_code_responder.xml.base64 +1 -0
  100. data/test/responses/invalids/status_code_responer_and_msg.xml.base64 +1 -0
  101. data/test/responses/no_signature_ns.xml +48 -0
  102. data/test/responses/open_saml_response.xml +56 -0
  103. data/test/responses/response_assertion_wrapped.xml.base64 +93 -0
  104. data/test/responses/response_encrypted_nameid.xml.base64 +1 -0
  105. data/test/responses/response_eval.xml +7 -0
  106. data/test/responses/response_no_cert_and_encrypted_attrs.xml +29 -0
  107. data/test/responses/response_unsigned_xml_base64 +1 -0
  108. data/test/responses/response_with_ampersands.xml +139 -0
  109. data/test/responses/response_with_ampersands.xml.base64 +93 -0
  110. data/test/responses/response_with_multiple_attribute_values.xml +67 -0
  111. data/test/responses/response_with_saml2_namespace.xml.base64 +102 -0
  112. data/test/responses/response_with_signed_assertion.xml.base64 +66 -0
  113. data/test/responses/response_with_signed_assertion_2.xml.base64 +1 -0
  114. data/test/responses/response_with_undefined_recipient.xml.base64 +1 -0
  115. data/test/responses/response_without_attributes.xml.base64 +79 -0
  116. data/test/responses/response_wrapped.xml.base64 +150 -0
  117. data/test/responses/signed_message_encrypted_signed_assertion.xml.base64 +1 -0
  118. data/test/responses/signed_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  119. data/test/responses/simple_saml_php.xml +71 -0
  120. data/test/responses/starfield_response.xml.base64 +1 -0
  121. data/test/responses/test_sign.xml +43 -0
  122. data/test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64 +1 -0
  123. data/test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64 +1 -0
  124. data/test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64 +1 -0
  125. data/test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64 +1 -0
  126. data/test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64 +1 -0
  127. data/test/responses/unsigned_message_encrypted_signed_assertion.xml.base64 +1 -0
  128. data/test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  129. data/test/responses/valid_response.xml.base64 +1 -0
  130. data/test/saml_message_test.rb +56 -0
  131. data/test/settings_test.rb +218 -0
  132. data/test/slo_logoutrequest_test.rb +275 -0
  133. data/test/slo_logoutresponse_test.rb +185 -0
  134. data/test/test_helper.rb +252 -0
  135. data/test/utils_test.rb +145 -0
  136. data/test/xml_security_test.rb +329 -0
  137. metadata +415 -0
@@ -0,0 +1,329 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
+ require 'xml_security'
3
+ require 'timecop'
4
+
5
+ class XmlSecurityTest < Minitest::Test
6
+ include XMLSecurity
7
+
8
+ describe "XmlSecurity" do
9
+
10
+ let(:decoded_response) { Base64.decode64(response_document_without_recipient) }
11
+ let(:document) { XMLSecurity::SignedDocument.new(decoded_response) }
12
+ let(:settings) { OneLogin::RubySaml::Settings.new() }
13
+
14
+ before do
15
+ @base64cert = document.elements["//ds:X509Certificate"].text
16
+ end
17
+
18
+ it "should run validate without throwing NS related exceptions" do
19
+ assert !document.validate_signature(@base64cert, true)
20
+ end
21
+
22
+ it "should run validate with throwing NS related exceptions" do
23
+ assert_raises(OneLogin::RubySaml::ValidationError) do
24
+ document.validate_signature(@base64cert, false)
25
+ end
26
+ end
27
+
28
+ it "not raise an error when softly validating the document multiple times" do
29
+ 2.times { assert_equal document.validate_signature(@base64cert, true), false }
30
+ end
31
+
32
+ it "not raise an error when softly validating the document and the X509Certificate is missing" do
33
+ decoded_response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
34
+ mod_document = XMLSecurity::SignedDocument.new(decoded_response)
35
+ assert !mod_document.validate_document("a fingerprint", true) # The fingerprint isn't relevant to this test
36
+ end
37
+
38
+ it "should raise Fingerprint mismatch" do
39
+ exception = assert_raises(OneLogin::RubySaml::ValidationError) do
40
+ document.validate_document("no:fi:ng:er:pr:in:t", false)
41
+ end
42
+ assert_equal("Fingerprint mismatch", exception.message)
43
+ assert_includes document.errors, "Fingerprint mismatch"
44
+ end
45
+
46
+ it "should raise Digest mismatch" do
47
+ exception = assert_raises(OneLogin::RubySaml::ValidationError) do
48
+ document.validate_signature(@base64cert, false)
49
+ end
50
+ assert_equal("Digest mismatch", exception.message)
51
+ assert_includes document.errors, "Digest mismatch"
52
+ end
53
+
54
+ it "should raise Key validation error" do
55
+ decoded_response.sub!("<ds:DigestValue>pJQ7MS/ek4KRRWGmv/H43ReHYMs=</ds:DigestValue>",
56
+ "<ds:DigestValue>b9xsAXLsynugg3Wc1CI3kpWku+0=</ds:DigestValue>")
57
+ mod_document = XMLSecurity::SignedDocument.new(decoded_response)
58
+ base64cert = mod_document.elements["//ds:X509Certificate"].text
59
+ exception = assert_raises(OneLogin::RubySaml::ValidationError) do
60
+ mod_document.validate_signature(base64cert, false)
61
+ end
62
+ assert_equal("Key validation error", exception.message)
63
+ assert_includes mod_document.errors, "Key validation error"
64
+ end
65
+
66
+ it "correctly obtain the digest method with alternate namespace declaration" do
67
+ adfs_document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_xmlns, false))
68
+ base64cert = adfs_document.elements["//X509Certificate"].text
69
+ assert adfs_document.validate_signature(base64cert, false)
70
+ end
71
+
72
+ it "raise validation error when the X509Certificate is missing" do
73
+ decoded_response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
74
+ mod_document = XMLSecurity::SignedDocument.new(decoded_response)
75
+ exception = assert_raises(OneLogin::RubySaml::ValidationError) do
76
+ mod_document.validate_document("a fingerprint", false) # The fingerprint isn't relevant to this test
77
+ end
78
+ assert_equal("Certificate element missing in response (ds:X509Certificate)", exception.message)
79
+ end
80
+ end
81
+
82
+ describe "#canon_algorithm" do
83
+ it "C14N_EXCLUSIVE_1_0" do
84
+ canon_algorithm = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0
85
+ assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2001/10/xml-exc-c14n#")
86
+ assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2001/10/xml-exc-c14n#WithComments")
87
+ assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("other")
88
+ end
89
+
90
+ it "C14N_1_0" do
91
+ canon_algorithm = Nokogiri::XML::XML_C14N_1_0
92
+ assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/TR/2001/REC-xml-c14n-20010315")
93
+ end
94
+
95
+ it "XML_C14N_1_1" do
96
+ canon_algorithm = Nokogiri::XML::XML_C14N_1_1
97
+ assert_equal canon_algorithm, XMLSecurity::BaseDocument.new.canon_algorithm("http://www.w3.org/2006/12/xml-c14n11")
98
+ end
99
+ end
100
+
101
+ describe "#algorithm" do
102
+ it "SHA1" do
103
+ alg = OpenSSL::Digest::SHA1
104
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2000/09/xmldsig#rsa-sha1")
105
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2000/09/xmldsig#sha1")
106
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("other")
107
+ end
108
+
109
+ it "SHA256" do
110
+ alg = OpenSSL::Digest::SHA256
111
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")
112
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha256")
113
+ end
114
+
115
+ it "SHA384" do
116
+ alg = OpenSSL::Digest::SHA384
117
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha384")
118
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha384")
119
+ end
120
+
121
+ it "SHA512" do
122
+ alg = OpenSSL::Digest::SHA512
123
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha512")
124
+ assert_equal alg, XMLSecurity::BaseDocument.new.algorithm("http://www.w3.org/2001/04/xmldsig-more#sha512")
125
+ end
126
+ end
127
+
128
+ describe "Fingerprint Algorithms" do
129
+ let(:response_fingerprint_test) { OneLogin::RubySaml::Response.new(fixture(:adfs_response_sha1, false)) }
130
+
131
+ it "validate using SHA1" do
132
+ sha1_fingerprint = "F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72"
133
+ sha1_fingerprint_downcase = "f13c6b80905a030e6c913e5d15faddb016454872"
134
+
135
+ assert response_fingerprint_test.document.validate_document(sha1_fingerprint)
136
+ assert response_fingerprint_test.document.validate_document(sha1_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA1)
137
+
138
+ assert response_fingerprint_test.document.validate_document(sha1_fingerprint_downcase)
139
+ assert response_fingerprint_test.document.validate_document(sha1_fingerprint_downcase, true, :fingerprint_alg => XMLSecurity::Document::SHA1)
140
+ end
141
+
142
+ it "validate using SHA256" do
143
+ sha256_fingerprint = "C4:C6:BD:41:EC:AD:57:97:CE:7B:7D:80:06:C3:E4:30:53:29:02:0B:DD:2D:47:02:9E:BD:85:AD:93:02:45:21"
144
+
145
+ assert !response_fingerprint_test.document.validate_document(sha256_fingerprint)
146
+ assert response_fingerprint_test.document.validate_document(sha256_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA256)
147
+ end
148
+
149
+ it "validate using SHA384" do
150
+ sha384_fingerprint = "98:FE:17:90:31:E7:68:18:8A:65:4D:DA:F5:76:E2:09:97:BE:8B:E3:7E:AA:8D:63:64:7C:0C:38:23:9A:AC:A2:EC:CE:48:A6:74:4D:E0:4C:50:80:40:B4:8D:55:14:14"
151
+
152
+ assert !response_fingerprint_test.document.validate_document(sha384_fingerprint)
153
+ assert response_fingerprint_test.document.validate_document(sha384_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA384)
154
+ end
155
+
156
+ it "validate using SHA512" do
157
+ sha512_fingerprint = "5A:AE:BA:D0:BA:9D:1E:25:05:01:1E:1A:C9:E9:FF:DB:ED:FA:6E:F7:52:EB:45:49:BD:DB:06:D8:A3:7E:CC:63:3A:04:A2:DD:DF:EE:61:05:D9:58:95:2A:77:17:30:4B:EB:4A:9F:48:4A:44:1C:D0:9E:0B:1E:04:77:FD:A3:D2"
158
+
159
+ assert !response_fingerprint_test.document.validate_document(sha512_fingerprint)
160
+ assert response_fingerprint_test.document.validate_document(sha512_fingerprint, true, :fingerprint_alg => XMLSecurity::Document::SHA512)
161
+ end
162
+
163
+ end
164
+
165
+ describe "Signature Algorithms" do
166
+ it "validate using SHA1" do
167
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
168
+ assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
169
+ end
170
+
171
+ it "validate using SHA256" do
172
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
173
+ assert document.validate_document("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA")
174
+ end
175
+
176
+ it "validate using SHA384" do
177
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, false))
178
+ assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
179
+ end
180
+
181
+ it "validate using SHA512" do
182
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
183
+ assert document.validate_document("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72")
184
+ end
185
+ end
186
+
187
+ describe "XmlSecurity::SignedDocument" do
188
+
189
+ describe "#extract_inclusive_namespaces" do
190
+ it "support explicit namespace resolution for exclusive canonicalization" do
191
+ response = fixture(:open_saml_response, false)
192
+ document = XMLSecurity::SignedDocument.new(response)
193
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
194
+
195
+ assert_equal %w[ xs ], inclusive_namespaces
196
+ end
197
+
198
+ it "support implicit namespace resolution for exclusive canonicalization" do
199
+ response = fixture(:no_signature_ns, false)
200
+ document = XMLSecurity::SignedDocument.new(response)
201
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
202
+
203
+ assert_equal %w[ #default saml ds xs xsi ], inclusive_namespaces
204
+ end
205
+
206
+ it 'support inclusive canonicalization' do
207
+ skip('test not yet implemented')
208
+ response = OneLogin::RubySaml::Response.new(fixture("tdnf_response.xml"))
209
+ response.stubs(:conditions).returns(nil)
210
+ assert !response.is_valid?
211
+ assert !response.is_valid?
212
+ response.settings = settings
213
+ assert !response.is_valid?
214
+ 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(" ", ":")
215
+ assert response.is_valid?
216
+ end
217
+
218
+ it "return an empty list when inclusive namespace element is missing" do
219
+ response = fixture(:no_signature_ns, false)
220
+ response.slice! %r{<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/>}
221
+
222
+ document = XMLSecurity::SignedDocument.new(response)
223
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
224
+
225
+ assert inclusive_namespaces.empty?
226
+ end
227
+ end
228
+
229
+ describe "XMLSecurity::DSIG" do
230
+ before do
231
+ settings.idp_sso_target_url = "https://idp.example.com/sso"
232
+ settings.protocol_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
233
+ settings.idp_slo_target_url = "https://idp.example.com/slo",
234
+ settings.issuer = "https://sp.example.com/saml2"
235
+ settings.assertion_consumer_service_url = "https://sp.example.com/acs"
236
+ settings.single_logout_service_url = "https://sp.example.com/sls"
237
+ end
238
+
239
+
240
+ it "sign an AuthNRequest" do
241
+ request = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
242
+ request.sign_document(ruby_saml_key, ruby_saml_cert)
243
+ # verify our signature
244
+ signed_doc = XMLSecurity::SignedDocument.new(request.to_s)
245
+ assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
246
+
247
+ request2 = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
248
+ request2.sign_document(ruby_saml_key, ruby_saml_cert_text)
249
+ # verify our signature
250
+ signed_doc2 = XMLSecurity::SignedDocument.new(request2.to_s)
251
+ assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
252
+ end
253
+
254
+ it "sign an AuthNRequest with certificate as text" do
255
+ request = OneLogin::RubySaml::Authrequest.new.create_authentication_xml_doc(settings)
256
+ request.sign_document(ruby_saml_key, ruby_saml_cert_text)
257
+
258
+ # verify our signature
259
+ signed_doc = XMLSecurity::SignedDocument.new(request.to_s)
260
+ assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
261
+ end
262
+
263
+ it "sign a LogoutRequest" do
264
+ logout_request = OneLogin::RubySaml::Logoutrequest.new.create_logout_request_xml_doc(settings)
265
+ logout_request.sign_document(ruby_saml_key, ruby_saml_cert)
266
+ # verify our signature
267
+ signed_doc = XMLSecurity::SignedDocument.new(logout_request.to_s)
268
+ assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
269
+
270
+ logout_request2 = OneLogin::RubySaml::Logoutrequest.new.create_logout_request_xml_doc(settings)
271
+ logout_request2.sign_document(ruby_saml_key, ruby_saml_cert_text)
272
+ # verify our signature
273
+ signed_doc2 = XMLSecurity::SignedDocument.new(logout_request2.to_s)
274
+ signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
275
+ assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
276
+ end
277
+
278
+ it "sign a LogoutResponse" do
279
+ logout_response = OneLogin::RubySaml::SloLogoutresponse.new.create_logout_response_xml_doc(settings, 'request_id_example', "Custom Logout Message")
280
+ logout_response.sign_document(ruby_saml_key, ruby_saml_cert)
281
+ # verify our signature
282
+ signed_doc = XMLSecurity::SignedDocument.new(logout_response.to_s)
283
+ assert signed_doc.validate_document(ruby_saml_cert_fingerprint, false)
284
+
285
+ logout_response2 = OneLogin::RubySaml::SloLogoutresponse.new.create_logout_response_xml_doc(settings, 'request_id_example', "Custom Logout Message")
286
+ logout_response2.sign_document(ruby_saml_key, ruby_saml_cert_text)
287
+ # verify our signature
288
+ signed_doc2 = XMLSecurity::SignedDocument.new(logout_response2.to_s)
289
+ signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
290
+ assert signed_doc2.validate_document(ruby_saml_cert_fingerprint, false)
291
+ end
292
+ end
293
+
294
+ describe "StarfieldTMS" do
295
+ let (:response) { OneLogin::RubySaml::Response.new(fixture(:starfield_response)) }
296
+
297
+ before do
298
+ response.settings = OneLogin::RubySaml::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")
299
+ end
300
+
301
+ it "be able to validate a good response" do
302
+ Timecop.freeze Time.parse('2012-11-28 17:55:00 UTC') do
303
+ response.stubs(:validate_subject_confirmation).returns(true)
304
+ assert response.is_valid?
305
+ end
306
+ end
307
+
308
+ it "fail before response is valid" do
309
+ Timecop.freeze Time.parse('2012-11-20 17:55:00 UTC') do
310
+ assert !response.is_valid?
311
+
312
+ contains_expected_error = response.errors.include? "Current time is earlier than NotBefore condition 2012-11-20 17:55:00 UTC < 2012-11-28 17:53:45 UTC)"
313
+ contains_expected_error ||= response.errors.include? "Current time is earlier than NotBefore condition Tue Nov 20 17:55:00 UTC 2012 < Wed Nov 28 17:53:45 UTC 2012)"
314
+ assert contains_expected_error
315
+ end
316
+ end
317
+
318
+ it "fail after response expires" do
319
+ Timecop.freeze Time.parse('2012-11-30 17:55:00 UTC') do
320
+ assert !response.is_valid?
321
+
322
+ contains_expected_error = response.errors.include? "Current time is on or after NotOnOrAfter condition (2012-11-30 17:55:00 UTC >= 2012-11-28 18:33:45 UTC)"
323
+ contains_expected_error ||= response.errors.include? "Current time is on or after NotOnOrAfter condition (Fri Nov 30 17:55:00 UTC 2012 >= Wed Nov 28 18:33:45 UTC 2012)"
324
+ assert contains_expected_error
325
+ end
326
+ end
327
+ end
328
+ end
329
+ end
metadata ADDED
@@ -0,0 +1,415 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kl-ruby-saml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - OneLogin LLC
8
+ - Knightlabs LLC
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-07-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: uuid
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '2.3'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.5.10
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 1.5.10
42
+ - !ruby/object:Gem::Dependency
43
+ name: minitest
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '5.5'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '5.5'
56
+ - !ruby/object:Gem::Dependency
57
+ name: mocha
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '0.14'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.14'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '10'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '10'
84
+ - !ruby/object:Gem::Dependency
85
+ name: shoulda
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '2.11'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '2.11'
98
+ - !ruby/object:Gem::Dependency
99
+ name: simplecov
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 0.9.0
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 0.9.0
112
+ - !ruby/object:Gem::Dependency
113
+ name: systemu
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '2'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '2'
126
+ - !ruby/object:Gem::Dependency
127
+ name: timecop
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "<="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.6.0
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "<="
138
+ - !ruby/object:Gem::Version
139
+ version: 0.6.0
140
+ - !ruby/object:Gem::Dependency
141
+ name: pry-byebug
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ description: KL SAML toolkit for Ruby on Rails
155
+ email: support@knightlabs.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files:
159
+ - LICENSE
160
+ - README.md
161
+ files:
162
+ - ".document"
163
+ - ".gitignore"
164
+ - ".travis.yml"
165
+ - Gemfile
166
+ - LICENSE
167
+ - README.md
168
+ - Rakefile
169
+ - changelog.md
170
+ - gemfiles/nokogiri-1.5.gemfile
171
+ - lib/onelogin/ruby-saml.rb
172
+ - lib/onelogin/ruby-saml/attribute_service.rb
173
+ - lib/onelogin/ruby-saml/attributes.rb
174
+ - lib/onelogin/ruby-saml/authrequest.rb
175
+ - lib/onelogin/ruby-saml/http_error.rb
176
+ - lib/onelogin/ruby-saml/idp_metadata_parser.rb
177
+ - lib/onelogin/ruby-saml/logging.rb
178
+ - lib/onelogin/ruby-saml/logoutrequest.rb
179
+ - lib/onelogin/ruby-saml/logoutresponse.rb
180
+ - lib/onelogin/ruby-saml/metadata.rb
181
+ - lib/onelogin/ruby-saml/response.rb
182
+ - lib/onelogin/ruby-saml/saml_message.rb
183
+ - lib/onelogin/ruby-saml/settings.rb
184
+ - lib/onelogin/ruby-saml/slo_logoutrequest.rb
185
+ - lib/onelogin/ruby-saml/slo_logoutresponse.rb
186
+ - lib/onelogin/ruby-saml/utils.rb
187
+ - lib/onelogin/ruby-saml/validation_error.rb
188
+ - lib/onelogin/ruby-saml/version.rb
189
+ - lib/ruby-saml.rb
190
+ - lib/schemas/saml-schema-assertion-2.0.xsd
191
+ - lib/schemas/saml-schema-authn-context-2.0.xsd
192
+ - lib/schemas/saml-schema-authn-context-types-2.0.xsd
193
+ - lib/schemas/saml-schema-metadata-2.0.xsd
194
+ - lib/schemas/saml-schema-protocol-2.0.xsd
195
+ - lib/schemas/sstc-metadata-attr.xsd
196
+ - lib/schemas/sstc-saml-attribute-ext.xsd
197
+ - lib/schemas/sstc-saml-metadata-algsupport-v1.0.xsd
198
+ - lib/schemas/sstc-saml-metadata-ui-v1.0.xsd
199
+ - lib/schemas/xenc-schema.xsd
200
+ - lib/schemas/xml.xsd
201
+ - lib/schemas/xmldsig-core-schema.xsd
202
+ - lib/xml_security.rb
203
+ - ruby-saml.gemspec
204
+ - test/certificates/certificate1
205
+ - test/certificates/certificate_without_head_foot
206
+ - test/certificates/formatted_certificate
207
+ - test/certificates/formatted_private_key
208
+ - test/certificates/formatted_rsa_private_key
209
+ - test/certificates/invalid_certificate1
210
+ - test/certificates/invalid_certificate2
211
+ - test/certificates/invalid_certificate3
212
+ - test/certificates/invalid_private_key1
213
+ - test/certificates/invalid_private_key2
214
+ - test/certificates/invalid_private_key3
215
+ - test/certificates/invalid_rsa_private_key1
216
+ - test/certificates/invalid_rsa_private_key2
217
+ - test/certificates/invalid_rsa_private_key3
218
+ - test/certificates/ruby-saml.crt
219
+ - test/certificates/ruby-saml.key
220
+ - test/idp_metadata_parser_test.rb
221
+ - test/logging_test.rb
222
+ - test/logout_requests/invalid_slo_request.xml
223
+ - test/logout_requests/slo_request.xml
224
+ - test/logout_requests/slo_request.xml.base64
225
+ - test/logout_requests/slo_request_deflated.xml.base64
226
+ - test/logout_requests/slo_request_with_session_index.xml
227
+ - test/logout_responses/logoutresponse_fixtures.rb
228
+ - test/logoutrequest_test.rb
229
+ - test/logoutresponse_test.rb
230
+ - test/metadata_test.rb
231
+ - test/request_test.rb
232
+ - test/response_test.rb
233
+ - test/responses/adfs_response_sha1.xml
234
+ - test/responses/adfs_response_sha256.xml
235
+ - test/responses/adfs_response_sha384.xml
236
+ - test/responses/adfs_response_sha512.xml
237
+ - test/responses/adfs_response_xmlns.xml
238
+ - test/responses/attackxee.xml
239
+ - test/responses/idp_descriptor.xml
240
+ - test/responses/invalids/invalid_audience.xml.base64
241
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
242
+ - test/responses/invalids/invalid_issuer_message.xml.base64
243
+ - test/responses/invalids/invalid_signature_position.xml.base64
244
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
245
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
246
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
247
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
248
+ - test/responses/invalids/multiple_assertions.xml.base64
249
+ - test/responses/invalids/multiple_signed.xml.base64
250
+ - test/responses/invalids/no_id.xml.base64
251
+ - test/responses/invalids/no_saml2.xml.base64
252
+ - test/responses/invalids/no_signature.xml.base64
253
+ - test/responses/invalids/no_status.xml.base64
254
+ - test/responses/invalids/no_status_code.xml.base64
255
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
256
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
257
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
258
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
259
+ - test/responses/invalids/status_code_responder.xml.base64
260
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
261
+ - test/responses/no_signature_ns.xml
262
+ - test/responses/open_saml_response.xml
263
+ - test/responses/response_assertion_wrapped.xml.base64
264
+ - test/responses/response_encrypted_nameid.xml.base64
265
+ - test/responses/response_eval.xml
266
+ - test/responses/response_no_cert_and_encrypted_attrs.xml
267
+ - test/responses/response_unsigned_xml_base64
268
+ - test/responses/response_with_ampersands.xml
269
+ - test/responses/response_with_ampersands.xml.base64
270
+ - test/responses/response_with_multiple_attribute_values.xml
271
+ - test/responses/response_with_saml2_namespace.xml.base64
272
+ - test/responses/response_with_signed_assertion.xml.base64
273
+ - test/responses/response_with_signed_assertion_2.xml.base64
274
+ - test/responses/response_with_undefined_recipient.xml.base64
275
+ - test/responses/response_without_attributes.xml.base64
276
+ - test/responses/response_wrapped.xml.base64
277
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
278
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
279
+ - test/responses/simple_saml_php.xml
280
+ - test/responses/starfield_response.xml.base64
281
+ - test/responses/test_sign.xml
282
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
283
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
284
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
285
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
286
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
287
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
288
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
289
+ - test/responses/valid_response.xml.base64
290
+ - test/saml_message_test.rb
291
+ - test/settings_test.rb
292
+ - test/slo_logoutrequest_test.rb
293
+ - test/slo_logoutresponse_test.rb
294
+ - test/test_helper.rb
295
+ - test/utils_test.rb
296
+ - test/xml_security_test.rb
297
+ homepage: http://github.com/knightlabs/ruby-saml
298
+ licenses:
299
+ - MIT
300
+ metadata: {}
301
+ post_install_message:
302
+ rdoc_options:
303
+ - "--charset=UTF-8"
304
+ require_paths:
305
+ - lib
306
+ required_ruby_version: !ruby/object:Gem::Requirement
307
+ requirements:
308
+ - - ">="
309
+ - !ruby/object:Gem::Version
310
+ version: 1.8.7
311
+ required_rubygems_version: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - ">="
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ requirements: []
317
+ rubyforge_project: http://www.rubygems.org/gems/kl-ruby-saml
318
+ rubygems_version: 2.2.2
319
+ signing_key:
320
+ specification_version: 4
321
+ summary: KL SAML Ruby Tookit
322
+ test_files:
323
+ - test/certificates/certificate1
324
+ - test/certificates/certificate_without_head_foot
325
+ - test/certificates/formatted_certificate
326
+ - test/certificates/formatted_private_key
327
+ - test/certificates/formatted_rsa_private_key
328
+ - test/certificates/invalid_certificate1
329
+ - test/certificates/invalid_certificate2
330
+ - test/certificates/invalid_certificate3
331
+ - test/certificates/invalid_private_key1
332
+ - test/certificates/invalid_private_key2
333
+ - test/certificates/invalid_private_key3
334
+ - test/certificates/invalid_rsa_private_key1
335
+ - test/certificates/invalid_rsa_private_key2
336
+ - test/certificates/invalid_rsa_private_key3
337
+ - test/certificates/ruby-saml.crt
338
+ - test/certificates/ruby-saml.key
339
+ - test/idp_metadata_parser_test.rb
340
+ - test/logging_test.rb
341
+ - test/logout_requests/invalid_slo_request.xml
342
+ - test/logout_requests/slo_request.xml
343
+ - test/logout_requests/slo_request.xml.base64
344
+ - test/logout_requests/slo_request_deflated.xml.base64
345
+ - test/logout_requests/slo_request_with_session_index.xml
346
+ - test/logout_responses/logoutresponse_fixtures.rb
347
+ - test/logoutrequest_test.rb
348
+ - test/logoutresponse_test.rb
349
+ - test/metadata_test.rb
350
+ - test/request_test.rb
351
+ - test/response_test.rb
352
+ - test/responses/adfs_response_sha1.xml
353
+ - test/responses/adfs_response_sha256.xml
354
+ - test/responses/adfs_response_sha384.xml
355
+ - test/responses/adfs_response_sha512.xml
356
+ - test/responses/adfs_response_xmlns.xml
357
+ - test/responses/attackxee.xml
358
+ - test/responses/idp_descriptor.xml
359
+ - test/responses/invalids/invalid_audience.xml.base64
360
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
361
+ - test/responses/invalids/invalid_issuer_message.xml.base64
362
+ - test/responses/invalids/invalid_signature_position.xml.base64
363
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
364
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
365
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
366
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
367
+ - test/responses/invalids/multiple_assertions.xml.base64
368
+ - test/responses/invalids/multiple_signed.xml.base64
369
+ - test/responses/invalids/no_id.xml.base64
370
+ - test/responses/invalids/no_saml2.xml.base64
371
+ - test/responses/invalids/no_signature.xml.base64
372
+ - test/responses/invalids/no_status.xml.base64
373
+ - test/responses/invalids/no_status_code.xml.base64
374
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
375
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
376
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
377
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
378
+ - test/responses/invalids/status_code_responder.xml.base64
379
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
380
+ - test/responses/no_signature_ns.xml
381
+ - test/responses/open_saml_response.xml
382
+ - test/responses/response_assertion_wrapped.xml.base64
383
+ - test/responses/response_encrypted_nameid.xml.base64
384
+ - test/responses/response_eval.xml
385
+ - test/responses/response_no_cert_and_encrypted_attrs.xml
386
+ - test/responses/response_unsigned_xml_base64
387
+ - test/responses/response_with_ampersands.xml
388
+ - test/responses/response_with_ampersands.xml.base64
389
+ - test/responses/response_with_multiple_attribute_values.xml
390
+ - test/responses/response_with_saml2_namespace.xml.base64
391
+ - test/responses/response_with_signed_assertion.xml.base64
392
+ - test/responses/response_with_signed_assertion_2.xml.base64
393
+ - test/responses/response_with_undefined_recipient.xml.base64
394
+ - test/responses/response_without_attributes.xml.base64
395
+ - test/responses/response_wrapped.xml.base64
396
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
397
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
398
+ - test/responses/simple_saml_php.xml
399
+ - test/responses/starfield_response.xml.base64
400
+ - test/responses/test_sign.xml
401
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
402
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
403
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
404
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
405
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
406
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
407
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
408
+ - test/responses/valid_response.xml.base64
409
+ - test/saml_message_test.rb
410
+ - test/settings_test.rb
411
+ - test/slo_logoutrequest_test.rb
412
+ - test/slo_logoutresponse_test.rb
413
+ - test/test_helper.rb
414
+ - test/utils_test.rb
415
+ - test/xml_security_test.rb