webauthn 3.0.0.alpha1 → 3.0.0.alpha2

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +31 -0
  3. data/.github/workflows/git.yml +21 -0
  4. data/.rubocop.yml +57 -1
  5. data/CHANGELOG.md +63 -1
  6. data/README.md +5 -2
  7. data/SECURITY.md +6 -3
  8. data/docs/advanced_configuration.md +174 -0
  9. data/docs/u2f_migration.md +3 -2
  10. data/lib/cose/rsapkcs1_algorithm.rb +7 -0
  11. data/lib/webauthn/attestation_statement/android_key.rb +0 -4
  12. data/lib/webauthn/attestation_statement/android_safetynet.rb +1 -5
  13. data/lib/webauthn/attestation_statement/apple.rb +65 -0
  14. data/lib/webauthn/attestation_statement/base.rb +11 -22
  15. data/lib/webauthn/attestation_statement/none.rb +7 -1
  16. data/lib/webauthn/attestation_statement/packed.rb +1 -1
  17. data/lib/webauthn/attestation_statement/tpm.rb +2 -2
  18. data/lib/webauthn/attestation_statement.rb +4 -1
  19. data/lib/webauthn/authenticator_data/attested_credential_data.rb +2 -3
  20. data/lib/webauthn/authenticator_response.rb +1 -2
  21. data/lib/webauthn/credential_creation_options.rb +2 -0
  22. data/lib/webauthn/credential_request_options.rb +2 -0
  23. data/lib/webauthn/fake_authenticator/authenticator_data.rb +1 -1
  24. data/lib/webauthn/fake_authenticator.rb +11 -3
  25. data/lib/webauthn/fake_client.rb +10 -3
  26. data/lib/webauthn/public_key_credential/entity.rb +3 -4
  27. data/lib/webauthn/relying_party.rb +2 -2
  28. data/lib/webauthn/u2f_migrator.rb +4 -1
  29. data/lib/webauthn/version.rb +1 -1
  30. data/webauthn.gemspec +7 -8
  31. metadata +45 -59
  32. data/.travis.yml +0 -39
  33. data/Appraisals +0 -21
  34. data/gemfiles/cose_head.gemfile +0 -7
  35. data/gemfiles/openssl_2_0.gemfile +0 -7
  36. data/gemfiles/openssl_2_1.gemfile +0 -7
  37. data/gemfiles/openssl_2_2.gemfile +0 -7
  38. data/gemfiles/openssl_head.gemfile +0 -7
  39. data/lib/webauthn/security_utils.rb +0 -20
  40. data/script/ci/install-openssl +0 -7
  41. data/script/ci/install-ruby +0 -13
@@ -6,12 +6,18 @@ module WebAuthn
6
6
  module AttestationStatement
7
7
  class None < Base
8
8
  def valid?(*_args)
9
- if statement == {}
9
+ if statement == {} && trustworthy?
10
10
  [WebAuthn::AttestationStatement::ATTESTATION_TYPE_NONE, nil]
11
11
  else
12
12
  false
13
13
  end
14
14
  end
15
+
16
+ private
17
+
18
+ def attestation_type
19
+ WebAuthn::AttestationStatement::ATTESTATION_TYPE_NONE
20
+ end
15
21
  end
16
22
  end
17
23
  end
@@ -46,7 +46,7 @@ module WebAuthn
46
46
 
47
47
  attestation_certificate.version == 2 &&
48
48
  subject.assoc('OU')&.at(1) == "Authenticator Attestation" &&
49
- attestation_certificate.extensions.find { |ext| ext.oid == 'basicConstraints' }&.value == 'CA:FALSE'
49
+ attestation_certificate.find_extension('basicConstraints')&.value == 'CA:FALSE'
50
50
  else
51
51
  true
52
52
  end
@@ -42,7 +42,7 @@ module WebAuthn
42
42
  OpenSSL::Digest.digest(cose_algorithm.hash_function, certified_extra_data),
43
43
  signature_algorithm: tpm_algorithm[:signature],
44
44
  hash_algorithm: tpm_algorithm[:hash],
45
- root_certificates: root_certificates(aaguid: aaguid)
45
+ trusted_certificates: root_certificates(aaguid: aaguid)
46
46
  )
47
47
 
48
48
  key_attestation.valid? && key_attestation.key && key_attestation.key.to_pem == key.to_pem
@@ -54,7 +54,7 @@ module WebAuthn
54
54
  end
55
55
 
56
56
  def default_root_certificates
57
- ::TPM::KeyAttestation::ROOT_CERTIFICATES
57
+ ::TPM::KeyAttestation::TRUSTED_CERTIFICATES
58
58
  end
59
59
 
60
60
  def tpm_algorithm
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "webauthn/attestation_statement/android_key"
4
4
  require "webauthn/attestation_statement/android_safetynet"
5
+ require "webauthn/attestation_statement/apple"
5
6
  require "webauthn/attestation_statement/fido_u2f"
6
7
  require "webauthn/attestation_statement/none"
7
8
  require "webauthn/attestation_statement/packed"
@@ -18,6 +19,7 @@ module WebAuthn
18
19
  ATTESTATION_FORMAT_ANDROID_SAFETYNET = "android-safetynet"
19
20
  ATTESTATION_FORMAT_ANDROID_KEY = "android-key"
20
21
  ATTESTATION_FORMAT_TPM = "tpm"
22
+ ATTESTATION_FORMAT_APPLE = "apple"
21
23
 
22
24
  FORMAT_TO_CLASS = {
23
25
  ATTESTATION_FORMAT_NONE => WebAuthn::AttestationStatement::None,
@@ -25,7 +27,8 @@ module WebAuthn
25
27
  ATTESTATION_FORMAT_PACKED => WebAuthn::AttestationStatement::Packed,
26
28
  ATTESTATION_FORMAT_ANDROID_SAFETYNET => WebAuthn::AttestationStatement::AndroidSafetynet,
27
29
  ATTESTATION_FORMAT_ANDROID_KEY => WebAuthn::AttestationStatement::AndroidKey,
28
- ATTESTATION_FORMAT_TPM => WebAuthn::AttestationStatement::TPM
30
+ ATTESTATION_FORMAT_TPM => WebAuthn::AttestationStatement::TPM,
31
+ ATTESTATION_FORMAT_APPLE => WebAuthn::AttestationStatement::Apple
29
32
  }.freeze
30
33
 
31
34
  def self.from(format, statement, relying_party: WebAuthn.configuration.relying_party)
@@ -22,9 +22,8 @@ module WebAuthn
22
22
  count_bytes_remaining :trailing_bytes_length
23
23
  string :trailing_bytes, length: :trailing_bytes_length
24
24
 
25
- # TODO: use keyword_init when we dropped Ruby 2.4 support
26
25
  Credential =
27
- Struct.new(:id, :public_key, :algorithm) do
26
+ Struct.new(:id, :public_key, :algorithm, keyword_init: true) do
28
27
  def public_key_object
29
28
  COSE::Key.deserialize(public_key).to_pkey
30
29
  end
@@ -47,7 +46,7 @@ module WebAuthn
47
46
  def credential
48
47
  @credential ||=
49
48
  if valid?
50
- Credential.new(id, public_key, algorithm)
49
+ Credential.new(id: id, public_key: public_key, algorithm: algorithm)
51
50
  end
52
51
  end
53
52
 
@@ -3,7 +3,6 @@
3
3
  require "webauthn/authenticator_data"
4
4
  require "webauthn/client_data"
5
5
  require "webauthn/error"
6
- require "webauthn/security_utils"
7
6
 
8
7
  module WebAuthn
9
8
  TYPES = { create: "webauthn.create", get: "webauthn.get" }.freeze
@@ -80,7 +79,7 @@ module WebAuthn
80
79
  end
81
80
 
82
81
  def valid_challenge?(expected_challenge)
83
- WebAuthn::SecurityUtils.secure_compare(client_data.challenge, expected_challenge)
82
+ OpenSSL.secure_compare(client_data.challenge, expected_challenge)
84
83
  end
85
84
 
86
85
  def valid_origin?(expected_origin)
@@ -32,6 +32,8 @@ module WebAuthn
32
32
  user_display_name: nil,
33
33
  rp_name: nil
34
34
  )
35
+ super()
36
+
35
37
  @attestation = attestation
36
38
  @authenticator_selection = authenticator_selection
37
39
  @exclude_credentials = exclude_credentials
@@ -16,6 +16,8 @@ module WebAuthn
16
16
  attr_accessor :allow_credentials, :extensions, :user_verification
17
17
 
18
18
  def initialize(allow_credentials: [], extensions: nil, user_verification: nil)
19
+ super()
20
+
19
21
  @allow_credentials = allow_credentials
20
22
  @extensions = extensions
21
23
  @user_verification = user_verification
@@ -15,7 +15,7 @@ module WebAuthn
15
15
  rp_id_hash:,
16
16
  credential: {
17
17
  id: SecureRandom.random_bytes(16),
18
- public_key: OpenSSL::PKey::EC.new("prime256v1").generate_key.public_key
18
+ public_key: OpenSSL::PKey::EC.generate("prime256v1").public_key
19
19
  },
20
20
  sign_count: 0,
21
21
  user_present: true,
@@ -50,12 +50,20 @@ module WebAuthn
50
50
  user_verified: false,
51
51
  aaguid: AuthenticatorData::AAGUID,
52
52
  sign_count: nil,
53
- extensions: nil
53
+ extensions: nil,
54
+ allow_credentials: nil
54
55
  )
55
56
  credential_options = credentials[rp_id]
56
57
 
57
58
  if credential_options
58
- credential_id, credential = credential_options.first
59
+ allow_credentials ||= credential_options.keys
60
+ credential_id = (credential_options.keys & allow_credentials).first
61
+ unless credential_id
62
+ raise "No matching credentials (allowed=#{allow_credentials}) " \
63
+ "found for RP #{rp_id} among credentials=#{credential_options}"
64
+ end
65
+
66
+ credential = credential_options[credential_id]
59
67
  credential_key = credential[:credential_key]
60
68
  credential_sign_count = credential[:sign_count]
61
69
 
@@ -87,7 +95,7 @@ module WebAuthn
87
95
  attr_reader :credentials
88
96
 
89
97
  def new_credential
90
- [SecureRandom.random_bytes(16), OpenSSL::PKey::EC.new("prime256v1").generate_key, 0]
98
+ [SecureRandom.random_bytes(16), OpenSSL::PKey::EC.generate("prime256v1"), 0]
91
99
  end
92
100
 
93
101
  def hashed(target)
@@ -73,19 +73,26 @@ module WebAuthn
73
73
  user_present: true,
74
74
  user_verified: false,
75
75
  sign_count: nil,
76
- extensions: nil)
76
+ extensions: nil,
77
+ user_handle: nil,
78
+ allow_credentials: nil)
77
79
  rp_id ||= URI.parse(origin).host
78
80
 
79
81
  client_data_json = data_json_for(:get, encoder.decode(challenge))
80
82
  client_data_hash = hashed(client_data_json)
81
83
 
84
+ if allow_credentials
85
+ allow_credentials = allow_credentials.map { |credential| encoder.decode(credential) }
86
+ end
87
+
82
88
  assertion = authenticator.get_assertion(
83
89
  rp_id: rp_id,
84
90
  client_data_hash: client_data_hash,
85
91
  user_present: user_present,
86
92
  user_verified: user_verified,
87
93
  sign_count: sign_count,
88
- extensions: extensions
94
+ extensions: extensions,
95
+ allow_credentials: allow_credentials
89
96
  )
90
97
 
91
98
  {
@@ -97,7 +104,7 @@ module WebAuthn
97
104
  "clientDataJSON" => encoder.encode(client_data_json),
98
105
  "authenticatorData" => encoder.encode(assertion[:authenticator_data]),
99
106
  "signature" => encoder.encode(assertion[:signature]),
100
- "userHandle" => nil
107
+ "userHandle" => user_handle ? encoder.encode(user_handle) : nil
101
108
  }
102
109
  }
103
110
  end
@@ -5,11 +5,10 @@ require "awrence"
5
5
  module WebAuthn
6
6
  class PublicKeyCredential
7
7
  class Entity
8
- attr_reader :name, :icon
8
+ attr_reader :name
9
9
 
10
- def initialize(name:, icon: nil)
10
+ def initialize(name:)
11
11
  @name = name
12
- @icon = icon
13
12
  end
14
13
 
15
14
  def as_json
@@ -37,7 +36,7 @@ module WebAuthn
37
36
  end
38
37
 
39
38
  def attributes
40
- [:name, :icon]
39
+ [:name]
41
40
  end
42
41
  end
43
42
  end
@@ -13,7 +13,7 @@ module WebAuthn
13
13
  OpenSSL::PKey::RSA.instance_methods.include?(:verify_pss) ? algorithm : nil
14
14
  end
15
15
 
16
- DEFAULT_ALGORITHMS = ["ES256", if_pss_supported("PS256"), "RS256"].compact.freeze
16
+ DEFAULT_ALGORITHMS = ["ES256", "PS256", "RS256"].compact.freeze
17
17
 
18
18
  def initialize(
19
19
  algorithms: DEFAULT_ALGORITHMS.dup,
@@ -24,7 +24,7 @@ module WebAuthn
24
24
  verify_attestation_statement: true,
25
25
  credential_options_timeout: 120000,
26
26
  silent_authentication: false,
27
- acceptable_attestation_types: ['None', 'Self', 'Basic', 'AttCA', 'Basic_or_AttCA'],
27
+ acceptable_attestation_types: ['None', 'Self', 'Basic', 'AttCA', 'Basic_or_AttCA', 'AnonCA'],
28
28
  attestation_root_certificates_finders: []
29
29
  )
30
30
  @algorithms = algorithms
@@ -31,7 +31,10 @@ module WebAuthn
31
31
  @credential ||=
32
32
  begin
33
33
  hash = authenticator_data.send(:credential)
34
- WebAuthn::AuthenticatorData::AttestedCredentialData::Credential.new(hash[:id], hash[:public_key].serialize)
34
+ WebAuthn::AuthenticatorData::AttestedCredentialData::Credential.new(
35
+ id: hash[:id],
36
+ public_key: hash[:public_key].serialize
37
+ )
35
38
  end
36
39
  end
37
40
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebAuthn
4
- VERSION = "3.0.0.alpha1"
4
+ VERSION = "3.0.0.alpha2"
5
5
  end
data/webauthn.gemspec CHANGED
@@ -31,23 +31,22 @@ Gem::Specification.new do |spec|
31
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- spec.required_ruby_version = ">= 2.4"
34
+ spec.required_ruby_version = ">= 2.5"
35
35
 
36
36
  spec.add_dependency "android_key_attestation", "~> 0.3.0"
37
37
  spec.add_dependency "awrence", "~> 1.1"
38
38
  spec.add_dependency "bindata", "~> 2.4"
39
39
  spec.add_dependency "cbor", "~> 0.5.9"
40
- spec.add_dependency "cose", "~> 1.0"
41
- spec.add_dependency "openssl", "~> 2.0"
40
+ spec.add_dependency "cose", "~> 1.1"
41
+ spec.add_dependency "openssl", ">= 2.2", "< 3.1"
42
42
  spec.add_dependency "safety_net_attestation", "~> 0.4.0"
43
- spec.add_dependency "securecompare", "~> 1.0"
44
- spec.add_dependency "tpm-key_attestation", "~> 0.9.0"
43
+ spec.add_dependency "tpm-key_attestation", "~> 0.11.0"
45
44
 
46
- spec.add_development_dependency "appraisal", "~> 2.3.0"
47
45
  spec.add_development_dependency "bundler", ">= 1.17", "< 3.0"
48
46
  spec.add_development_dependency "byebug", "~> 11.0"
49
47
  spec.add_development_dependency "rake", "~> 13.0"
50
48
  spec.add_development_dependency "rspec", "~> 3.8"
51
- spec.add_development_dependency "rubocop", "0.80.1"
52
- spec.add_development_dependency "rubocop-rspec", "~> 1.38.1"
49
+ spec.add_development_dependency "rubocop", "~> 1.9.1"
50
+ spec.add_development_dependency "rubocop-rake", "~> 0.5.1"
51
+ spec.add_development_dependency "rubocop-rspec", "~> 2.2.0"
53
52
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webauthn
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.alpha1
4
+ version: 3.0.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gonzalo Rodriguez
8
8
  - Braulio Martinez
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-06-27 00:00:00.000000000 Z
12
+ date: 2022-09-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: android_key_attestation
@@ -73,28 +73,34 @@ dependencies:
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '1.0'
76
+ version: '1.1'
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '1.0'
83
+ version: '1.1'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: openssl
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - "~>"
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '2.2'
91
+ - - "<"
89
92
  - !ruby/object:Gem::Version
90
- version: '2.0'
93
+ version: '3.1'
91
94
  type: :runtime
92
95
  prerelease: false
93
96
  version_requirements: !ruby/object:Gem::Requirement
94
97
  requirements:
95
- - - "~>"
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '2.2'
101
+ - - "<"
96
102
  - !ruby/object:Gem::Version
97
- version: '2.0'
103
+ version: '3.1'
98
104
  - !ruby/object:Gem::Dependency
99
105
  name: safety_net_attestation
100
106
  requirement: !ruby/object:Gem::Requirement
@@ -109,48 +115,20 @@ dependencies:
109
115
  - - "~>"
110
116
  - !ruby/object:Gem::Version
111
117
  version: 0.4.0
112
- - !ruby/object:Gem::Dependency
113
- name: securecompare
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - "~>"
117
- - !ruby/object:Gem::Version
118
- version: '1.0'
119
- type: :runtime
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - "~>"
124
- - !ruby/object:Gem::Version
125
- version: '1.0'
126
118
  - !ruby/object:Gem::Dependency
127
119
  name: tpm-key_attestation
128
120
  requirement: !ruby/object:Gem::Requirement
129
121
  requirements:
130
122
  - - "~>"
131
123
  - !ruby/object:Gem::Version
132
- version: 0.9.0
124
+ version: 0.11.0
133
125
  type: :runtime
134
126
  prerelease: false
135
127
  version_requirements: !ruby/object:Gem::Requirement
136
128
  requirements:
137
129
  - - "~>"
138
130
  - !ruby/object:Gem::Version
139
- version: 0.9.0
140
- - !ruby/object:Gem::Dependency
141
- name: appraisal
142
- requirement: !ruby/object:Gem::Requirement
143
- requirements:
144
- - - "~>"
145
- - !ruby/object:Gem::Version
146
- version: 2.3.0
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - "~>"
152
- - !ruby/object:Gem::Version
153
- version: 2.3.0
131
+ version: 0.11.0
154
132
  - !ruby/object:Gem::Dependency
155
133
  name: bundler
156
134
  requirement: !ruby/object:Gem::Requirement
@@ -217,30 +195,44 @@ dependencies:
217
195
  name: rubocop
218
196
  requirement: !ruby/object:Gem::Requirement
219
197
  requirements:
220
- - - '='
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: 1.9.1
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 1.9.1
208
+ - !ruby/object:Gem::Dependency
209
+ name: rubocop-rake
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
221
213
  - !ruby/object:Gem::Version
222
- version: 0.80.1
214
+ version: 0.5.1
223
215
  type: :development
224
216
  prerelease: false
225
217
  version_requirements: !ruby/object:Gem::Requirement
226
218
  requirements:
227
- - - '='
219
+ - - "~>"
228
220
  - !ruby/object:Gem::Version
229
- version: 0.80.1
221
+ version: 0.5.1
230
222
  - !ruby/object:Gem::Dependency
231
223
  name: rubocop-rspec
232
224
  requirement: !ruby/object:Gem::Requirement
233
225
  requirements:
234
226
  - - "~>"
235
227
  - !ruby/object:Gem::Version
236
- version: 1.38.1
228
+ version: 2.2.0
237
229
  type: :development
238
230
  prerelease: false
239
231
  version_requirements: !ruby/object:Gem::Requirement
240
232
  requirements:
241
233
  - - "~>"
242
234
  - !ruby/object:Gem::Version
243
- version: 1.38.1
235
+ version: 2.2.0
244
236
  description: |-
245
237
  WebAuthn ruby server library ― Make your application a W3C Web Authentication conformant
246
238
  Relying Party and allow your users to authenticate with U2F and FIDO2 authenticators.
@@ -251,11 +243,11 @@ executables: []
251
243
  extensions: []
252
244
  extra_rdoc_files: []
253
245
  files:
246
+ - ".github/workflows/build.yml"
247
+ - ".github/workflows/git.yml"
254
248
  - ".gitignore"
255
249
  - ".rspec"
256
250
  - ".rubocop.yml"
257
- - ".travis.yml"
258
- - Appraisals
259
251
  - CHANGELOG.md
260
252
  - CONTRIBUTING.md
261
253
  - Gemfile
@@ -265,18 +257,15 @@ files:
265
257
  - SECURITY.md
266
258
  - bin/console
267
259
  - bin/setup
260
+ - docs/advanced_configuration.md
268
261
  - docs/u2f_migration.md
269
- - gemfiles/cose_head.gemfile
270
- - gemfiles/openssl_2_0.gemfile
271
- - gemfiles/openssl_2_1.gemfile
272
- - gemfiles/openssl_2_2.gemfile
273
- - gemfiles/openssl_head.gemfile
274
262
  - lib/cose/rsapkcs1_algorithm.rb
275
263
  - lib/webauthn.rb
276
264
  - lib/webauthn/attestation_object.rb
277
265
  - lib/webauthn/attestation_statement.rb
278
266
  - lib/webauthn/attestation_statement/android_key.rb
279
267
  - lib/webauthn/attestation_statement/android_safetynet.rb
268
+ - lib/webauthn/attestation_statement/apple.rb
280
269
  - lib/webauthn/attestation_statement/base.rb
281
270
  - lib/webauthn/attestation_statement/fido_u2f.rb
282
271
  - lib/webauthn/attestation_statement/fido_u2f/public_key.rb
@@ -314,11 +303,8 @@ files:
314
303
  - lib/webauthn/public_key_credential_with_assertion.rb
315
304
  - lib/webauthn/public_key_credential_with_attestation.rb
316
305
  - lib/webauthn/relying_party.rb
317
- - lib/webauthn/security_utils.rb
318
306
  - lib/webauthn/u2f_migrator.rb
319
307
  - lib/webauthn/version.rb
320
- - script/ci/install-openssl
321
- - script/ci/install-ruby
322
308
  - webauthn.gemspec
323
309
  homepage: https://github.com/cedarcode/webauthn-ruby
324
310
  licenses:
@@ -327,7 +313,7 @@ metadata:
327
313
  bug_tracker_uri: https://github.com/cedarcode/webauthn-ruby/issues
328
314
  changelog_uri: https://github.com/cedarcode/webauthn-ruby/blob/master/CHANGELOG.md
329
315
  source_code_uri: https://github.com/cedarcode/webauthn-ruby
330
- post_install_message:
316
+ post_install_message:
331
317
  rdoc_options: []
332
318
  require_paths:
333
319
  - lib
@@ -335,15 +321,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
335
321
  requirements:
336
322
  - - ">="
337
323
  - !ruby/object:Gem::Version
338
- version: '2.4'
324
+ version: '2.5'
339
325
  required_rubygems_version: !ruby/object:Gem::Requirement
340
326
  requirements:
341
327
  - - ">"
342
328
  - !ruby/object:Gem::Version
343
329
  version: 1.3.1
344
330
  requirements: []
345
- rubygems_version: 3.1.4
346
- signing_key:
331
+ rubygems_version: 3.2.32
332
+ signing_key:
347
333
  specification_version: 4
348
334
  summary: WebAuthn ruby server library
349
335
  test_files: []
data/.travis.yml DELETED
@@ -1,39 +0,0 @@
1
- dist: bionic
2
- language: ruby
3
-
4
- cache:
5
- bundler: true
6
- directories:
7
- - /home/travis/.rvm/
8
-
9
- env:
10
- - LIBSSL=1.1 RB=2.7.1
11
- - LIBSSL=1.1 RB=2.6.6
12
- - LIBSSL=1.1 RB=2.5.8
13
- - LIBSSL=1.1 RB=2.4.10
14
- - LIBSSL=1.1 RB=ruby-head
15
- - LIBSSL=1.0 RB=2.7.1
16
- - LIBSSL=1.0 RB=2.6.6
17
- - LIBSSL=1.0 RB=2.5.8
18
- - LIBSSL=1.0 RB=2.4.10
19
- - LIBSSL=1.0 RB=ruby-head
20
-
21
- gemfile:
22
- - gemfiles/cose_head.gemfile
23
- - gemfiles/openssl_head.gemfile
24
- - gemfiles/openssl_2_2.gemfile
25
- - gemfiles/openssl_2_1.gemfile
26
- - gemfiles/openssl_2_0.gemfile
27
-
28
- matrix:
29
- fast_finish: true
30
- allow_failures:
31
- - env: LIBSSL=1.1 RB=ruby-head
32
- - env: LIBSSL=1.0 RB=ruby-head
33
- - gemfile: gemfiles/cose_head.gemfile
34
- - gemfile: gemfiles/openssl_head.gemfile
35
-
36
- before_install:
37
- - ./script/ci/install-openssl
38
- - ./script/ci/install-ruby
39
- - gem install bundler -v "~> 2.0"
data/Appraisals DELETED
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- appraise "cose_head" do
4
- gem "cose", git: "https://github.com/cedarcode/cose-ruby"
5
- end
6
-
7
- appraise "openssl_head" do
8
- gem "openssl", git: "https://github.com/ruby/openssl"
9
- end
10
-
11
- appraise "openssl_2_2" do
12
- gem "openssl", "~> 2.2.0"
13
- end
14
-
15
- appraise "openssl_2_1" do
16
- gem "openssl", "~> 2.1.0"
17
- end
18
-
19
- appraise "openssl_2_0" do
20
- gem "openssl", "~> 2.0.0"
21
- end
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "cose", git: "https://github.com/cedarcode/cose-ruby"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "openssl", "~> 2.0.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "openssl", "~> 2.1.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "openssl", "~> 2.2.0"
6
-
7
- gemspec path: "../"
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "openssl", git: "https://github.com/ruby/openssl"
6
-
7
- gemspec path: "../"
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "securecompare"
4
-
5
- module WebAuthn
6
- module SecurityUtils
7
- # Constant time string comparison, for variable length strings.
8
- # This code was adapted from Rails ActiveSupport::SecurityUtils
9
- #
10
- # The values are first processed by SHA256, so that we don't leak length info
11
- # via timing attacks.
12
- def secure_compare(first_string, second_string)
13
- first_string_sha256 = ::Digest::SHA256.digest(first_string)
14
- second_string_sha256 = ::Digest::SHA256.digest(second_string)
15
-
16
- SecureCompare.compare(first_string_sha256, second_string_sha256) && first_string == second_string
17
- end
18
- module_function :secure_compare
19
- end
20
- end