saml_idp 0.7.2 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile +1 -1
- data/README.md +59 -52
- data/lib/saml_idp/assertion_builder.rb +28 -3
- data/lib/saml_idp/configurator.rb +7 -1
- data/lib/saml_idp/controller.rb +21 -13
- data/lib/saml_idp/encryptor.rb +0 -1
- data/lib/saml_idp/fingerprint.rb +19 -0
- data/lib/saml_idp/incoming_metadata.rb +22 -1
- data/lib/saml_idp/metadata_builder.rb +23 -8
- data/lib/saml_idp/persisted_metadata.rb +4 -0
- data/lib/saml_idp/request.rb +26 -6
- data/lib/saml_idp/response_builder.rb +26 -6
- data/lib/saml_idp/saml_response.rb +62 -28
- data/lib/saml_idp/service_provider.rb +15 -6
- data/lib/saml_idp/signable.rb +1 -2
- data/lib/saml_idp/version.rb +1 -1
- data/lib/saml_idp/xml_security.rb +1 -1
- data/lib/saml_idp.rb +2 -1
- data/saml_idp.gemspec +45 -42
- data/spec/acceptance/idp_controller_spec.rb +5 -4
- data/spec/lib/saml_idp/algorithmable_spec.rb +6 -6
- data/spec/lib/saml_idp/assertion_builder_spec.rb +151 -8
- data/spec/lib/saml_idp/attribute_decorator_spec.rb +8 -8
- data/spec/lib/saml_idp/configurator_spec.rb +9 -7
- data/spec/lib/saml_idp/controller_spec.rb +53 -20
- data/spec/lib/saml_idp/encryptor_spec.rb +4 -4
- data/spec/lib/saml_idp/fingerprint_spec.rb +14 -0
- data/spec/lib/saml_idp/incoming_metadata_spec.rb +60 -0
- data/spec/lib/saml_idp/metadata_builder_spec.rb +30 -17
- data/spec/lib/saml_idp/name_id_formatter_spec.rb +3 -3
- data/spec/lib/saml_idp/request_spec.rb +78 -27
- data/spec/lib/saml_idp/response_builder_spec.rb +5 -3
- data/spec/lib/saml_idp/saml_response_spec.rb +127 -12
- data/spec/lib/saml_idp/service_provider_spec.rb +2 -2
- data/spec/lib/saml_idp/signable_spec.rb +1 -1
- data/spec/lib/saml_idp/signature_builder_spec.rb +2 -2
- data/spec/lib/saml_idp/signed_info_builder_spec.rb +3 -3
- data/spec/rails_app/app/controllers/saml_controller.rb +1 -1
- data/spec/rails_app/app/controllers/saml_idp_controller.rb +55 -3
- data/{app → spec/rails_app/app}/views/saml_idp/idp/new.html.erb +1 -5
- data/{app → spec/rails_app/app}/views/saml_idp/idp/saml_post.html.erb +1 -1
- data/spec/rails_app/config/application.rb +1 -6
- data/spec/rails_app/config/boot.rb +1 -1
- data/spec/rails_app/config/environments/development.rb +2 -5
- data/spec/rails_app/config/environments/production.rb +1 -0
- data/spec/rails_app/config/environments/test.rb +1 -0
- data/spec/spec_helper.rb +23 -1
- data/spec/support/certificates/sp_cert_req.csr +12 -0
- data/spec/support/certificates/sp_private_key.pem +16 -0
- data/spec/support/certificates/sp_x509_cert.crt +18 -0
- data/spec/support/saml_request_macros.rb +66 -4
- data/spec/support/security_helpers.rb +10 -0
- data/spec/xml_security_spec.rb +12 -12
- metadata +135 -81
- data/app/controllers/saml_idp/idp_controller.rb +0 -59
- data/spec/lib/saml_idp/.assertion_builder_spec.rb.swp +0 -0
@@ -1,32 +1,45 @@
|
|
1
1
|
require 'builder'
|
2
|
+
require 'saml_idp/algorithmable'
|
3
|
+
require 'saml_idp/signable'
|
2
4
|
module SamlIdp
|
3
5
|
class ResponseBuilder
|
6
|
+
include Algorithmable
|
7
|
+
include Signable
|
4
8
|
attr_accessor :response_id
|
5
9
|
attr_accessor :issuer_uri
|
6
10
|
attr_accessor :saml_acs_url
|
7
11
|
attr_accessor :saml_request_id
|
8
12
|
attr_accessor :assertion_and_signature
|
13
|
+
attr_accessor :raw_algorithm
|
9
14
|
|
10
|
-
|
15
|
+
alias_method :reference_id, :response_id
|
16
|
+
|
17
|
+
def initialize(response_id, issuer_uri, saml_acs_url, saml_request_id, assertion_and_signature, raw_algorithm)
|
11
18
|
self.response_id = response_id
|
12
19
|
self.issuer_uri = issuer_uri
|
13
20
|
self.saml_acs_url = saml_acs_url
|
14
21
|
self.saml_request_id = saml_request_id
|
15
22
|
self.assertion_and_signature = assertion_and_signature
|
23
|
+
self.raw_algorithm = raw_algorithm
|
16
24
|
end
|
17
25
|
|
18
|
-
def encoded
|
19
|
-
@encoded ||=
|
26
|
+
def encoded(signed_message: false, compress: false)
|
27
|
+
@encoded ||= signed_message ? encode_signed_message(compress) : encode_raw_message(compress)
|
20
28
|
end
|
21
29
|
|
22
30
|
def raw
|
23
31
|
build
|
24
32
|
end
|
25
33
|
|
26
|
-
def
|
27
|
-
Base64.strict_encode64(raw)
|
34
|
+
def encode_raw_message(compress)
|
35
|
+
Base64.strict_encode64(compress ? deflate(raw) : raw)
|
36
|
+
end
|
37
|
+
private :encode_raw_message
|
38
|
+
|
39
|
+
def encode_signed_message(compress)
|
40
|
+
Base64.strict_encode64(compress ? deflate(signed) : signed)
|
28
41
|
end
|
29
|
-
private :
|
42
|
+
private :encode_signed_message
|
30
43
|
|
31
44
|
def build
|
32
45
|
resp_options = {}
|
@@ -41,6 +54,7 @@ module SamlIdp
|
|
41
54
|
builder = Builder::XmlMarkup.new
|
42
55
|
builder.tag! "samlp:Response", resp_options do |response|
|
43
56
|
response.Issuer issuer_uri, xmlns: Saml::XML::Namespaces::ASSERTION
|
57
|
+
sign response
|
44
58
|
response.tag! "samlp:Status" do |status|
|
45
59
|
status.tag! "samlp:StatusCode", Value: Saml::XML::Namespaces::Statuses::SUCCESS
|
46
60
|
end
|
@@ -52,11 +66,17 @@ module SamlIdp
|
|
52
66
|
def response_id_string
|
53
67
|
"_#{response_id}"
|
54
68
|
end
|
69
|
+
alias_method :reference_id, :response_id
|
55
70
|
private :response_id_string
|
56
71
|
|
57
72
|
def now_iso
|
58
73
|
Time.now.utc.iso8601
|
59
74
|
end
|
60
75
|
private :now_iso
|
76
|
+
|
77
|
+
def deflate(inflated)
|
78
|
+
Zlib::Deflate.deflate(inflated, 9)[2..-5]
|
79
|
+
end
|
80
|
+
private :deflate
|
61
81
|
end
|
62
82
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'saml_idp/assertion_builder'
|
2
4
|
require 'saml_idp/response_builder'
|
3
5
|
module SamlIdp
|
4
6
|
class SamlResponse
|
5
|
-
attr_accessor :assertion_with_signature
|
6
7
|
attr_accessor :reference_id
|
7
8
|
attr_accessor :response_id
|
8
9
|
attr_accessor :issuer_uri
|
@@ -17,20 +18,32 @@ module SamlIdp
|
|
17
18
|
attr_accessor :expiry
|
18
19
|
attr_accessor :encryption_opts
|
19
20
|
attr_accessor :session_expiry
|
21
|
+
attr_accessor :name_id_formats_opts
|
22
|
+
attr_accessor :asserted_attributes_opts
|
23
|
+
attr_accessor :signed_message_opts
|
24
|
+
attr_accessor :signed_assertion_opts
|
25
|
+
attr_accessor :compression_opts
|
26
|
+
|
27
|
+
def initialize(
|
28
|
+
reference_id,
|
29
|
+
response_id,
|
30
|
+
issuer_uri,
|
31
|
+
principal,
|
32
|
+
audience_uri,
|
33
|
+
saml_request_id,
|
34
|
+
saml_acs_url,
|
35
|
+
algorithm,
|
36
|
+
authn_context_classref,
|
37
|
+
expiry = 60 * 60,
|
38
|
+
encryption_opts = nil,
|
39
|
+
session_expiry = 0,
|
40
|
+
name_id_formats_opts = nil,
|
41
|
+
asserted_attributes_opts = nil,
|
42
|
+
signed_message_opts = false,
|
43
|
+
signed_assertion_opts = true,
|
44
|
+
compression_opts = false
|
45
|
+
)
|
20
46
|
|
21
|
-
def initialize(reference_id,
|
22
|
-
response_id,
|
23
|
-
issuer_uri,
|
24
|
-
principal,
|
25
|
-
audience_uri,
|
26
|
-
saml_request_id,
|
27
|
-
saml_acs_url,
|
28
|
-
algorithm,
|
29
|
-
authn_context_classref,
|
30
|
-
expiry=60*60,
|
31
|
-
encryption_opts=nil,
|
32
|
-
session_expiry=0
|
33
|
-
)
|
34
47
|
self.reference_id = reference_id
|
35
48
|
self.response_id = response_id
|
36
49
|
self.issuer_uri = issuer_uri
|
@@ -45,38 +58,59 @@ module SamlIdp
|
|
45
58
|
self.expiry = expiry
|
46
59
|
self.encryption_opts = encryption_opts
|
47
60
|
self.session_expiry = session_expiry
|
61
|
+
self.signed_message_opts = signed_message_opts
|
62
|
+
self.name_id_formats_opts = name_id_formats_opts
|
63
|
+
self.asserted_attributes_opts = asserted_attributes_opts
|
64
|
+
self.signed_assertion_opts = signed_assertion_opts
|
65
|
+
self.name_id_formats_opts = name_id_formats_opts
|
66
|
+
self.asserted_attributes_opts = asserted_attributes_opts
|
67
|
+
self.compression_opts = compression_opts
|
48
68
|
end
|
49
69
|
|
50
70
|
def build
|
51
|
-
@
|
71
|
+
@build ||= encoded_message
|
52
72
|
end
|
53
73
|
|
54
74
|
def signed_assertion
|
55
75
|
if encryption_opts
|
56
76
|
assertion_builder.encrypt(sign: true)
|
57
|
-
|
77
|
+
elsif signed_assertion_opts
|
58
78
|
assertion_builder.signed
|
79
|
+
else
|
80
|
+
assertion_builder.raw
|
59
81
|
end
|
60
82
|
end
|
61
83
|
private :signed_assertion
|
62
84
|
|
85
|
+
def encoded_message
|
86
|
+
if signed_message_opts
|
87
|
+
response_builder.encoded(signed_message: true, compress: compression_opts)
|
88
|
+
else
|
89
|
+
response_builder.encoded(signed_message: false, compress: compression_opts)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
private :encoded_message
|
93
|
+
|
63
94
|
def response_builder
|
64
|
-
ResponseBuilder.new(response_id, issuer_uri, saml_acs_url, saml_request_id, signed_assertion)
|
95
|
+
ResponseBuilder.new(response_id, issuer_uri, saml_acs_url, saml_request_id, signed_assertion, algorithm)
|
65
96
|
end
|
66
97
|
private :response_builder
|
67
98
|
|
68
99
|
def assertion_builder
|
69
|
-
@assertion_builder ||=
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
100
|
+
@assertion_builder ||=
|
101
|
+
AssertionBuilder.new SecureRandom.uuid,
|
102
|
+
issuer_uri,
|
103
|
+
principal,
|
104
|
+
audience_uri,
|
105
|
+
saml_request_id,
|
106
|
+
saml_acs_url,
|
107
|
+
algorithm,
|
108
|
+
authn_context_classref,
|
109
|
+
expiry,
|
110
|
+
encryption_opts,
|
111
|
+
session_expiry,
|
112
|
+
name_id_formats_opts,
|
113
|
+
asserted_attributes_opts
|
80
114
|
end
|
81
115
|
private :assertion_builder
|
82
116
|
end
|
@@ -13,6 +13,7 @@ module SamlIdp
|
|
13
13
|
attribute :validate_signature
|
14
14
|
attribute :acs_url
|
15
15
|
attribute :assertion_consumer_logout_service_url
|
16
|
+
attribute :response_hosts
|
16
17
|
|
17
18
|
delegate :config, to: :SamlIdp
|
18
19
|
|
@@ -21,18 +22,13 @@ module SamlIdp
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def valid_signature?(doc, require_signature = false)
|
24
|
-
if require_signature ||
|
25
|
+
if require_signature || attributes[:validate_signature]
|
25
26
|
doc.valid_signature?(fingerprint)
|
26
27
|
else
|
27
28
|
true
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
def should_validate_signature?
|
32
|
-
attributes[:validate_signature] ||
|
33
|
-
current_metadata.respond_to?(:sign_assertions?) && current_metadata.sign_assertions?
|
34
|
-
end
|
35
|
-
|
36
32
|
def refresh_metadata
|
37
33
|
fresh = fresh_incoming_metadata
|
38
34
|
if valid_signature?(fresh.document)
|
@@ -46,6 +42,19 @@ module SamlIdp
|
|
46
42
|
@current_metadata ||= get_current_or_build
|
47
43
|
end
|
48
44
|
|
45
|
+
def acceptable_response_hosts
|
46
|
+
hosts = Array(self.response_hosts)
|
47
|
+
hosts.push(metadata_url_host) if metadata_url_host
|
48
|
+
|
49
|
+
hosts
|
50
|
+
end
|
51
|
+
|
52
|
+
def metadata_url_host
|
53
|
+
if metadata_url.present?
|
54
|
+
URI(metadata_url).host
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
49
58
|
def get_current_or_build
|
50
59
|
persisted = metadata_getter[identifier, self]
|
51
60
|
if persisted.is_a? Hash
|
data/lib/saml_idp/signable.rb
CHANGED
@@ -108,8 +108,7 @@ module SamlIdp
|
|
108
108
|
canon_algorithm = Nokogiri::XML::XML_C14N_EXCLUSIVE_1_0
|
109
109
|
canon_hashed_element = noko_raw.canonicalize(canon_algorithm, inclusive_namespaces)
|
110
110
|
digest_algorithm = get_algorithm
|
111
|
-
|
112
|
-
hash = digest_algorithm.digest(canon_hashed_element)
|
111
|
+
hash = digest_algorithm.digest(canon_hashed_element)
|
113
112
|
Base64.strict_encode64(hash).gsub(/\n/, '')
|
114
113
|
end
|
115
114
|
private :digest
|
data/lib/saml_idp/version.rb
CHANGED
@@ -108,7 +108,7 @@ module SamlIdp
|
|
108
108
|
canon_algorithm = canon_algorithm REXML::XPath.first(ref, '//ds:CanonicalizationMethod', 'ds' => DSIG)
|
109
109
|
canon_hashed_element = hashed_element.canonicalize(canon_algorithm, inclusive_namespaces)
|
110
110
|
|
111
|
-
digest_algorithm = algorithm(REXML::XPath.first(ref, "//ds:DigestMethod"))
|
111
|
+
digest_algorithm = algorithm(REXML::XPath.first(ref, "//ds:DigestMethod", {'ds' => DSIG}))
|
112
112
|
|
113
113
|
hash = digest_algorithm.digest(canon_hashed_element)
|
114
114
|
digest_value = Base64.decode64(REXML::XPath.first(ref, "//ds:DigestValue", {"ds"=>DSIG}).text)
|
data/lib/saml_idp.rb
CHANGED
@@ -8,7 +8,8 @@ module SamlIdp
|
|
8
8
|
require 'saml_idp/default'
|
9
9
|
require 'saml_idp/metadata_builder'
|
10
10
|
require 'saml_idp/version'
|
11
|
-
require 'saml_idp/
|
11
|
+
require 'saml_idp/fingerprint'
|
12
|
+
require 'saml_idp/engine' if defined?(::Rails)
|
12
13
|
|
13
14
|
def self.config
|
14
15
|
@config ||= SamlIdp::Configurator.new
|
data/saml_idp.gemspec
CHANGED
@@ -1,59 +1,62 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
4
|
+
require 'saml_idp/version'
|
4
5
|
|
5
6
|
Gem::Specification.new do |s|
|
6
7
|
s.name = %q{saml_idp}
|
7
8
|
s.version = SamlIdp::VERSION
|
8
9
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = [
|
10
|
-
s.email =
|
11
|
-
s.homepage =
|
12
|
-
s.summary =
|
13
|
-
s.description =
|
14
|
-
s.date = Time.now.utc.strftime(
|
15
|
-
s.files = Dir
|
16
|
-
|
17
|
-
|
18
|
-
"Gemfile",
|
19
|
-
"saml_idp.gemspec"
|
20
|
-
]
|
21
|
-
s.required_ruby_version = '>= 2.2'
|
22
|
-
s.license = "LICENSE"
|
10
|
+
s.authors = ['Jon Phenow']
|
11
|
+
s.email = 'jon.phenow@sportngin.com'
|
12
|
+
s.homepage = 'https://github.com/saml-idp/saml_idp'
|
13
|
+
s.summary = 'SAML Indentity Provider for Ruby'
|
14
|
+
s.description = 'SAML IdP (Identity Provider) Library for Ruby'
|
15
|
+
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
16
|
+
s.files = Dir['lib/**/*', 'LICENSE', 'README.md', 'Gemfile', 'saml_idp.gemspec']
|
17
|
+
s.required_ruby_version = '>= 2.5'
|
18
|
+
s.license = 'MIT'
|
23
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
-
s.require_paths = [
|
26
|
-
s.rdoc_options = [
|
21
|
+
s.require_paths = ['lib']
|
22
|
+
s.rdoc_options = ['--charset=UTF-8']
|
23
|
+
s.metadata = {
|
24
|
+
'homepage_uri' => 'https://github.com/saml-idp/saml_idp',
|
25
|
+
'source_code_uri' => 'https://github.com/saml-idp/saml_idp',
|
26
|
+
'bug_tracker_uri' => 'https://github.com/saml-idp/saml_idp/issues',
|
27
|
+
'documentation_uri' => "http://rdoc.info/gems/saml_idp/#{SamlIdp::VERSION}"
|
28
|
+
}
|
27
29
|
|
28
30
|
s.post_install_message = <<-INST
|
29
|
-
If you're just recently updating saml_idp - please be aware we've changed the default
|
30
|
-
certificate. See the PR and a description of why we've done this here:
|
31
|
-
https://github.com/
|
32
|
-
|
33
|
-
If you just need to see the certificate `bundle open saml_idp` and go to
|
34
|
-
`lib/saml_idp/default.rb`
|
31
|
+
If you're just recently updating saml_idp - please be aware we've changed the default
|
32
|
+
certificate. See the PR and a description of why we've done this here:
|
33
|
+
https://github.com/saml-idp/saml_idp/pull/29
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
If you just need to see the certificate `bundle open saml_idp` and go to
|
36
|
+
`lib/saml_idp/default.rb`
|
38
37
|
|
39
|
-
|
38
|
+
Similarly, please see the README about certificates - you should avoid using the
|
39
|
+
defaults in a Production environment. Post any issues you to github.
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
** New in Version 0.3.0 **
|
42
|
+
Encrypted Assertions require the xmlenc gem. See the example in the Controller
|
43
|
+
section of the README.
|
43
44
|
INST
|
44
45
|
|
45
|
-
s.add_dependency('activesupport', '>=
|
46
|
-
s.add_dependency('
|
47
|
-
s.add_dependency('builder', '~> 3.0')
|
46
|
+
s.add_dependency('activesupport', '>= 5.2')
|
47
|
+
s.add_dependency('builder', '>= 3.0')
|
48
48
|
s.add_dependency('nokogiri', '>= 1.6.2')
|
49
|
-
|
50
|
-
s.
|
51
|
-
|
52
|
-
s.add_development_dependency('
|
53
|
-
s.add_development_dependency('
|
54
|
-
s.add_development_dependency('
|
55
|
-
s.add_development_dependency('capybara', '
|
56
|
-
s.add_development_dependency('
|
57
|
-
s.add_development_dependency('
|
49
|
+
s.add_dependency('rexml')
|
50
|
+
s.add_dependency('xmlenc', '>= 0.7.1')
|
51
|
+
|
52
|
+
s.add_development_dependency('activeresource', '>= 5.1')
|
53
|
+
s.add_development_dependency('appraisal')
|
54
|
+
s.add_development_dependency('byebug')
|
55
|
+
s.add_development_dependency('capybara', '>= 2.16')
|
56
|
+
s.add_development_dependency('rails', '>= 5.2')
|
57
|
+
s.add_development_dependency('rake')
|
58
|
+
s.add_development_dependency('rspec', '>= 3.7.0')
|
59
|
+
s.add_development_dependency('ruby-saml', '>= 1.7.2')
|
60
|
+
s.add_development_dependency('simplecov')
|
61
|
+
s.add_development_dependency('timecop', '>= 0.8')
|
58
62
|
end
|
59
|
-
|
@@ -4,11 +4,12 @@ feature 'IdpController' do
|
|
4
4
|
scenario 'Login via default signup page' do
|
5
5
|
saml_request = make_saml_request("http://foo.example.com/saml/consume")
|
6
6
|
visit "/saml/auth?SAMLRequest=#{CGI.escape(saml_request)}"
|
7
|
-
|
8
|
-
fill_in '
|
7
|
+
expect(status_code).to eq(200)
|
8
|
+
fill_in 'email', :with => "foo@example.com"
|
9
|
+
fill_in 'password', :with => "okidoki"
|
9
10
|
click_button 'Sign in'
|
10
11
|
click_button 'Submit' # simulating onload
|
11
|
-
current_url.
|
12
|
-
page.
|
12
|
+
expect(current_url).to eq('http://foo.example.com/saml/consume')
|
13
|
+
expect(page).to have_content "foo@example.com"
|
13
14
|
end
|
14
15
|
end
|
@@ -9,11 +9,11 @@ module SamlIdp
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "finds algorithm class" do
|
12
|
-
algorithm.
|
12
|
+
expect(algorithm).to eq(OpenSSL::Digest::SHA256)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "finds the name" do
|
16
|
-
algorithm_name.
|
16
|
+
expect(algorithm_name).to eq("sha256")
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -23,11 +23,11 @@ module SamlIdp
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "finds algorithm class" do
|
26
|
-
algorithm.
|
26
|
+
expect(algorithm).to eq(OpenSSL::Digest::SHA512)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "finds the name" do
|
30
|
-
algorithm_name.
|
30
|
+
expect(algorithm_name).to eq("sha512")
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -37,11 +37,11 @@ module SamlIdp
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "finds algorithm class" do
|
40
|
-
algorithm.
|
40
|
+
expect(algorithm).to eq(OpenSSL::Digest::SHA1)
|
41
41
|
end
|
42
42
|
|
43
43
|
it "finds the name" do
|
44
|
-
algorithm_name.
|
44
|
+
expect(algorithm_name).to eq("sha1")
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|