Skip to content

Commit 0d13840

Browse files
committed
Fix Http-Redirect Signature: SignAlg and RelayState issue
1 parent 0552dc1 commit 0d13840

File tree

8 files changed

+23
-16
lines changed

8 files changed

+23
-16
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ The settings related to sign are stored in the `security` attribute of the setti
341341
settings.security[:logout_responses_signed] = true # Enable or not signature on Logout Response
342342
343343
settings.security[:digest_method] = XMLSecurity::Document::SHA1
344-
settings.security[:signature_method] = XMLSecurity::Document::SHA1
344+
settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA1
345345
346346
settings.security[:embed_sign] = false # Embeded signature or HTTP GET parameter Signature
347347
```

lib/onelogin/ruby-saml/authrequest.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ def create(settings, params = {})
2828

2929
def create_params(settings, params={})
3030
params = {} if params.nil?
31+
# Some ruby-saml versions uses :RelayState others use 'RelayState'
32+
relay_state = params[:RelayState] || params['RelayState']
3133

3234
request_doc = create_authentication_xml_doc(settings)
3335
request_doc.context[:attribute_quote] = :quote if settings.double_quote_xml_attribute_values
@@ -42,9 +44,9 @@ def create_params(settings, params={})
4244
request_params = {"SAMLRequest" => base64_request}
4345

4446
if settings.security[:authn_requests_signed] && !settings.security[:embed_sign] && settings.private_key
45-
params['SigAlg'] = XMLSecurity::Document::RSA_SHA1
47+
params['SigAlg'] = settings.security[:signature_method]
4648
url_string = "SAMLRequest=#{CGI.escape(base64_request)}"
47-
url_string += "&RelayState=#{CGI.escape(params['RelayState'])}" if params['RelayState']
49+
url_string += "&RelayState=#{CGI.escape(relay_state)}" if relay_state
4850
url_string += "&SigAlg=#{CGI.escape(params['SigAlg'])}"
4951
private_key = settings.get_sp_key()
5052
signature = private_key.sign(XMLSecurity::BaseDocument.new.algorithm(settings.security[:signature_method]).new, url_string)

lib/onelogin/ruby-saml/logoutrequest.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def create(settings, params={})
2626

2727
def create_params(settings, params={})
2828
params = {} if params.nil?
29+
# Some ruby-saml versions uses :RelayState others use 'RelayState'
30+
relay_state = params[:RelayState] || params['RelayState']
2931

3032
request_doc = create_logout_request_xml_doc(settings)
3133
request_doc.context[:attribute_quote] = :quote if settings.double_quote_xml_attribute_values
@@ -40,9 +42,9 @@ def create_params(settings, params={})
4042
request_params = {"SAMLRequest" => base64_request}
4143

4244
if settings.security[:logout_requests_signed] && !settings.security[:embed_sign] && settings.private_key
43-
params['SigAlg'] = XMLSecurity::Document::RSA_SHA1
45+
params['SigAlg'] = settings.security[:signature_method]
4446
url_string = "SAMLRequest=#{CGI.escape(base64_request)}"
45-
url_string += "&RelayState=#{CGI.escape(params['RelayState'])}" if params['RelayState']
47+
url_string += "&RelayState=#{CGI.escape(relay_state)}" if relay_state
4648
url_string += "&SigAlg=#{CGI.escape(params['SigAlg'])}"
4749
private_key = settings.get_sp_key()
4850
signature = private_key.sign(XMLSecurity::BaseDocument.new.algorithm(settings.security[:signature_method]).new, url_string)

lib/onelogin/ruby-saml/slo_logoutresponse.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def create(settings, request_id = nil, logout_message = nil, params = {})
2727

2828
def create_params(settings, request_id = nil, logout_message = nil, params = {})
2929
params = {} if params.nil?
30+
# Some ruby-saml versions uses :RelayState others use 'RelayState'
31+
relay_state = params[:RelayState] || params['RelayState']
3032

3133
response_doc = create_logout_response_xml_doc(settings, request_id, logout_message)
3234
response_doc.context[:attribute_quote] = :quote if settings.double_quote_xml_attribute_values
@@ -41,9 +43,9 @@ def create_params(settings, request_id = nil, logout_message = nil, params = {})
4143
response_params = {"SAMLResponse" => base64_response}
4244

4345
if settings.security[:logout_responses_signed] && !settings.security[:embed_sign] && settings.private_key
44-
params['SigAlg'] = XMLSecurity::Document::RSA_SHA1
46+
params['SigAlg'] = settings.security[:signature_method]
4547
url_string = "SAMLResponse=#{CGI.escape(base64_response)}"
46-
url_string += "&RelayState=#{CGI.escape(params['RelayState'])}" if params['RelayState']
48+
url_string += "&RelayState=#{CGI.escape(relay_state)}" if relay_state
4749
url_string += "&SigAlg=#{CGI.escape(params['SigAlg'])}"
4850
private_key = settings.get_sp_key()
4951
signature = private_key.sign(XMLSecurity::BaseDocument.new.algorithm(settings.security[:signature_method]).new, url_string)

lib/xml_security.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ def algorithm(element)
5656
algorithm = element
5757
if algorithm.is_a?(REXML::Element)
5858
algorithm = element.attribute("Algorithm").value
59-
algorithm = algorithm && algorithm =~ /sha(.*?)$/i && $1.to_i
6059
end
6160

61+
algorithm = algorithm && algorithm =~ /(rsa-)?sha(.*?)$/i && $2.to_i
62+
6263
case algorithm
6364
when 256 then OpenSSL::Digest::SHA256
6465
when 384 then OpenSSL::Digest::SHA384

test/logoutrequest_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,11 @@ class RequestTest < Minitest::Test
148148
assert params['Signature']
149149
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
150150

151-
# signature_method only affects the embedeed signature
151+
# if signature_method changes, the SigAlg also changes
152152
settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA256
153153
params = OneLogin::RubySaml::Logoutrequest.new.create_params(settings)
154154
assert params['Signature']
155-
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
155+
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA256
156156
end
157157
end
158158

test/request_test.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,11 @@ class RequestTest < Minitest::Test
197197
assert params['Signature']
198198
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
199199

200-
# signature_method only affects the embedeed signature
201-
settings.security[:signature_method] = XMLSecurity::Document::SHA256
200+
# if signature_method changes, the SigAlg also changes
201+
settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA256
202202
params = OneLogin::RubySaml::Authrequest.new.create_params(settings)
203203
assert params['Signature']
204-
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
204+
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA256
205205
end
206206
end
207207

test/slo_logoutresponse_test.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ class SloLogoutresponseTest < Minitest::Test
124124
assert params['Signature']
125125
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
126126

127-
# signature_method only affects the embedeed signature
128-
settings.security[:signature_method] = XMLSecurity::Document::SHA256
127+
# if signature_method changes, the SigAlg also changes
128+
settings.security[:signature_method] = XMLSecurity::Document::RSA_SHA256
129129
params = OneLogin::RubySaml::SloLogoutresponse.new.create_params(settings, request.id, "Custom Logout Message")
130130
assert params['Signature']
131-
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA1
131+
assert params['SigAlg'] == XMLSecurity::Document::RSA_SHA256
132132
end
133133
end
134134
end

0 commit comments

Comments
 (0)