omniauth-suomifi 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a1f6be0c9db1b5a90f38af2f9eb08aa48330aaf0fac09d820a91134a7d22ba9
4
- data.tar.gz: a03dae85e69231eb5106a76499bebf5a0dd8ddb639b8bcb3cc05348879d73470
3
+ metadata.gz: 3a565773bca57e1803acfbf666ee25c54474374831857b4a1d7eeec965dbf289
4
+ data.tar.gz: f555e8a657886b482b19bc93decac583dd3f6101c2060a48f9f811cc27af1272
5
5
  SHA512:
6
- metadata.gz: e3b5d2142c659ecdda0d3e88b625e0005b35f58bb25b4f44d06dff8b984deb733b148f8e85537d05584a7d817d0f1b36bb3efba52599e71b9858003209417e1a
7
- data.tar.gz: a60c7e15ffa8aecad4d896d3de2ebb4aa20ac3cd44fb7764b093d66c85a8330b90954f889319e21704bfb2c70f1fc66f0f8bb5cf0b7774c1b31d18991e7bf2f5
6
+ metadata.gz: df188a2b7f673b6b2710a63dda35c123b5d757d2a0310b11b76ed43f58ec0c8cc39aa682bb2c99caa8967c5a8083137dc7340804e311aaae7ac20aaabed91739
7
+ data.tar.gz: ce866b947cce063f0df0233bca9a5de7836b2b0326c4dab6398abb6255cd4b58627d365d9abcae09d74bc27fc4f0c7a07ab8f67eaac73efc2ebf0e3891758aeb
@@ -2,3 +2,4 @@
2
2
 
3
3
  require 'omniauth-suomifi/version'
4
4
  require 'omniauth/strategies/suomifi'
5
+ require 'omniauth-suomifi/ruby_saml_extensions'
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This overrides the decryption method in RubySaml in order to add support for
4
+ # AES GCM decryption required by Suomi.fi. The Suomi.fi AES GCM cipher text
5
+ # contains an auth tag that needs to be extracted from the end of the cipher
6
+ # text before decrypting it. Otherwise the `cipher.final` method would fail
7
+ # becuse the decrypted data is incorrect.
8
+ #
9
+ # Related to this GitHub issue:
10
+ # https://github.com/onelogin/ruby-saml/issues/541
11
+ #
12
+ # This differs from the original implementation only with the following aspects:
13
+ # - Detects the AES GCM cipher methods
14
+ # - For the AES CGM cipher methods, extracts the auth tag from the end of the
15
+ # cipher text, assuming it to be 16 bytes in length.
16
+ #
17
+ # Regarding the authentication tag, see:
18
+ # https://tools.ietf.org/html/rfc5116#section-5.1
19
+ #
20
+ # > An authentication tag with a length of 16 octets (128
21
+ # > bits) is used. The AEAD_AES_128_GCM ciphertext is formed by
22
+ # > appending the authentication tag provided as an output to the GCM
23
+ # > encryption operation to the ciphertext that is output by that
24
+ # > operation.
25
+ OneLogin::RubySaml::Utils.class_eval do
26
+ # Obtains the deciphered text
27
+ # @param cipher_text [String] The ciphered text
28
+ # @param symmetric_key [String] The symetric key used to encrypt the text
29
+ # @param algorithm [String] The encrypted algorithm
30
+ # @return [String] The deciphered text
31
+ def self.retrieve_plaintext(cipher_text, symmetric_key, algorithm)
32
+ case algorithm
33
+ when 'http://www.w3.org/2001/04/xmlenc#tripledes-cbc' then cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').decrypt
34
+ when 'http://www.w3.org/2001/04/xmlenc#aes128-cbc' then cipher = OpenSSL::Cipher.new('AES-128-CBC').decrypt
35
+ when 'http://www.w3.org/2001/04/xmlenc#aes192-cbc' then cipher = OpenSSL::Cipher.new('AES-192-CBC').decrypt
36
+ when 'http://www.w3.org/2001/04/xmlenc#aes256-cbc' then cipher = OpenSSL::Cipher.new('AES-256-CBC').decrypt
37
+ when 'http://www.w3.org/2009/xmlenc11#aes128-gcm' then auth_cipher = OpenSSL::Cipher.new('AES-128-GCM').decrypt
38
+ when 'http://www.w3.org/2009/xmlenc11#aes192-gcm' then auth_cipher = OpenSSL::Cipher.new('AES-192-GCM').decrypt
39
+ when 'http://www.w3.org/2009/xmlenc11#aes256-gcm' then auth_cipher = OpenSSL::Cipher.new('AES-256-GCM').decrypt
40
+ when 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' then rsa = symmetric_key
41
+ when 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' then oaep = symmetric_key
42
+ end
43
+
44
+ if cipher
45
+ iv_len = cipher.iv_len
46
+ data = cipher_text[iv_len..-1]
47
+ cipher.padding, cipher.key, cipher.iv = 0, symmetric_key, cipher_text[0..iv_len-1]
48
+ assertion_plaintext = cipher.update(data)
49
+ assertion_plaintext << cipher.final
50
+ elsif auth_cipher
51
+ iv_len, text_len, tag_len = auth_cipher.iv_len, cipher_text.length, 16
52
+ data = cipher_text[iv_len..text_len-1-tag_len]
53
+ auth_cipher.padding = 0
54
+ auth_cipher.key = symmetric_key
55
+ auth_cipher.iv = cipher_text[0..iv_len-1]
56
+ auth_cipher.auth_data = ''
57
+ auth_cipher.auth_tag = cipher_text[text_len-tag_len..-1]
58
+ assertion_plaintext = auth_cipher.update(data)
59
+ assertion_plaintext << auth_cipher.final
60
+ elsif rsa
61
+ rsa.private_decrypt(cipher_text)
62
+ elsif oaep
63
+ oaep.private_decrypt(cipher_text, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING)
64
+ else
65
+ cipher_text
66
+ end
67
+ end
68
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OmniAuth
4
4
  module Suomifi
5
- VERSION = '0.3.0'
5
+ VERSION = '0.4.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-suomifi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Antti Hukkanen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-15 00:00:00.000000000 Z
11
+ date: 2020-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: omniauth-saml
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.10.1
19
+ version: 1.10.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.10.1
26
+ version: 1.10.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '12.3'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '12.3'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.8'
47
+ version: '3.9'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.8'
54
+ version: '3.9'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rack-test
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +106,14 @@ dependencies:
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: 0.16.0
109
+ version: 0.19.0
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 0.16.0
116
+ version: 0.19.0
117
117
  description: Suomi.fi e-Identification service integration for OmniAuth.
118
118
  email:
119
119
  - antti.hukkanen@mainiotech.fi
@@ -125,6 +125,7 @@ files:
125
125
  - README.md
126
126
  - Rakefile
127
127
  - lib/omniauth-suomifi.rb
128
+ - lib/omniauth-suomifi/ruby_saml_extensions.rb
128
129
  - lib/omniauth-suomifi/test.rb
129
130
  - lib/omniauth-suomifi/test/certificate_generator.rb
130
131
  - lib/omniauth-suomifi/test/templates/encrypted_data_template.xml