webauthn 3.1.0 → 3.2.1
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 +16 -2
- data/CHANGELOG.md +27 -0
- data/lib/webauthn/authenticator_assertion_response.rb +16 -2
- data/lib/webauthn/authenticator_attestation_response.rb +5 -4
- data/lib/webauthn/authenticator_response.rb +3 -2
- data/lib/webauthn/fake_authenticator/attestation_object.rb +10 -1
- data/lib/webauthn/fake_authenticator/authenticator_data.rb +3 -1
- data/lib/webauthn/fake_authenticator.rb +25 -4
- data/lib/webauthn/fake_client.rb +4 -1
- data/lib/webauthn/json_serializer.rb +43 -0
- data/lib/webauthn/public_key_credential/entity.rb +2 -24
- data/lib/webauthn/public_key_credential/options.rb +2 -24
- data/lib/webauthn/public_key_credential_with_assertion.rb +2 -1
- data/lib/webauthn/public_key_credential_with_attestation.rb +2 -2
- data/lib/webauthn/relying_party.rb +4 -2
- data/lib/webauthn/version.rb +1 -1
- data/lib/webauthn.rb +1 -0
- data/webauthn.gemspec +0 -1
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4531338c1a9301a58aea6f70458311891a81c06f50e2c223eb812ec24e980e2c
|
4
|
+
data.tar.gz: fae69f115e3f93a942446d30115e0268b0a73bd13a9a565b4235ed5103ab7b98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '038380bb699e7e9d8ee728b256ae2de062bebed3b9531174c5d428e210bcb6896ba4907ea17343239193900d7d1ffc97bde73e99323e12b8377887f7ba0dcd9a'
|
7
|
+
data.tar.gz: eb7062a1dde7a0099154580075bf060a32bdcf000c8156c77048829e38e89e227e0f3d5a15f2d80ba9c408733f94c399bb96f8d19a184bad36943f8309ce3d4a
|
data/.github/workflows/build.yml
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
name: build
|
9
9
|
|
10
|
-
on:
|
10
|
+
on:
|
11
11
|
push:
|
12
12
|
branches: [master]
|
13
13
|
pull_request:
|
@@ -20,6 +20,8 @@ jobs:
|
|
20
20
|
fail-fast: false
|
21
21
|
matrix:
|
22
22
|
ruby:
|
23
|
+
- '3.4.0-preview2'
|
24
|
+
- '3.3'
|
23
25
|
- '3.2'
|
24
26
|
- '3.1'
|
25
27
|
- '3.0'
|
@@ -33,4 +35,16 @@ jobs:
|
|
33
35
|
with:
|
34
36
|
ruby-version: ${{ matrix.ruby }}
|
35
37
|
bundler-cache: true
|
36
|
-
- run: bundle exec
|
38
|
+
- run: bundle exec rspec
|
39
|
+
env:
|
40
|
+
RUBYOPT: ${{ startsWith(matrix.ruby, '3.4') && '--enable=frozen-string-literal' || '' }}
|
41
|
+
|
42
|
+
lint:
|
43
|
+
runs-on: ubuntu-latest
|
44
|
+
steps:
|
45
|
+
- uses: actions/checkout@v4
|
46
|
+
- uses: ruby/setup-ruby@v1
|
47
|
+
with:
|
48
|
+
ruby-version: '3.3'
|
49
|
+
bundler-cache: true
|
50
|
+
- run: bundle exec rubocop -f github
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,32 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v3.2.1] - 2024-11-14
|
4
|
+
|
5
|
+
### Fixed
|
6
|
+
|
7
|
+
- Fix JSON Serializer generating json with attributes with a null value. [#442](https://github.com/cedarcode/webauthn-ruby/pull/442) @santiagorodriguez96
|
8
|
+
|
9
|
+
## [v3.2.0] - 2024-11-13
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
- Added `AuthenticatorAttestationResponse#transports` for accessing the response's `transports` value. [#421](https://github.com/cedarcode/webauthn-ruby/pull/421) [@santiagorodriguez96]
|
14
|
+
- `WebAuthn::AuthenticatorAssertionResponse#verify` and `WebAuthn::AuthenticatorAttestationResponse#verify`,
|
15
|
+
as well as `RelyingParty#verify_registration` and `RelyingParty#verify_authentication` now accept a `user_presence`
|
16
|
+
keyword arg in order to be able to skip the user presence check for specific attestation and assertion verifications.
|
17
|
+
By default, user presence will be checked unless `silent_authentication` is enabled for the Relying Party (as it was before).
|
18
|
+
[#432](https://github.com/cedarcode/webauthn-ruby/pull/432), [#434](https://github.com/cedarcode/webauthn-ruby/pull/434), [#435](https://github.com/cedarcode/webauthn-ruby/pull/435) ([@nov](https://github.com/nov), [@santiagorodriguez96])
|
19
|
+
- `WebAuthn::FakeClient#create` and `WebAuthn::FakeAuthenticator#make_credential` now support a `credential_algorithm` and
|
20
|
+
`algorithm` param (respectively) for choosing the algorithm to use for creating the credential.
|
21
|
+
Supported values are: 'ES256', 'RSA256' and 'EdDSA'. [#400](https://github.com/cedarcode/webauthn-ruby/pull/400), [#437](https://github.com/cedarcode/webauthn-ruby/pull/437) [@santiagorodriguez96]
|
22
|
+
- Remove `awrence` dependency. [#436](https://github.com/cedarcode/webauthn-ruby/pull/436) [@npezza](https://github.com/npezza93)
|
23
|
+
- Run tests with Ruby 3.3. [#416](https://github.com/cedarcode/webauthn-ruby/pull/416) [@santiagorodriguez96]
|
24
|
+
- Run tests with Ruby 3.4.0-preview2. [#436](https://github.com/cedarcode/webauthn-ruby/pull/436) [@npezza](https://github.com/npezza93)
|
25
|
+
|
26
|
+
### Changed
|
27
|
+
|
28
|
+
- Remove unused class `AttestationTrustworthinessVerificationError`. [#412](https://github.com/cedarcode/webauthn-ruby/pull/412) [@soartec-lab]
|
29
|
+
|
3
30
|
## [v3.1.0] - 2023-12-26
|
4
31
|
|
5
32
|
### Added
|
@@ -37,8 +37,22 @@ module WebAuthn
|
|
37
37
|
@user_handle = user_handle
|
38
38
|
end
|
39
39
|
|
40
|
-
def verify(
|
41
|
-
|
40
|
+
def verify(
|
41
|
+
expected_challenge,
|
42
|
+
expected_origin = nil,
|
43
|
+
public_key:,
|
44
|
+
sign_count:,
|
45
|
+
user_presence: nil,
|
46
|
+
user_verification: nil,
|
47
|
+
rp_id: nil
|
48
|
+
)
|
49
|
+
super(
|
50
|
+
expected_challenge,
|
51
|
+
expected_origin,
|
52
|
+
user_presence: user_presence,
|
53
|
+
user_verification: user_verification,
|
54
|
+
rp_id: rp_id
|
55
|
+
)
|
42
56
|
verify_item(:signature, WebAuthn::PublicKey.deserialize(public_key))
|
43
57
|
verify_item(:sign_count, sign_count)
|
44
58
|
|
@@ -12,7 +12,6 @@ require "webauthn/encoder"
|
|
12
12
|
|
13
13
|
module WebAuthn
|
14
14
|
class AttestationStatementVerificationError < VerificationError; end
|
15
|
-
class AttestationTrustworthinessVerificationError < VerificationError; end
|
16
15
|
class AttestedCredentialVerificationError < VerificationError; end
|
17
16
|
|
18
17
|
class AuthenticatorAttestationResponse < AuthenticatorResponse
|
@@ -23,21 +22,23 @@ module WebAuthn
|
|
23
22
|
|
24
23
|
new(
|
25
24
|
attestation_object: encoder.decode(response["attestationObject"]),
|
25
|
+
transports: response["transports"],
|
26
26
|
client_data_json: encoder.decode(response["clientDataJSON"]),
|
27
27
|
relying_party: relying_party
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
31
|
-
attr_reader :attestation_type, :attestation_trust_path
|
31
|
+
attr_reader :attestation_type, :attestation_trust_path, :transports
|
32
32
|
|
33
|
-
def initialize(attestation_object:, **options)
|
33
|
+
def initialize(attestation_object:, transports: [], **options)
|
34
34
|
super(**options)
|
35
35
|
|
36
36
|
@attestation_object_bytes = attestation_object
|
37
|
+
@transports = transports
|
37
38
|
@relying_party = relying_party
|
38
39
|
end
|
39
40
|
|
40
|
-
def verify(expected_challenge, expected_origin = nil, user_verification: nil, rp_id: nil)
|
41
|
+
def verify(expected_challenge, expected_origin = nil, user_presence: nil, user_verification: nil, rp_id: nil)
|
41
42
|
super
|
42
43
|
|
43
44
|
verify_item(:attested_credential)
|
@@ -24,7 +24,7 @@ module WebAuthn
|
|
24
24
|
@relying_party = relying_party
|
25
25
|
end
|
26
26
|
|
27
|
-
def verify(expected_challenge, expected_origin = nil, user_verification: nil, rp_id: nil)
|
27
|
+
def verify(expected_challenge, expected_origin = nil, user_presence: nil, user_verification: nil, rp_id: nil)
|
28
28
|
expected_origin ||= relying_party.origin || raise("Unspecified expected origin")
|
29
29
|
rp_id ||= relying_party.id
|
30
30
|
|
@@ -35,7 +35,8 @@ module WebAuthn
|
|
35
35
|
verify_item(:authenticator_data)
|
36
36
|
verify_item(:rp_id, rp_id || rp_id_from_origin(expected_origin))
|
37
37
|
|
38
|
-
|
38
|
+
# Fallback to RP configuration unless user_presence is passed in explicitely
|
39
|
+
if user_presence.nil? && !relying_party.silent_authentication || user_presence
|
39
40
|
verify_item(:user_presence)
|
40
41
|
end
|
41
42
|
|
@@ -61,7 +61,7 @@ module WebAuthn
|
|
61
61
|
begin
|
62
62
|
credential_data =
|
63
63
|
if attested_credential_data
|
64
|
-
{ id: credential_id, public_key:
|
64
|
+
{ id: credential_id, public_key: credential_public_key }
|
65
65
|
end
|
66
66
|
|
67
67
|
AuthenticatorData.new(
|
@@ -76,6 +76,15 @@ module WebAuthn
|
|
76
76
|
)
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
def credential_public_key
|
81
|
+
case credential_key
|
82
|
+
when OpenSSL::PKey::RSA, OpenSSL::PKey::EC
|
83
|
+
credential_key.public_key
|
84
|
+
when OpenSSL::PKey::PKey
|
85
|
+
OpenSSL::PKey.read(credential_key.public_to_der)
|
86
|
+
end
|
87
|
+
end
|
79
88
|
end
|
80
89
|
end
|
81
90
|
end
|
@@ -20,10 +20,11 @@ module WebAuthn
|
|
20
20
|
backup_eligibility: false,
|
21
21
|
backup_state: false,
|
22
22
|
attested_credential_data: true,
|
23
|
+
algorithm: nil,
|
23
24
|
sign_count: nil,
|
24
25
|
extensions: nil
|
25
26
|
)
|
26
|
-
credential_id, credential_key, credential_sign_count = new_credential
|
27
|
+
credential_id, credential_key, credential_sign_count = new_credential(algorithm)
|
27
28
|
sign_count ||= credential_sign_count
|
28
29
|
|
29
30
|
credentials[rp_id] ||= {}
|
@@ -85,7 +86,14 @@ module WebAuthn
|
|
85
86
|
extensions: extensions
|
86
87
|
).serialize
|
87
88
|
|
88
|
-
|
89
|
+
signature_digest_algorithm =
|
90
|
+
case credential_key
|
91
|
+
when OpenSSL::PKey::RSA, OpenSSL::PKey::EC
|
92
|
+
'SHA256'
|
93
|
+
when OpenSSL::PKey::PKey
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
signature = credential_key.sign(signature_digest_algorithm, authenticator_data + client_data_hash)
|
89
97
|
credential[:sign_count] += 1
|
90
98
|
|
91
99
|
{
|
@@ -102,8 +110,21 @@ module WebAuthn
|
|
102
110
|
|
103
111
|
attr_reader :credentials
|
104
112
|
|
105
|
-
def new_credential
|
106
|
-
|
113
|
+
def new_credential(algorithm)
|
114
|
+
algorithm ||= 'ES256'
|
115
|
+
credential_key =
|
116
|
+
case algorithm
|
117
|
+
when 'ES256'
|
118
|
+
OpenSSL::PKey::EC.generate('prime256v1')
|
119
|
+
when 'RS256'
|
120
|
+
OpenSSL::PKey::RSA.new(2048)
|
121
|
+
when 'EdDSA'
|
122
|
+
OpenSSL::PKey.generate_key("ED25519")
|
123
|
+
else
|
124
|
+
raise "Unsupported algorithm #{algorithm}"
|
125
|
+
end
|
126
|
+
|
127
|
+
[SecureRandom.random_bytes(16), credential_key, 0]
|
107
128
|
end
|
108
129
|
|
109
130
|
def hashed(target)
|
data/lib/webauthn/fake_client.rb
CHANGED
@@ -32,6 +32,7 @@ module WebAuthn
|
|
32
32
|
backup_eligibility: false,
|
33
33
|
backup_state: false,
|
34
34
|
attested_credential_data: true,
|
35
|
+
credential_algorithm: nil,
|
35
36
|
extensions: nil
|
36
37
|
)
|
37
38
|
rp_id ||= URI.parse(origin).host
|
@@ -47,6 +48,7 @@ module WebAuthn
|
|
47
48
|
backup_eligibility: backup_eligibility,
|
48
49
|
backup_state: backup_state,
|
49
50
|
attested_credential_data: attested_credential_data,
|
51
|
+
algorithm: credential_algorithm,
|
50
52
|
extensions: extensions
|
51
53
|
)
|
52
54
|
|
@@ -68,7 +70,8 @@ module WebAuthn
|
|
68
70
|
"clientExtensionResults" => extensions,
|
69
71
|
"response" => {
|
70
72
|
"attestationObject" => encoder.encode(attestation_object),
|
71
|
-
"clientDataJSON" => encoder.encode(client_data_json)
|
73
|
+
"clientDataJSON" => encoder.encode(client_data_json),
|
74
|
+
"transports" => ["internal"],
|
72
75
|
}
|
73
76
|
}
|
74
77
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WebAuthn
|
4
|
+
module JSONSerializer
|
5
|
+
# Argument wildcard for Ruby on Rails controller automatic object JSON serialization
|
6
|
+
def as_json(*)
|
7
|
+
to_hash_with_camelized_keys
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def to_hash_with_camelized_keys
|
13
|
+
attributes.each_with_object({}) do |attribute_name, hash|
|
14
|
+
value = send(attribute_name)
|
15
|
+
|
16
|
+
if value && value.respond_to?(:as_json)
|
17
|
+
hash[camelize(attribute_name)] = value.as_json
|
18
|
+
elsif value
|
19
|
+
hash[camelize(attribute_name)] = deep_camelize_keys(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def deep_camelize_keys(object)
|
25
|
+
case object
|
26
|
+
when Hash
|
27
|
+
object.each_with_object({}) do |(key, value), result|
|
28
|
+
result[camelize(key)] = deep_camelize_keys(value)
|
29
|
+
end
|
30
|
+
when Array
|
31
|
+
object.map { |element| deep_camelize_keys(element) }
|
32
|
+
else
|
33
|
+
object
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def camelize(term)
|
38
|
+
first_term, *rest = term.to_s.split('_')
|
39
|
+
|
40
|
+
[first_term, *rest.map(&:capitalize)].join.to_sym
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,40 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "awrence"
|
4
|
-
|
5
3
|
module WebAuthn
|
6
4
|
class PublicKeyCredential
|
7
5
|
class Entity
|
6
|
+
include JSONSerializer
|
7
|
+
|
8
8
|
attr_reader :name
|
9
9
|
|
10
10
|
def initialize(name:)
|
11
11
|
@name = name
|
12
12
|
end
|
13
13
|
|
14
|
-
def as_json
|
15
|
-
to_hash.to_camelback_keys
|
16
|
-
end
|
17
|
-
|
18
14
|
private
|
19
15
|
|
20
|
-
def to_hash
|
21
|
-
hash = {}
|
22
|
-
|
23
|
-
attributes.each do |attribute_name|
|
24
|
-
value = send(attribute_name)
|
25
|
-
|
26
|
-
if value.respond_to?(:as_json)
|
27
|
-
value = value.as_json
|
28
|
-
end
|
29
|
-
|
30
|
-
if value
|
31
|
-
hash[attribute_name] = value
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
hash
|
36
|
-
end
|
37
|
-
|
38
16
|
def attributes
|
39
17
|
[:name]
|
40
18
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "awrence"
|
4
3
|
require "securerandom"
|
5
4
|
|
6
5
|
module WebAuthn
|
7
6
|
class PublicKeyCredential
|
8
7
|
class Options
|
8
|
+
include JSONSerializer
|
9
|
+
|
9
10
|
CHALLENGE_LENGTH = 32
|
10
11
|
|
11
12
|
attr_reader :timeout, :extensions, :relying_party
|
@@ -20,31 +21,8 @@ module WebAuthn
|
|
20
21
|
encoder.encode(raw_challenge)
|
21
22
|
end
|
22
23
|
|
23
|
-
# Argument wildcard for Ruby on Rails controller automatic object JSON serialization
|
24
|
-
def as_json(*)
|
25
|
-
to_hash.to_camelback_keys
|
26
|
-
end
|
27
|
-
|
28
24
|
private
|
29
25
|
|
30
|
-
def to_hash
|
31
|
-
hash = {}
|
32
|
-
|
33
|
-
attributes.each do |attribute_name|
|
34
|
-
value = send(attribute_name)
|
35
|
-
|
36
|
-
if value.respond_to?(:as_json)
|
37
|
-
value = value.as_json
|
38
|
-
end
|
39
|
-
|
40
|
-
if value
|
41
|
-
hash[attribute_name] = value
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
hash
|
46
|
-
end
|
47
|
-
|
48
26
|
def attributes
|
49
27
|
[:challenge, :timeout, :extensions]
|
50
28
|
end
|
@@ -9,13 +9,14 @@ module WebAuthn
|
|
9
9
|
WebAuthn::AuthenticatorAssertionResponse
|
10
10
|
end
|
11
11
|
|
12
|
-
def verify(challenge, public_key:, sign_count:, user_verification: nil)
|
12
|
+
def verify(challenge, public_key:, sign_count:, user_presence: nil, user_verification: nil)
|
13
13
|
super
|
14
14
|
|
15
15
|
response.verify(
|
16
16
|
encoder.decode(challenge),
|
17
17
|
public_key: encoder.decode(public_key),
|
18
18
|
sign_count: sign_count,
|
19
|
+
user_presence: user_presence,
|
19
20
|
user_verification: user_verification,
|
20
21
|
rp_id: appid_extension_output ? appid : nil
|
21
22
|
)
|
@@ -9,10 +9,10 @@ module WebAuthn
|
|
9
9
|
WebAuthn::AuthenticatorAttestationResponse
|
10
10
|
end
|
11
11
|
|
12
|
-
def verify(challenge, user_verification: nil)
|
12
|
+
def verify(challenge, user_presence: nil, user_verification: nil)
|
13
13
|
super
|
14
14
|
|
15
|
-
response.verify(encoder.decode(challenge), user_verification: user_verification)
|
15
|
+
response.verify(encoder.decode(challenge), user_presence: user_presence, user_verification: user_verification)
|
16
16
|
|
17
17
|
true
|
18
18
|
end
|
@@ -81,10 +81,10 @@ module WebAuthn
|
|
81
81
|
)
|
82
82
|
end
|
83
83
|
|
84
|
-
def verify_registration(raw_credential, challenge, user_verification: nil)
|
84
|
+
def verify_registration(raw_credential, challenge, user_presence: nil, user_verification: nil)
|
85
85
|
webauthn_credential = WebAuthn::Credential.from_create(raw_credential, relying_party: self)
|
86
86
|
|
87
|
-
if webauthn_credential.verify(challenge, user_verification: user_verification)
|
87
|
+
if webauthn_credential.verify(challenge, user_presence: user_presence, user_verification: user_verification)
|
88
88
|
webauthn_credential
|
89
89
|
end
|
90
90
|
end
|
@@ -99,6 +99,7 @@ module WebAuthn
|
|
99
99
|
def verify_authentication(
|
100
100
|
raw_credential,
|
101
101
|
challenge,
|
102
|
+
user_presence: nil,
|
102
103
|
user_verification: nil,
|
103
104
|
public_key: nil,
|
104
105
|
sign_count: nil
|
@@ -111,6 +112,7 @@ module WebAuthn
|
|
111
112
|
challenge,
|
112
113
|
public_key: public_key || stored_credential.public_key,
|
113
114
|
sign_count: sign_count || stored_credential.sign_count,
|
115
|
+
user_presence: user_presence,
|
114
116
|
user_verification: user_verification
|
115
117
|
)
|
116
118
|
block_given? ? [webauthn_credential, stored_credential] : webauthn_credential
|
data/lib/webauthn/version.rb
CHANGED
data/lib/webauthn.rb
CHANGED
data/webauthn.gemspec
CHANGED
@@ -34,7 +34,6 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.required_ruby_version = ">= 2.5"
|
35
35
|
|
36
36
|
spec.add_dependency "android_key_attestation", "~> 0.3.0"
|
37
|
-
spec.add_dependency "awrence", "~> 1.1"
|
38
37
|
spec.add_dependency "bindata", "~> 2.4"
|
39
38
|
spec.add_dependency "cbor", "~> 0.5.9"
|
40
39
|
spec.add_dependency "cose", "~> 1.1"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webauthn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gonzalo Rodriguez
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-11-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: android_key_attestation
|
@@ -25,20 +25,6 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 0.3.0
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: awrence
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - "~>"
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '1.1'
|
35
|
-
type: :runtime
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - "~>"
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
version: '1.1'
|
42
28
|
- !ruby/object:Gem::Dependency
|
43
29
|
name: bindata
|
44
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,6 +287,7 @@ files:
|
|
301
287
|
- lib/webauthn/fake_authenticator/attestation_object.rb
|
302
288
|
- lib/webauthn/fake_authenticator/authenticator_data.rb
|
303
289
|
- lib/webauthn/fake_client.rb
|
290
|
+
- lib/webauthn/json_serializer.rb
|
304
291
|
- lib/webauthn/public_key.rb
|
305
292
|
- lib/webauthn/public_key_credential.rb
|
306
293
|
- lib/webauthn/public_key_credential/creation_options.rb
|
@@ -337,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
337
324
|
- !ruby/object:Gem::Version
|
338
325
|
version: '0'
|
339
326
|
requirements: []
|
340
|
-
rubygems_version: 3.
|
327
|
+
rubygems_version: 3.5.11
|
341
328
|
signing_key:
|
342
329
|
specification_version: 4
|
343
330
|
summary: WebAuthn ruby server library
|