mobile_id 0.0.13 → 0.0.14

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: 23c0f87295e5303fe359317d68393e1c9cb50f8ba1d51030edb01f6d9aed12c9
4
- data.tar.gz: 02efb290beb29fcc719fe2b9a291fbd5590426f681835949630ae977e2167055
3
+ metadata.gz: f6586590b52a7e282042dcc43d8de42c821d1d8b1ccfeb243ef4b9f75f2ac0ad
4
+ data.tar.gz: ae6c05b4242a3beadf025c109f0912b5be3f99da2f8ad78c55ea0a58f5a66b0b
5
5
  SHA512:
6
- metadata.gz: f4223ca81fabe81ad3bacad29f1a7ea9026f797f619fb2bdd7f1ae4d1c15f931e61cb47e6dc6eb49f18b2b4293760b5fb324cddefb6c35b4b659ca2d05926e6f
7
- data.tar.gz: f21c96ae471cfeff68341e19b3a83bed6ae4ba6b62262a8cb174e5f65f59bc4aeff114beb14638fad093a7ef59af0d983a42bdb29ac0bff061dae32fc95d85f2
6
+ metadata.gz: 67a128c840d171f2fc0199c86fea6d2c8cedca2d2efba844649595a156fc6cd29f9b50a442b8273bd1a719f8f26fbc57e66b5aa66c01e5e1204795b89b5d93ad
7
+ data.tar.gz: db6c5d6cfd37d16c8fa6c1e826614d0861d5827785183d9e93807ed5ebde7a9f63f1548d9ec1d5d427a0a6210082c53ffdcd85228462e645b0069386e58f7904
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
+ Release 0.0.14
2
+ * Added LT locale with locale init update (thanks Mijora)
3
+ * Init rubocop (thanks Thales Ribeiro)
4
+
1
5
  Release 0.0.13
2
- * More test friendly init
3
- * More precise sert check
6
+ * Gems updated to latest
7
+ * More test friendly init (thanks Juri Linkov)
8
+ * More precise sert check (thanks Andri Möll)
4
9
 
5
10
  Release 0.0.12
6
11
  * Supports session RUNNING state
data/README.md CHANGED
@@ -114,10 +114,12 @@ After checking out the repo, run `bundle` to install dependencies. For testing c
114
114
  * Priit Tark
115
115
  * Andri Möll for pointing out user signature issue and cert date check
116
116
  * Juri Linkov for pointing out unpack method issue and test friendly init
117
+ * Thales Ribeiro for rubocop initial
118
+ * Mijora for LT locale
117
119
 
118
120
  ## Contributing
119
121
 
120
- Bug reports and pull requests are welcome on GitHub at https://github.com/gitlabeu/mobile_id
122
+ Bug reports and pull requests are welcome on GitHub at https://github.com/domify/mobile_id
121
123
 
122
124
  ## Roadmap
123
125
 
@@ -130,4 +132,4 @@ The gem is available as open source under the terms of the [MIT License](http://
130
132
 
131
133
  ## Sponsors
132
134
 
133
- Gem development and testing is sponsored by [GiTLAB](https://gitlab.eu).
135
+ Gem development and testing is sponsored by [Domify](https://domify.io).
@@ -2,12 +2,13 @@
2
2
 
3
3
  module MobileId
4
4
  class Auth
5
+
5
6
  # API documentation https://github.com/SK-EID/MID
6
- LIVE_URL = "https://mid.sk.ee/mid-api"
7
- TEST_URL = "https://tsp.demo.sk.ee/mid-api"
7
+ LIVE_URL = 'https://mid.sk.ee/mid-api'
8
+ TEST_URL = 'https://tsp.demo.sk.ee/mid-api'
8
9
 
9
- TEST_UUID = "00000000-0000-0000-0000-000000000000"
10
- TEST_NAME = "DEMO"
10
+ TEST_UUID = '00000000-0000-0000-0000-000000000000'
11
+ TEST_NAME = 'DEMO'
11
12
 
12
13
  attr_accessor :url, :uuid, :name, :doc, :hash, :user_cert, :live
13
14
 
@@ -24,25 +25,25 @@ module MobileId
24
25
  self.hash = Digest::SHA256.digest(doc)
25
26
  end
26
27
 
27
- def authenticate!(phone_calling_code: nil, phone:, personal_code:, language: nil, display_text: nil)
28
+ def authenticate!(phone:, personal_code:, phone_calling_code: nil, language: nil, display_text: nil)
28
29
  phone_calling_code ||= '+372'
29
30
  full_phone = "#{phone_calling_code}#{phone}"
30
- language ||=
31
+ language ||=
31
32
  case I18n.locale
32
33
  when :et
33
- display_text ||= 'Autentimine'
34
+ display_text ||= 'Autentimine'
34
35
  'EST'
35
36
  when :ru
36
- display_text ||= 'Аутентификация'
37
+ display_text ||= 'Аутентификация'
37
38
  'RUS'
38
39
  else
39
- display_text ||= 'Authentication'
40
+ display_text ||= 'Authentication'
40
41
  'ENG'
41
42
  end
42
-
43
+
43
44
  options = {
44
45
  headers: {
45
- "Content-Type": "application/json"
46
+ 'Content-Type': 'application/json'
46
47
  },
47
48
  query: {},
48
49
  body: {
@@ -52,20 +53,20 @@ module MobileId
52
53
  nationalIdentityNumber: personal_code.to_s.strip,
53
54
  hash: Base64.strict_encode64(hash),
54
55
  hashType: 'SHA256',
55
- language: language,
56
+ language:,
56
57
  displayText: display_text,
57
58
  displayTextFormat: 'GSM-7' # or "UCS-2”
58
59
  }.to_json
59
60
  }
60
61
 
61
- response = HTTParty.post(url + '/authentication', options)
62
+ response = HTTParty.post("#{url}/authentication", options)
62
63
  raise Error, "#{I18n.t('mobile_id.some_error')} #{response}" unless response.code == 200
63
64
 
64
65
  ActiveSupport::HashWithIndifferentAccess.new(
65
66
  session_id: response['sessionID'],
66
- phone: phone,
67
- phone_calling_code: phone_calling_code,
68
- doc: doc
67
+ phone:,
68
+ phone_calling_code:,
69
+ doc:
69
70
  )
70
71
  end
71
72
 
@@ -73,9 +74,9 @@ module MobileId
73
74
  long_poll!(session_id: auth['session_id'], doc: auth['doc'])
74
75
 
75
76
  ActiveSupport::HashWithIndifferentAccess.new(
76
- personal_code: personal_code,
77
- first_name: first_name,
78
- last_name: last_name,
77
+ personal_code:,
78
+ first_name:,
79
+ last_name:,
79
80
  phone: auth['phone'],
80
81
  phone_calling_code: auth['phone_calling_code'],
81
82
  auth_provider: 'mobileid' # User::MOBILEID
@@ -85,49 +86,51 @@ module MobileId
85
86
  def session_request(session_id)
86
87
  response = HTTParty.get(url + "/authentication/session/#{session_id}")
87
88
  raise Error, "#{I18n.t('mobile_id.some_error')} #{response.code} #{response}" if response.code != 200
89
+
88
90
  response
89
91
  end
90
92
 
91
93
  def long_poll!(session_id:, doc:)
92
94
  response = nil
93
95
 
94
- # Retries until RUNNING state turns to COMPLETE
95
- 30.times do |i|
96
+ # Retries until RUNNING state turns to COMPLETE
97
+ 30.times do |_i|
96
98
  response = session_request(session_id)
97
99
  break if response['state'] == 'COMPLETE'
100
+
98
101
  sleep 1
99
102
  end
100
103
  raise Error, "#{I18n.t('mobile_id.some_error')} #{response.code} #{response}" if response['state'] != 'COMPLETE'
101
104
 
102
105
  if response['result'] != 'OK'
103
- message =
106
+ message =
104
107
  case response['result']
105
- when "TIMEOUT"
108
+ when 'TIMEOUT'
106
109
  I18n.t('mobile_id.timeout')
107
- when "NOT_MID_CLIENT"
110
+ when 'NOT_MID_CLIENT'
108
111
  I18n.t('mobile_id.user_is_not_mobile_id_client')
109
- when "USER_CANCELLED"
112
+ when 'USER_CANCELLED'
110
113
  I18n.t('mobile_id.user_cancelled')
111
- when "SIGNATURE_HASH_MISMATCH"
114
+ when 'SIGNATURE_HASH_MISMATCH'
112
115
  I18n.t('mobile_id.signature_hash_mismatch')
113
- when "PHONE_ABSENT"
116
+ when 'PHONE_ABSENT'
114
117
  I18n.t('mobile_id.phone_absent')
115
- when "DELIVERY_ERROR"
118
+ when 'DELIVERY_ERROR'
116
119
  I18n.t('mobile_id.delivery_error')
117
- when "SIM_ERROR"
120
+ when 'SIM_ERROR'
118
121
  I18n.t('mobile_id.sim_error')
119
122
  end
120
- raise Error, message
123
+ raise Error, message
121
124
  end
122
125
 
123
- @user_cert = MobileId::Cert.new(response['cert'], live: live)
126
+ @user_cert = MobileId::Cert.new(response['cert'], live:)
124
127
  @user_cert.verify_signature!(response['signature']['value'], doc)
125
128
  self.user_cert = @user_cert
126
129
  end
127
130
 
128
131
  def verification_code
129
- binary = hash.to_s.unpack('B*').first
130
- "%04d" % (binary[0...6] + binary[-7..-1]).to_i(2)
132
+ binary = hash.to_s.unpack1('B*')
133
+ '%04d' % (binary[0...6] + binary[-7..]).to_i(2)
131
134
  end
132
135
 
133
136
  def given_name
@@ -139,7 +142,7 @@ module MobileId
139
142
  user_cert.surname
140
143
  end
141
144
  alias last_name surname
142
-
145
+
143
146
  def country
144
147
  user_cert.country
145
148
  end
@@ -156,5 +159,6 @@ module MobileId
156
159
  user_cert.serial_number
157
160
  end
158
161
  alias personal_code serial_number
162
+
159
163
  end
160
164
  end
@@ -2,49 +2,55 @@
2
2
 
3
3
  module MobileId
4
4
  class Cert
5
+
5
6
  class << self
7
+
6
8
  def root_path
7
9
  @root_path ||= File.expand_path('certs', __dir__)
8
10
  end
9
11
 
10
12
  def live_store
11
- @live_store ||=
13
+ @live_store ||=
12
14
  build_store([
13
- File.join(root_path, 'EE_Certification_Centre_Root_CA.pem.crt'),
14
- File.join(root_path, 'EE-GovCA2018.pem.crt'),
15
- File.join(root_path, 'EID-SK_2011.pem.crt'),
16
- File.join(root_path, 'EID-SK_2016.pem.crt'),
17
- File.join(root_path, 'esteid2018.pem.crt'),
18
- File.join(root_path, 'ESTEID-SK_2011.pem.crt'),
19
- File.join(root_path, 'ESTEID-SK_2015.pem.crt'),
20
- File.join(root_path, 'KLASS3-SK_2010_EECCRCA.pem.crt'),
21
- File.join(root_path, 'KLASS3-SK_2010_EECCRCA_SHA384.pem.crt'),
22
- File.join(root_path, 'KLASS3-SK_2016_EECCRCA_SHA384.pem.crt'),
23
- File.join(root_path, 'KLASS3-SK.pem.crt'),
24
- File.join(root_path, 'NQ-SK_2016.pem.crt')
25
- ])
15
+ File.join(root_path, 'EE_Certification_Centre_Root_CA.pem.crt'),
16
+ File.join(root_path, 'EE-GovCA2018.pem.crt'),
17
+ File.join(root_path, 'EID-SK_2011.pem.crt'),
18
+ File.join(root_path, 'EID-SK_2016.pem.crt'),
19
+ File.join(root_path, 'esteid2018.pem.crt'),
20
+ File.join(root_path, 'ESTEID-SK_2011.pem.crt'),
21
+ File.join(root_path, 'ESTEID-SK_2015.pem.crt'),
22
+ File.join(root_path, 'KLASS3-SK_2010_EECCRCA.pem.crt'),
23
+ File.join(root_path, 'KLASS3-SK_2010_EECCRCA_SHA384.pem.crt'),
24
+ File.join(root_path, 'KLASS3-SK_2016_EECCRCA_SHA384.pem.crt'),
25
+ File.join(root_path, 'KLASS3-SK.pem.crt'),
26
+ File.join(root_path, 'NQ-SK_2016.pem.crt')
27
+ ])
26
28
  end
27
29
 
28
30
  def test_store
29
- @test_store ||=
31
+ @test_store ||=
30
32
  build_store([
31
- File.join(root_path, 'TEST_of_EE_Certification_Centre_Root_CA.pem.crt'),
32
- File.join(root_path, 'TEST_of_ESTEID-SK_2015.pem.crt')
33
- ])
33
+ File.join(root_path, 'TEST_of_EE_Certification_Centre_Root_CA.pem.crt'),
34
+ File.join(root_path, 'TEST_of_ESTEID-SK_2015.pem.crt')
35
+ ])
34
36
  end
35
37
 
36
38
  def build_store(paths)
37
39
  store = OpenSSL::X509::Store.new
38
- paths.each { |path| cert = OpenSSL::X509::Certificate.new(File.read(path)); store.add_cert(cert) }
40
+ paths.each do |path|
41
+ cert = OpenSSL::X509::Certificate.new(File.read(path))
42
+ store.add_cert(cert)
43
+ end
39
44
  store
40
45
  end
46
+
41
47
  end
42
48
 
43
49
  attr_accessor :cert, :subject
44
50
 
45
51
  def initialize(base64_cert, live:)
46
52
  self.cert = OpenSSL::X509::Certificate.new(Base64.decode64(base64_cert))
47
- verify!(self.cert, live: live)
53
+ verify!(cert, live:)
48
54
  build_cert_subject
49
55
  end
50
56
 
@@ -52,11 +58,14 @@ module MobileId
52
58
  if live == true
53
59
  raise Error, 'User certificate is not valid' unless self.class.live_store.verify(cert)
54
60
  else
55
- raise Error, 'User certificate is not valid' unless self.class.test_store.verify(cert) || self.class.live_store.verify(cert)
61
+ unless self.class.test_store.verify(cert) || self.class.live_store.verify(cert)
62
+ raise Error,
63
+ 'User certificate is not valid'
64
+ end
56
65
  end
57
66
 
58
67
  raise Error, 'User certificate is not valid [check_key]' unless cert.public_key.check_key
59
- raise Error, 'User certificate is expired' unless (cert.not_before...cert.not_after) === Time.now
68
+ raise Error, 'User certificate is expired' unless (cert.not_before...cert.not_after).include?(Time.now)
60
69
 
61
70
  true
62
71
  end
@@ -77,49 +86,51 @@ module MobileId
77
86
  end
78
87
 
79
88
  def cvc_to_der(cvc)
80
- sign_hex = cvc.unpack('H*').first
89
+ sign_hex = cvc.unpack1('H*')
81
90
  half = sign_hex.size / 2
82
- i = [OpenSSL::ASN1::Integer.new(sign_hex[0...half].to_i(16)), OpenSSL::ASN1::Integer.new(sign_hex[half..sign_hex.size].to_i(16))]
91
+ i = [OpenSSL::ASN1::Integer.new(sign_hex[0...half].to_i(16)),
92
+ OpenSSL::ASN1::Integer.new(sign_hex[half..sign_hex.size].to_i(16))]
83
93
  seq = OpenSSL::ASN1::Sequence.new(i)
84
94
  seq.to_der
85
95
  end
86
96
 
87
97
  def given_name
88
- subject["GN"].tr(",", " ")
98
+ subject['GN'].tr(',', ' ')
89
99
  end
90
100
  alias first_name given_name
91
101
 
92
102
  def surname
93
- subject["SN"].tr(",", " ")
103
+ subject['SN'].tr(',', ' ')
94
104
  end
95
105
  alias last_name surname
96
-
106
+
97
107
  def country
98
- subject["C"].tr(",", " ")
108
+ subject['C'].tr(',', ' ')
99
109
  end
100
110
 
101
111
  def common_name
102
- subject["CN"]
112
+ subject['CN']
103
113
  end
104
114
 
105
115
  def organizational_unit
106
- subject["OU"]
116
+ subject['OU']
107
117
  end
108
118
 
109
119
  def serial_number
110
- subject["serialNumber"]
120
+ subject['serialNumber']
111
121
  end
112
122
  alias personal_code serial_number
113
123
 
114
124
  private
115
125
 
116
126
  def build_cert_subject
117
- self.subject = cert.subject.to_utf8.split(/(?<!\\)\,+/).each_with_object({}) do |c, result|
118
- next unless c.include?("=")
127
+ self.subject = cert.subject.to_utf8.split(/(?<!\\),+/).each_with_object({}) do |c, result|
128
+ next unless c.include?('=')
119
129
 
120
- key, val = c.split("=")
130
+ key, val = c.split('=')
121
131
  result[key] = val
122
132
  end
123
133
  end
134
+
124
135
  end
125
136
  end
@@ -0,0 +1,10 @@
1
+ lt:
2
+ mobile_id:
3
+ some_error: Įvyko klaida
4
+ timeout: "M-parašo sesija pasibaigė"
5
+ user_is_not_mobile_id_client: Vartotojas nėra m-parašo klientas.
6
+ user_cancelled: Vartotojas nutraukė m-parašo operaciją.
7
+ signature_hash_mismatch: "M-parašo turi problemą. Vartotojas turėtų kreiptis į savo operatorių."
8
+ phone_absent: m-parašo SIM nepasiekiama.
9
+ delivery_error: m-parašo SMS siuntimo klaida.
10
+ sim_error: Neteisingas atsakymas iš m-parašo SIM kortelės
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails'
2
4
 
3
5
  module MobileId
4
- class Railtie < ::Rails::Railtie #:nodoc:
5
- initializer 'mobile_id' do |app|
6
- DeviseI18n::Railtie.instance_eval do
7
- (app.config.i18n.available_locales & MobileId::LOCALES).each do |loc|
8
- I18n.load_path << File.expand_path("locales/#{loc}.yml", __dir__)
9
- end
6
+ class Railtie < ::Rails::Railtie # :nodoc:
7
+
8
+ initializer 'mobile_id' do |_app|
9
+ MobileId::LOCALES.each do |loc|
10
+ I18n.load_path << File.expand_path("locales/#{loc}.yml", __dir__)
10
11
  end
11
12
  end
13
+
12
14
  end
13
15
  end
data/lib/mobile_id.rb CHANGED
@@ -5,16 +5,17 @@ require 'digest'
5
5
  require 'httparty'
6
6
  require 'active_support/core_ext/hash/indifferent_access'
7
7
  require 'i18n'
8
+
8
9
  if defined?(Rails)
9
- require 'mobile_id/railtie'
10
+ require 'mobile_id/railtie'
10
11
  else
11
- I18n.load_path << Dir[File.expand_path("lib/mobile_id/locales") + "/*.yml"]
12
+ I18n.load_path << Dir["#{File.expand_path('lib/mobile_id/locales')}/*.yml"]
12
13
  end
13
14
 
14
15
  module MobileId
15
16
  class Error < StandardError; end
16
17
 
17
- LOCALES = [:en, :et, :ru]
18
+ LOCALES = %i[en et lt ru].freeze
18
19
  end
19
20
 
20
21
  require 'mobile_id/cert'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobile_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Priit Tark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-15 00:00:00.000000000 Z
11
+ date: 2023-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: httparty
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,20 @@ dependencies:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: i18n
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: openssl
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -39,13 +67,13 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: 2.2.0
41
69
  - !ruby/object:Gem::Dependency
42
- name: i18n
70
+ name: pry
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ">="
46
74
  - !ruby/object:Gem::Version
47
75
  version: '0'
48
- type: :runtime
76
+ type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
@@ -53,13 +81,13 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
- name: activesupport
84
+ name: rspec
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
60
88
  - !ruby/object:Gem::Version
61
89
  version: '0'
62
- type: :runtime
90
+ type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
@@ -67,7 +95,7 @@ dependencies:
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
- name: rspec
98
+ name: rubocop
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - ">="
@@ -81,7 +109,7 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: pry
112
+ name: rubocop-rspec
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
@@ -94,8 +122,8 @@ dependencies:
94
122
  - - ">="
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
97
- description: Estonia Mobile ID authentication
98
- email: priit@gitlab.eu
125
+ description: Ruby client for Estonia and Lithuania Mobile ID authentication
126
+ email: priit@domify.io
99
127
  executables: []
100
128
  extensions: []
101
129
  extra_rdoc_files: []
@@ -122,12 +150,15 @@ files:
122
150
  - lib/mobile_id/certs/esteid2018.pem.crt
123
151
  - lib/mobile_id/locales/en.yml
124
152
  - lib/mobile_id/locales/et.yml
153
+ - lib/mobile_id/locales/lt.yml
125
154
  - lib/mobile_id/locales/ru.yml
126
155
  - lib/mobile_id/railtie.rb
127
- homepage: https://github.com/gitlabeu/mobile_id
156
+ homepage: https://github.com/domify/mobile_id
128
157
  licenses:
129
158
  - MIT
130
- metadata: {}
159
+ metadata:
160
+ changelog_uri: https://github.com/domify/mobile_id/blob/main/CHANGELOG.md
161
+ rubygems_mfa_required: 'true'
131
162
  post_install_message:
132
163
  rdoc_options: []
133
164
  require_paths:
@@ -146,5 +177,5 @@ requirements: []
146
177
  rubygems_version: 3.4.10
147
178
  signing_key:
148
179
  specification_version: 4
149
- summary: Estonia Mobile ID authentication
180
+ summary: Estonia and Lithuania Mobile ID authentication
150
181
  test_files: []