Skip to content

Commit 9901d8e

Browse files
committed
Rename RequestDocument by Document, Fix algorithm mapping
1 parent aa74fb9 commit 9901d8e

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

lib/onelogin/ruby-saml/authrequest.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ def create_params(settings, params={})
3333
request_params = {"SAMLRequest" => base64_request}
3434

3535
if settings.security[:authn_requests_signed] && !settings.security[:embeed_sign] && settings.private_key
36-
params['SigAlg'] = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'
36+
params['SigAlg'] = XMLSecurity::Document::SHA1
3737
url_string = "SAMLRequest=#{CGI.escape(base64_request)}"
3838
url_string += "&RelayState=#{CGI.escape(params['RelayState'])}" if params['RelayState']
3939
url_string += "&SigAlg=#{CGI.escape(params['SigAlg'])}"
4040
private_key = settings.get_sp_key()
41-
signature = private_key.sign(OpenSSL::Digest::SHA1.new, url_string)
41+
signature = private_key.sign(XMLSecurity::BaseDocument.new.algorithm(settings.security[:signature_method]).new, url_string)
4242
params['Signature'] = encode(signature)
4343
end
4444

@@ -53,7 +53,7 @@ def create_authentication_xml_doc(settings)
5353
uuid = "_" + UUID.new.generate
5454
time = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
5555
# Create AuthnRequest root element using REXML
56-
request_doc = XMLSecurity::RequestDocument.new
56+
request_doc = XMLSecurity::Document.new
5757
request_doc.uuid = uuid
5858

5959
root = request_doc.add_element "samlp:AuthnRequest", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol" }

lib/onelogin/ruby-saml/logoutrequest.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def create_unauth_xml_doc(settings, params)
3131

3232
time = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
3333

34-
request_doc = XMLSecurity::RequestDocument.new
34+
request_doc = XMLSecurity::Document.new
3535
root = request_doc.add_element "samlp:LogoutRequest", { "xmlns:samlp" => "urn:oasis:names:tc:SAML:2.0:protocol" }
3636
root.attributes['ID'] = @uuid
3737
root.attributes['IssueInstant'] = time

lib/onelogin/ruby-saml/settings.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ def get_sp_key
103103
:authn_requests_signed => false,
104104
:logout_requests_signed => false,
105105
:embeed_sign => false,
106-
:digest_method => "SHA1",
107-
:signature_method => "SHA1"
106+
:digest_method => XMLSecurity::Document::SHA1,
107+
:signature_method => XMLSecurity::Document::SHA1
108108
},
109109
:double_quote_xml_attribute_values => false,
110110
}

lib/xml_security.rb

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ module XMLSecurity
3535

3636
class BaseDocument < REXML::Document
3737

38-
C14N = "http://www.w3.org/2001/10/xml-exc-c14n#"
39-
DSIG = "http://www.w3.org/2000/09/xmldsig#"
38+
C14N = "http://www.w3.org/2001/10/xml-exc-c14n#"
39+
DSIG = "http://www.w3.org/2000/09/xmldsig#"
4040

4141
def canon_algorithm(element)
4242
algorithm = element
@@ -70,12 +70,11 @@ def algorithm(element)
7070

7171
end
7272

73-
class RequestDocument < BaseDocument
74-
75-
SHA1 = "http://www.w3.org/2000/09/xmldsig#sha1"
76-
SHA256 = "http://www.w3.org/2000/09/xmldsig#sha256"
77-
SHA384 = "http://www.w3.org/2000/09/xmldsig#sha384"
78-
SHA512 = "http://www.w3.org/2000/09/xmldsig#sha512"
73+
class Document < BaseDocument
74+
SHA1 = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
75+
SHA256 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
76+
SHA384 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"
77+
SHA512 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"
7978
ENVELOPED_SIG = "http://www.w3.org/2000/09/xmldsig#enveloped-signature"
8079
INC_PREFIX_LIST = "#default samlp saml ds xs xsi"
8180

@@ -97,7 +96,6 @@ class RequestDocument < BaseDocument
9796
#<Object />
9897
#</Signature>
9998
def sign_document(private_key, certificate, signature_method = SHA1, digest_method = SHA1)
100-
10199
noko = Nokogiri.parse(self.to_s)
102100
canon_doc = noko.canonicalize(canon_algorithm(C14N))
103101

test/request_test.rb

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,30 @@ class RequestTest < Test::Unit::TestCase
156156
params = OneLogin::RubySaml::Authrequest.new.create_params(settings)
157157
request_xml = Base64.decode64(params["SAMLRequest"])
158158
assert_match %r[<SignatureValue>([a-zA-Z0-9/+=]+)</SignatureValue>], request_xml
159+
request_xml =~ /<SignatureMethod Algorithm='http:\/\/www.w3.org\/2000\/09\/xmldsig#rsa-sha1'\/>/
160+
request_xml =~ /<DigestMethod Algorithm='http:\/\/www.w3.org\/2000\/09\/xmldsig#rsa-sha1'\/>/
161+
end
162+
163+
should "create a signed request with 256 digest and signature methods" do
164+
settings = OneLogin::RubySaml::Settings.new
165+
settings.compress_request = false
166+
settings.idp_sso_target_url = "http://example.com?field=value"
167+
settings.security[:authn_requests_signed] = true
168+
settings.security[:embeed_sign] = true
169+
settings.security[:signature_method] = XMLSecurity::Document::SHA256
170+
settings.security[:digest_method] = XMLSecurity::Document::SHA512
171+
settings.certificate = ruby_saml_cert_text
172+
settings.private_key = ruby_saml_key_text
173+
174+
params = OneLogin::RubySaml::Authrequest.new.create_params(settings)
175+
request_xml = Base64.decode64(params["SAMLRequest"])
176+
assert_match %r[<SignatureValue>([a-zA-Z0-9/+=]+)</SignatureValue>], request_xml
177+
request_xml =~ /<SignatureMethod Algorithm='http:\/\/www.w3.org\/2001\/04\/xmldsig-more#rsa-sha256'\/>/
178+
request_xml =~ /<DigestMethod Algorithm='http:\/\/www.w3.org\/2001\/04\/xmldsig-more#rsa-sha512'\/>/
159179
end
160180
end
161181

182+
162183
context "when the settings indicate to sign the request" do
163184
should "create a signature parameter" do
164185
settings = OneLogin::RubySaml::Settings.new
@@ -167,12 +188,20 @@ class RequestTest < Test::Unit::TestCase
167188
settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
168189
settings.security[:authn_requests_signed] = true
169190
settings.security[:embeed_sign] = false
191+
settings.security[:signature_method] = XMLSecurity::Document::SHA1
170192
settings.certificate = ruby_saml_cert_text
171193
settings.private_key = ruby_saml_key_text
172194

173195
params = OneLogin::RubySaml::Authrequest.new.create_params(settings)
174196
assert params['Signature']
175-
assert params['SigAlg'] == 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'
197+
assert params['SigAlg'] == XMLSecurity::Document::SHA1
198+
199+
# signature_method only affects the embedeed signature
200+
settings.security[:signature_method] = XMLSecurity::Document::SHA256
201+
params = OneLogin::RubySaml::Authrequest.new.create_params(settings)
202+
assert params['Signature']
203+
assert params['SigAlg'] == XMLSecurity::Document::SHA1
204+
176205
end
177206

178207
end

0 commit comments

Comments
 (0)