mobile_id 0.0.4 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac2213a077be1331007897be4a68ddde6e428cb7b4a0ca712950367d38c5d6c7
4
- data.tar.gz: 7d7736fb27da9413c707b30ea98797a5dcbe05160ff2fc434b802fdf58310645
3
+ metadata.gz: 2bcb3f7e69f425ea215f86a911b42b36fd0bba8012b25491dba9bfe2983f61ae
4
+ data.tar.gz: d322ceae5ef98c798beed98fd1927111a81fee624c667897bc43b5b0bb2ffc30
5
5
  SHA512:
6
- metadata.gz: 3e04950d1fda22037f6e7f5f72bbf1b0f4038632028940e80bb020626efa54b46d94bd1af4f01c99113db5cf6f58fa6f6e2a6578543ef6b85771e6a88ef86487
7
- data.tar.gz: bee3d0498d13db91e956c8daf69df2bd4e3c659be5379e40b1a6a9e1d3e7ddbd5f58c310f01c1bd9ed16f6ee92ee4ed6ea027627f770a7915fedda5a3e198382
6
+ metadata.gz: c3b858ba860c6194f7c52a47d5496835535462ba8ca60570c8eaa5e407de5349fac8dc205fc8a98cb796522cf8b3295a8693e418e7d7078cbd05a10a61105fc6
7
+ data.tar.gz: d3fde770330ab1614f2192d008b9ed202cc65caa06a065bb78833514e52d34c2d2dcfcf44435e6a20a68304df6dc7e309b1beae0af3997fdd08cfc3084c0040f
@@ -1,3 +1,18 @@
1
+ Release 0.0.9
2
+ * Fixed verification code
3
+
4
+ Release 0.0.8
5
+ * Release cleanup
6
+
7
+ Release 0.0.7
8
+ * Cert cleanup
9
+
10
+ Release 0.0.6
11
+ * Cert path fix
12
+
13
+ Release 0.0.5
14
+ * Added user certificate validation
15
+
1
16
  Release 0.0.4
2
17
  * Refactored MobileId to MobileId::Auth
3
18
 
data/README.md CHANGED
@@ -109,12 +109,18 @@ end
109
109
 
110
110
  After checking out the repo, run `bundle` to install dependencies. For testing code, run `rspec`
111
111
 
112
+ ## Contributors
113
+
114
+ * Priit Tark
115
+ * Andri Möll for pointing out user signature issue
116
+
112
117
  ## Contributing
113
118
 
114
119
  Bug reports and pull requests are welcome on GitHub at https://github.com/gitlabeu/mobile_id
115
120
 
116
121
  ## Roadmap
117
122
 
123
+ * Auth signature validation
118
124
  * Document sign
119
125
  * Rails generators
120
126
 
@@ -17,4 +17,5 @@ module MobileId
17
17
  LOCALES = [:en, :et, :ru]
18
18
  end
19
19
 
20
+ require 'mobile_id/cert'
20
21
  require 'mobile_id/auth'
@@ -9,13 +9,19 @@ module MobileId
9
9
  TEST_UUID = "00000000-0000-0000-0000-000000000000"
10
10
  TEST_NAME = "DEMO"
11
11
 
12
- attr_accessor :url, :uuid, :name, :hash, :cert, :cert_subject
12
+ attr_accessor :url, :uuid, :name, :doc, :hash, :user_cert, :live
13
13
 
14
14
  def initialize(live:, uuid: nil, name: nil)
15
15
  self.url = live == true ? LIVE_URL : TEST_URL
16
16
  self.uuid = live == true ? uuid : TEST_UUID
17
17
  self.name = live == true ? name : TEST_NAME
18
- self.hash = Digest::SHA256.base64digest(SecureRandom.uuid)
18
+ self.live = live
19
+ init_doc(SecureRandom.hex(40))
20
+ end
21
+
22
+ def init_doc(doc)
23
+ self.doc = doc
24
+ self.hash = Digest::SHA256.digest(doc)
19
25
  end
20
26
 
21
27
  def authenticate!(phone_calling_code: nil, phone:, personal_code:, language: nil, display_text: nil)
@@ -44,7 +50,7 @@ module MobileId
44
50
  relyingPartyName: name,
45
51
  phoneNumber: full_phone.to_s.strip,
46
52
  nationalIdentityNumber: personal_code.to_s.strip,
47
- hash: hash,
53
+ hash: Base64.strict_encode64(hash),
48
54
  hashType: 'SHA256',
49
55
  language: language,
50
56
  displayText: display_text,
@@ -58,12 +64,13 @@ module MobileId
58
64
  ActiveSupport::HashWithIndifferentAccess.new(
59
65
  session_id: response['sessionID'],
60
66
  phone: phone,
61
- phone_calling_code: phone_calling_code
67
+ phone_calling_code: phone_calling_code,
68
+ doc: doc
62
69
  )
63
70
  end
64
71
 
65
72
  def verify!(auth)
66
- long_poll!(session_id: auth['session_id'])
73
+ long_poll!(session_id: auth['session_id'], doc: auth['doc'])
67
74
 
68
75
  ActiveSupport::HashWithIndifferentAccess.new(
69
76
  personal_code: personal_code,
@@ -75,7 +82,7 @@ module MobileId
75
82
  )
76
83
  end
77
84
 
78
- def long_poll!(session_id:)
85
+ def long_poll!(session_id:, doc:)
79
86
  response = HTTParty.get(url + "/authentication/session/#{session_id}")
80
87
  raise Error, "#{I18n.t('mobile_id.some_error')} #{response.code} #{response}" if response.code != 200
81
88
 
@@ -100,51 +107,41 @@ module MobileId
100
107
  raise Error, message
101
108
  end
102
109
 
103
- self.cert = OpenSSL::X509::Certificate.new(Base64.decode64(response['cert']))
104
- self.cert_subject = build_cert_subject
105
- cert
110
+ @user_cert = MobileId::Cert.new(response['cert'], live: live)
111
+ @user_cert.verify_signature!(response['signature']['value'], doc)
112
+ self.user_cert = @user_cert
106
113
  end
107
114
 
108
115
  def verification_code
109
- format("%04d", (Digest::SHA2.new(256).digest(Base64.decode64(hash))[-2..-1].unpack1('n') % 10000))
116
+ binary = hash.unpack('B*').first
117
+ "%04d" % (binary[0...6] + binary[-7..-1]).to_i(2)
110
118
  end
111
119
 
112
120
  def given_name
113
- cert_subject["GN"].tr(",", " ")
121
+ user_cert.given_name
114
122
  end
115
123
  alias first_name given_name
116
124
 
117
125
  def surname
118
- cert_subject["SN"].tr(",", " ")
126
+ user_cert.surname
119
127
  end
120
128
  alias last_name surname
121
129
 
122
130
  def country
123
- cert_subject["C"].tr(",", " ")
131
+ user_cert.country
124
132
  end
125
133
 
126
134
  def common_name
127
- cert_subject["CN"]
135
+ user_cert.common_name
128
136
  end
129
137
 
130
138
  def organizational_unit
131
- cert_subject["OU"]
139
+ user_cert.organizational_unit
132
140
  end
133
141
 
134
142
  def serial_number
135
- cert_subject["serialNumber"]
143
+ user_cert.serial_number
136
144
  end
137
145
  alias personal_code serial_number
138
-
139
- private
140
-
141
- def build_cert_subject
142
- self.cert_subject = cert.subject.to_utf8.split(/(?<!\\)\,+/).each_with_object({}) do |c, result|
143
- next unless c.include?("=")
144
-
145
- key, val = c.split("=")
146
- result[key] = val
147
- end
148
- end
149
146
  end
150
147
  end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MobileId
4
+ class Cert
5
+ class << self
6
+ def root_path
7
+ @root_path ||= File.expand_path('certs', __dir__)
8
+ end
9
+
10
+ def live_store
11
+ @live_store ||=
12
+ build_store([
13
+ File.join(root_path, 'EE_Certification_Centre_Root_CA.pem.crt'),
14
+ File.join(root_path, 'ESTEID-SK_2015.pem.crt')
15
+ ])
16
+ end
17
+
18
+ def test_store
19
+ @test_store ||=
20
+ build_store([
21
+ File.join(root_path, 'TEST_of_EE_Certification_Centre_Root_CA.pem.crt'),
22
+ File.join(root_path, 'TEST_of_ESTEID-SK_2015.pem.crt')
23
+ ])
24
+ end
25
+
26
+ def build_store(paths)
27
+ store = OpenSSL::X509::Store.new
28
+ paths.each { |path| cert = OpenSSL::X509::Certificate.new(File.read(path)); store.add_cert(cert) }
29
+ store
30
+ end
31
+ end
32
+
33
+ attr_accessor :cert, :subject
34
+
35
+ def initialize(base64_cert, live:)
36
+ self.cert = OpenSSL::X509::Certificate.new(Base64.decode64(base64_cert))
37
+ verify!(self.cert, live: live)
38
+ build_cert_subject
39
+ end
40
+
41
+ def verify!(cert, live:)
42
+ store = live == true ? self.class.live_store : self.class.test_store
43
+ raise Error, 'User certificate is not valid' unless store.verify(cert)
44
+ raise Error, 'User certificate is not valid' unless cert.public_key.check_key
45
+ raise Error, 'User certificate is expired' unless (cert.not_before..cert.not_after) === Time.now
46
+
47
+ true
48
+ end
49
+
50
+ def verify_signature!(signature_base64, doc)
51
+ signature = Base64.decode64(signature_base64)
52
+ digest = OpenSSL::Digest::SHA256.new(doc)
53
+
54
+ # cert.public_key.verify(digest, signature, doc)
55
+
56
+ # TODO OpenSSL does not parse signature correctly
57
+ # OpenSSL::PKey::PKeyError: EVP_VerifyFinal: nested asn1 error
58
+ end
59
+
60
+ def given_name
61
+ subject["GN"].tr(",", " ")
62
+ end
63
+ alias first_name given_name
64
+
65
+ def surname
66
+ subject["SN"].tr(",", " ")
67
+ end
68
+ alias last_name surname
69
+
70
+ def country
71
+ subject["C"].tr(",", " ")
72
+ end
73
+
74
+ def common_name
75
+ subject["CN"]
76
+ end
77
+
78
+ def organizational_unit
79
+ subject["OU"]
80
+ end
81
+
82
+ def serial_number
83
+ subject["serialNumber"]
84
+ end
85
+ alias personal_code serial_number
86
+
87
+ private
88
+
89
+ def build_cert_subject
90
+ self.subject = cert.subject.to_utf8.split(/(?<!\\)\,+/).each_with_object({}) do |c, result|
91
+ next unless c.include?("=")
92
+
93
+ key, val = c.split("=")
94
+ result[key] = val
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
3
+ MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
4
+ czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
5
+ CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
6
+ MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
7
+ ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
8
+ b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
9
+ AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
10
+ euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
11
+ bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
12
+ WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
13
+ MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
14
+ 1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
15
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
16
+ zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
17
+ BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
18
+ BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
19
+ v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
20
+ E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
21
+ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
22
+ iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
23
+ GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGcDCCBVigAwIBAgIQRUgJC4ec7yFWcqzT3mwbWzANBgkqhkiG9w0BAQwFADB1
3
+ MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
4
+ czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
5
+ CSqGSIb3DQEJARYJcGtpQHNrLmVlMCAXDTE1MTIxNzEyMzg0M1oYDzIwMzAxMjE3
6
+ MjM1OTU5WjBjMQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVy
7
+ aW1pc2tlc2t1czEXMBUGA1UEYQwOTlRSRUUtMTA3NDcwMTMxFzAVBgNVBAMMDkVT
8
+ VEVJRC1TSyAyMDE1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0oH6
9
+ 1NDxbdW9k8nLA1qGaL4B7vydod2Ewp/STBZB3wEtIJCLdkpEsS8pXfFiRqwDVsgG
10
+ Gbu+Q99trlb5LI7yi7rIkRov5NftBdSNPSU5rAhYPQhvZZQgOwRaHa5Ey+BaLJHm
11
+ LqYQS9hQvQsCYyws+xVvNFUpK0pGD64iycqdMuBl/nWq3fLuZppwBh0VFltm4nhr
12
+ /1S0R9TRJpqFUGbGr4OK/DwebQ5PjhdS40gCUNwmC7fPQ4vIH+x+TCk2aG+u3MoA
13
+ z0IrpVWqiwzG/vxreuPPAkgXeFCeYf6fXLsGz4WivsZFbph2pMjELu6sltlBXfAG
14
+ 3fGv43t91VXicyzR/eT5dsB+zFsW1sHV+1ONPr+qzgDxCH2cmuqoZNfIIq+buob3
15
+ eA8ee+XpJKJQr+1qGrmhggjvAhc7m6cU4x/QfxwRYhIVNhJf+sKVThkQhbJ9XxuK
16
+ k3c18wymwL1mpDD0PIGJqlssMeiuJ4IzagFbgESGNDUd4icm0hQT8CmQeUm1GbWe
17
+ BYseqPhMQX97QFBLXJLVy2SCyoAz7Bq1qA43++EcibN+yBc1nQs2Zoq8ck9MK0bC
18
+ xDMeUkQUz6VeQGp69ImOQrsw46qTz0mtdQrMSbnkXCuLan5dPm284J9HmaqiYi6j
19
+ 6KLcZ2NkUnDQFesBVlMEm+fHa2iR6lnAFYZ06UECAwEAAaOCAgowggIGMB8GA1Ud
20
+ IwQYMBaAFBLyWj7qVhy/zQas8fElyalL1BSZMB0GA1UdDgQWBBSzq4i8mdVipIUq
21
+ CM20HXI7g3JHUTAOBgNVHQ8BAf8EBAMCAQYwdwYDVR0gBHAwbjAIBgYEAI96AQIw
22
+ CQYHBACL7EABAjAwBgkrBgEEAc4fAQEwIzAhBggrBgEFBQcCARYVaHR0cHM6Ly93
23
+ d3cuc2suZWUvQ1BTMAsGCSsGAQQBzh8BAjALBgkrBgEEAc4fAQMwCwYJKwYBBAHO
24
+ HwEEMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYDVR0eBDowOKE2MASCAiIiMAqHCAAA
25
+ AAAAAAAAMCKHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCcGA1Ud
26
+ JQQgMB4GCCsGAQUFBwMJBggrBgEFBQcDAgYIKwYBBQUHAwQwfAYIKwYBBQUHAQEE
27
+ cDBuMCAGCCsGAQUFBzABhhRodHRwOi8vb2NzcC5zay5lZS9DQTBKBggrBgEFBQcw
28
+ AoY+aHR0cDovL3d3dy5zay5lZS9jZXJ0cy9FRV9DZXJ0aWZpY2F0aW9uX0NlbnRy
29
+ ZV9Sb290X0NBLmRlci5jcnQwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL3d3dy5z
30
+ ay5lZS9yZXBvc2l0b3J5L2NybHMvZWVjY3JjYS5jcmwwDQYJKoZIhvcNAQEMBQAD
31
+ ggEBAHRWDGI3P00r2sOnlvLHKk9eE7X93eT+4e5TeaQsOpE5zQRUTtshxN8Bnx2T
32
+ oQ9rgi18q+MwXm2f0mrGakYYG0bix7ZgDQvCMD/kuRYmwLGdfsTXwh8KuL6uSHF+
33
+ U/ZTss6qG7mxCHG9YvebkN5Yj/rYRvZ9/uJ9rieByxw4wo7b19p22PXkAkXP5y3+
34
+ qK/Oet98lqwI97kJhiS2zxFYRk+dXbazmoVHnozYKmsZaSUvoYNNH19tpS7BLdsg
35
+ i9KpbvQLb5ywIMq9ut3+b2Xvzq8yzmHMFtLIJ6Afu1jJpqD82BUAFcvi5vhnP8M7
36
+ b974R18WCOpgNQvXDI+2/8ZINeU=
37
+ -----END CERTIFICATE-----
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEEzCCAvugAwIBAgIQc/jtqiMEFERMtVvsSsH7sjANBgkqhkiG9w0BAQUFADB9
3
+ MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
4
+ czEwMC4GA1UEAwwnVEVTVCBvZiBFRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290
5
+ IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwIhgPMjAxMDEwMDcxMjM0NTZa
6
+ GA8yMDMwMTIxNzIzNTk1OVowfTELMAkGA1UEBhMCRUUxIjAgBgNVBAoMGUFTIFNl
7
+ cnRpZml0c2VlcmltaXNrZXNrdXMxMDAuBgNVBAMMJ1RFU1Qgb2YgRUUgQ2VydGlm
8
+ aWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVl
9
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1gGpqCtDmNNEHUjC8LXq
10
+ xRdC1kpjDgkzOTxQynzDxw/xCjy5hhyG3xX4RPrW9Z6k5ZNTNS+xzrZgQ9m5U6uM
11
+ ywYpx3F3DVgbdQLd8DsLmuVOz02k/TwoRt1uP6xtV9qG0HsGvN81q3HvPR/zKtA7
12
+ MmNZuwuDFQwsguKgDR2Jfk44eKmLfyzvh+Xe6Cr5+zRnsVYwMA9bgBaOZMv1TwTT
13
+ VNi9H1ltK32Z+IhUX8W5f2qVP33R1wWCKapK1qTX/baXFsBJj++F8I8R6+gSyC3D
14
+ kV5N/pOlWPzZYx+kHRkRe/oddURA9InJwojbnsH+zJOa2VrNKakNv2HnuYCIonzu
15
+ pwIDAQABo4GKMIGHMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
16
+ A1UdDgQWBBS1NAqdpS8QxechDr7EsWVHGwN2/jBFBgNVHSUEPjA8BggrBgEFBQcD
17
+ AgYIKwYBBQUHAwEGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwgGCCsGAQUF
18
+ BwMJMA0GCSqGSIb3DQEBBQUAA4IBAQAj72VtxIw6p5lqeNmWoQ48j8HnUBM+6mI0
19
+ I+VkQr0EfQhfmQ5KFaZwnIqxWrEPaxRjYwV0xKa1AixVpFOb1j+XuVmgf7khxXTy
20
+ Bmd8JRLwl7teCkD1SDnU/yHmwY7MV9FbFBd+5XK4teHVvEVRsJ1oFwgcxVhyoviR
21
+ SnbIPaOvk+0nxKClrlS6NW5TWZ+yG55z8OCESHaL6JcimkLFjRjSsQDWIEtDvP4S
22
+ tH3vIMUPPiKdiNkGjVLSdChwkW3z+m0EvAjyD9rnGCmjeEm5diLFu7VMNVqupsbZ
23
+ SfDzzBLc5+6TqgQTOG7GaZk2diMkn03iLdHGFrh8ML+mXG9SjEPI
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGgzCCBWugAwIBAgIQEDb9gCZi4PdWc7IoNVIbsTANBgkqhkiG9w0BAQwFADB9
3
+ MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
4
+ czEwMC4GA1UEAwwnVEVTVCBvZiBFRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290
5
+ IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwIBcNMTUxMjE4MDcxMzQ0WhgP
6
+ MjAzMDEyMTcyMzU5NTlaMGsxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0
7
+ aWZpdHNlZXJpbWlza2Vza3VzMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEfMB0G
8
+ A1UEAwwWVEVTVCBvZiBFU1RFSUQtU0sgMjAxNTCCAiIwDQYJKoZIhvcNAQEBBQAD
9
+ ggIPADCCAgoCggIBAMTeAFvLxmAeaOsRKaf+hlkOhW+CdEilmUIKWs+qCWVq+w8E
10
+ 8PA/TohAZdUcO4KFXothmPDmfOCb0ExXcnOPCr2NndavzB39htlyYKYxkOkZi3pL
11
+ z8bZg/HvpBoy8KIg0sYdbhVPYHf6i7fuJjDac4zN1vKdVQXA6Tv5wS/e90/ZyF95
12
+ 5vycxdNLticdozm5yCDMNgsEji6QNA1zIi3+C2YmnDXx6VyxhuC2R3q0xNkwtJ4e
13
+ zs1RZGxWokTNPzQc3ilGhEJlVsS8vP624hUHwufQnwrKWpc3+D+plMIO0j3E+hmh
14
+ 46gIadDRweFR/dzb+CIBHRaFh0LEBjd/cDFQlBI+E8vpkhqeWp6rp1xwnhCL201M
15
+ 3E1E1Mw+51Xqj7WOfY0TzjOmQJy8WJPEwU2m44KxW1SnpeEBVkgb4XYFeQHAllc7
16
+ J7JDv50BoIPpecgaqn1vKR7l//wDsL0MN1tDlBhl3x7TJ/fwMnwB1E3zVZR74TUZ
17
+ h5J49CAcFrfM4RmP/0hcDW8+4wNWMg2Qgst2qmPZmHCI/OJt5yMt0Ud5yPF8AWxV
18
+ ot3TxOBGjMiM8m6WsksFsQxp5WtA0DANGXIIfydTaTV16Mg+KpYVqFKxkvFBmfVp
19
+ 6xApMaFl3dY/m56O9JHEqFpBDF+uDQIMjFJxJ4Pt7Mdk40zfL4PSw9Qco2T3AgMB
20
+ AAGjggINMIICCTAfBgNVHSMEGDAWgBS1NAqdpS8QxechDr7EsWVHGwN2/jAdBgNV
21
+ HQ4EFgQUScDyRDll1ZtGOw04YIOx1i0ohqYwDgYDVR0PAQH/BAQDAgEGMGYGA1Ud
22
+ IARfMF0wMQYKKwYBBAHOHwMBATAjMCEGCCsGAQUFBwIBFhVodHRwczovL3d3dy5z
23
+ ay5lZS9DUFMwDAYKKwYBBAHOHwMBAjAMBgorBgEEAc4fAwEDMAwGCisGAQQBzh8D
24
+ AQQwEgYDVR0TAQH/BAgwBgEB/wIBADBBBgNVHR4EOjA4oTYwBIICIiIwCocIAAAA
25
+ AAAAAAAwIocgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwJwYDVR0l
26
+ BCAwHgYIKwYBBQUHAwkGCCsGAQUFBwMCBggrBgEFBQcDBDCBiQYIKwYBBQUHAQEE
27
+ fTB7MCUGCCsGAQUFBzABhhlodHRwOi8vZGVtby5zay5lZS9jYV9vY3NwMFIGCCsG
28
+ AQUFBzAChkZodHRwOi8vd3d3LnNrLmVlL2NlcnRzL1RFU1Rfb2ZfRUVfQ2VydGlm
29
+ aWNhdGlvbl9DZW50cmVfUm9vdF9DQS5kZXIuY3J0MEMGA1UdHwQ8MDowOKA2oDSG
30
+ Mmh0dHBzOi8vd3d3LnNrLmVlL3JlcG9zaXRvcnkvY3Jscy90ZXN0X2VlY2NyY2Eu
31
+ Y3JsMA0GCSqGSIb3DQEBDAUAA4IBAQDBOYTpbbQuoJKAmtDPpAomDd9mKZCarIPx
32
+ AH8UXphSndMqOmIUA4oQMrLcZ6a0rMyCFR8x4NX7abc8T81cvgUAWjfNFn8+bi6+
33
+ DgbjhYY+wZ010MHHdUo2xPajfog8cDWJPkmz+9PAdyjzhb1eYoEnm5D6o4hZQCiR
34
+ yPnOKp7LZcpsVz1IFXsqP7M5WgHk0SqY1vs+Yhu7zWPSNYFIzNNXGoUtfKhhkHiR
35
+ WFX/wdzr3fqeaQ3gs/PyD53YuJXRzFrktgJJoJWnHEYIhEwbai9+OeKr4L4kTkxv
36
+ PKTyjjpLKcjUk0Y0cxg7BuzwevonyBtL72b/FVs6XsXJJqCa3W4T
37
+ -----END CERTIFICATE-----
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobile_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Priit Tark
@@ -105,6 +105,11 @@ files:
105
105
  - README.md
106
106
  - lib/mobile_id.rb
107
107
  - lib/mobile_id/auth.rb
108
+ - lib/mobile_id/cert.rb
109
+ - lib/mobile_id/certs/EE_Certification_Centre_Root_CA.pem.crt
110
+ - lib/mobile_id/certs/ESTEID-SK_2015.pem.crt
111
+ - lib/mobile_id/certs/TEST_of_EE_Certification_Centre_Root_CA.pem.crt
112
+ - lib/mobile_id/certs/TEST_of_ESTEID-SK_2015.pem.crt
108
113
  - lib/mobile_id/locales/en.yml
109
114
  - lib/mobile_id/locales/et.yml
110
115
  - lib/mobile_id/locales/ru.yml