r-saml 1.0.1

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