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.
- 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
|