@@ -123,15 +123,14 @@ def self.format_private_key(key)
123123 # don't try to format an encoded private key or if is empty
124124 return key if key . nil? || key . empty? || key . match ( /\x0d / )
125125
126- # is this an rsa key?
127- rsa_key = key . match ( "RSA PRIVATE KEY" )
128- key = key . gsub ( /-{5}\s ?(BEGIN|END)( RSA)? PRIVATE KEY\s ?-{5}/ , "" )
126+ key_algo = key . match ( /((?:RSA|DSA|EC|ECDSA) )PRIVATE KEY/ ) &.[]( 1 )
127+ key = key . gsub ( /-{5}\s ?(BEGIN|END)( (?:RSA|DSA|EC|ECDSA))? PRIVATE KEY\s ?-{5}/ , "" )
129128 key = key . gsub ( /\n / , "" )
130129 key = key . gsub ( /\r / , "" )
131130 key = key . gsub ( /\s / , "" )
132131 key = key . scan ( /.{1,64}/ )
133132 key = key . join ( "\n " )
134- key_label = rsa_key ? "RSA PRIVATE KEY" : " PRIVATE KEY"
133+ key_label = " #{ key_algo } PRIVATE KEY"
135134 "-----BEGIN #{ key_label } -----\n #{ key } \n -----END #{ key_label } -----"
136135 end
137136
@@ -149,12 +148,25 @@ def self.build_cert_object(cert)
149148 # Given a private key string, return an OpenSSL::PKey::RSA object.
150149 #
151150 # @param cert [String] The original private key
152- # @return [OpenSSL::PKey::RSA ] The private key object
151+ # @return [OpenSSL::PKey::PKey ] The private key object
153152 #
154153 def self . build_private_key_object ( private_key )
155154 return nil if private_key . nil? || private_key . empty?
156155
157- OpenSSL ::PKey ::RSA . new ( format_private_key ( private_key ) )
156+ private_key = format_private_key ( private_key )
157+ error = nil
158+
159+ [ OpenSSL ::PKey ::RSA ,
160+ OpenSSL ::PKey ::DSA ,
161+ OpenSSL ::PKey ::EC ] . each do |key_class |
162+ begin
163+ return key_class . new ( private_key )
164+ rescue OpenSSL ::PKey ::PKeyError => e
165+ error ||= e
166+ end
167+ end
168+
169+ raise error
158170 end
159171
160172 # Build the Query String signature that will be used in the HTTP-Redirect binding
@@ -236,7 +248,7 @@ def self.escape_request_param(param, lowercase_url_encoding)
236248 #
237249 def self . verify_signature ( params )
238250 cert , sig_alg , signature , query_string = %i[ cert sig_alg signature query_string ] . map { |k | params [ k ] }
239- signature_algorithm = RubySaml ::XML ::BaseDocument . new . algorithm ( sig_alg )
251+ signature_algorithm = RubySaml ::XML ::Crypto . hash_algorithm ( sig_alg )
240252 cert . public_key . verify ( signature_algorithm . new , Base64 . decode64 ( signature ) , query_string )
241253 end
242254
@@ -266,7 +278,7 @@ def self.status_error_msg(error_msg, raw_status_code = nil, status_message = nil
266278 # Obtains the decrypted string from an Encrypted node element in XML,
267279 # given multiple private keys to try.
268280 # @param encrypted_node [REXML::Element] The Encrypted element
269- # @param private_keys [Array<OpenSSL::PKey::RSA >] The Service provider private key
281+ # @param private_keys [Array<OpenSSL::PKey::PKey >] The Service provider private key
270282 # @return [String] The decrypted data
271283 def self . decrypt_multi ( encrypted_node , private_keys )
272284 raise ArgumentError . new ( 'private_keys must be specified' ) if !private_keys || private_keys . empty?
@@ -285,7 +297,7 @@ def self.decrypt_multi(encrypted_node, private_keys)
285297
286298 # Obtains the decrypted string from an Encrypted node element in XML
287299 # @param encrypted_node [REXML::Element] The Encrypted element
288- # @param private_key [OpenSSL::PKey::RSA ] The Service provider private key
300+ # @param private_key [OpenSSL::PKey::PKey ] The Service provider private key
289301 # @return [String] The decrypted data
290302 def self . decrypt_data ( encrypted_node , private_key )
291303 encrypt_data = REXML ::XPath . first (
@@ -311,7 +323,7 @@ def self.decrypt_data(encrypted_node, private_key)
311323
312324 # Obtains the symmetric key from the EncryptedData element
313325 # @param encrypt_data [REXML::Element] The EncryptedData element
314- # @param private_key [OpenSSL::PKey::RSA ] The Service provider private key
326+ # @param private_key [OpenSSL::PKey::PKey ] The Service provider private key
315327 # @return [String] The symmetric key
316328 def self . retrieve_symmetric_key ( encrypt_data , private_key )
317329 encrypted_key = REXML ::XPath . first (
0 commit comments