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.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +31 -0
- data/.github/workflows/git.yml +21 -0
- data/.rubocop.yml +57 -1
- data/CHANGELOG.md +63 -1
- data/README.md +5 -2
- data/SECURITY.md +6 -3
- data/docs/advanced_configuration.md +174 -0
- data/docs/u2f_migration.md +3 -2
- data/lib/cose/rsapkcs1_algorithm.rb +7 -0
- data/lib/webauthn/attestation_statement/android_key.rb +0 -4
- data/lib/webauthn/attestation_statement/android_safetynet.rb +1 -5
- data/lib/webauthn/attestation_statement/apple.rb +65 -0
- data/lib/webauthn/attestation_statement/base.rb +11 -22
- data/lib/webauthn/attestation_statement/none.rb +7 -1
- data/lib/webauthn/attestation_statement/packed.rb +1 -1
- data/lib/webauthn/attestation_statement/tpm.rb +2 -2
- data/lib/webauthn/attestation_statement.rb +4 -1
- data/lib/webauthn/authenticator_data/attested_credential_data.rb +2 -3
- data/lib/webauthn/authenticator_response.rb +1 -2
- data/lib/webauthn/credential_creation_options.rb +2 -0
- data/lib/webauthn/credential_request_options.rb +2 -0
- data/lib/webauthn/fake_authenticator/authenticator_data.rb +1 -1
- data/lib/webauthn/fake_authenticator.rb +11 -3
- data/lib/webauthn/fake_client.rb +10 -3
- data/lib/webauthn/public_key_credential/entity.rb +3 -4
- data/lib/webauthn/relying_party.rb +2 -2
- data/lib/webauthn/u2f_migrator.rb +4 -1
- data/lib/webauthn/version.rb +1 -1
- data/webauthn.gemspec +7 -8
- metadata +45 -59
- data/.travis.yml +0 -39
- data/Appraisals +0 -21
- data/gemfiles/cose_head.gemfile +0 -7
- data/gemfiles/openssl_2_0.gemfile +0 -7
- data/gemfiles/openssl_2_1.gemfile +0 -7
- data/gemfiles/openssl_2_2.gemfile +0 -7
- data/gemfiles/openssl_head.gemfile +0 -7
- data/lib/webauthn/security_utils.rb +0 -20
- data/script/ci/install-openssl +0 -7
- 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.
|
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
|
-
|
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::
|
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
|
-
|
82
|
+
OpenSSL.secure_compare(client_data.challenge, expected_challenge)
|
84
83
|
end
|
85
84
|
|
86
85
|
def valid_origin?(expected_origin)
|
@@ -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.
|
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
|
-
|
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.
|
98
|
+
[SecureRandom.random_bytes(16), OpenSSL::PKey::EC.generate("prime256v1"), 0]
|
91
99
|
end
|
92
100
|
|
93
101
|
def hashed(target)
|
data/lib/webauthn/fake_client.rb
CHANGED
@@ -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
|
8
|
+
attr_reader :name
|
9
9
|
|
10
|
-
def initialize(name
|
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
|
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",
|
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(
|
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
|
|
data/lib/webauthn/version.rb
CHANGED
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.
|
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.
|
41
|
-
spec.add_dependency "openssl", "
|
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 "
|
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", "
|
52
|
-
spec.add_development_dependency "rubocop-
|
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.
|
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:
|
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.
|
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.
|
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: '
|
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: '
|
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.
|
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.
|
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.
|
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.
|
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:
|
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:
|
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.
|
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.
|
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
|
data/gemfiles/cose_head.gemfile
DELETED
@@ -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
|