webauthn 3.0.0.alpha1 → 3.0.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
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