kl-ruby-saml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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