webauthn 1.5.0 → 1.6.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ff393d6958f8ac6c87687e9182713174b06c242e
4
- data.tar.gz: 516c577085fd3cf07f2e52cb0f6055ba54dfcfa0
2
+ SHA256:
3
+ metadata.gz: 25e0a04470e52f5f6640aacc66c9653792ea8b5dc9fc7639d6d876b0fdd8921a
4
+ data.tar.gz: 4291b2831b3cee590445af283f7979b98d0da02950e5ffd161f14aad9754b4e1
5
5
  SHA512:
6
- metadata.gz: 14ce284002cc748da915fa332e3fd99085c58a1a09b8b7d1f2a0866b9c224fe1975351b05e1221f1f4c40336f13141b1a03dfec8d374d53036c0d1c197e55032
7
- data.tar.gz: aeb41c15771cdd16bd2654fd3ef1380b34c88e5f060c71eede3246cdc3576ae794f5b84860715e98ff528337dfbca0887a13134a3d8b4421ae11bb6107577970
6
+ metadata.gz: 3681ac63ac7bab1629e23010e93641fc3f522ada0ee2b5259f933465bb3dd6b8bdfa4b726bb803759fbb452e137c6624bad4bd52b4e86c31f9fd789edde6537c
7
+ data.tar.gz: bf4aa5c49e3421b7f112de0ce638d0fe18465040ebf258e51b12c7d379ba624e2f72d3ad4400cf1f782e440a6605f60180622be8a01c74b3ab8658f16293152f
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --format documentation
2
2
  --color
3
- --require spec_helper
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.6.0] - 2018-11-01
4
+
5
+ ### Added
6
+
7
+ - `FakeAuthenticator` object is now exposed to help you test your WebAuthn implementation
8
+
3
9
  ## [v1.5.0] - 2018-10-23
4
10
 
5
11
  ### Added
@@ -91,6 +97,7 @@ Note: Both additions should help making it compatible with Chrome for Android 70
91
97
  - `WebAuthn::AuthenticatorAttestationResponse.valid?` can be used to validate fido-u2f attestations returned by the browser
92
98
  - Works with ruby 2.5
93
99
 
100
+ [v1.6.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.5.0...v1.6.0/
94
101
  [v1.5.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.4.0...v1.5.0/
95
102
  [v1.4.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.3.0...v1.4.0/
96
103
  [v1.3.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.2.0...v1.3.0/
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cbor"
4
+ require "openssl"
5
+ require "securerandom"
6
+
7
+ module WebAuthn
8
+ class FakeAuthenticator
9
+ class Base
10
+ def initialize(challenge: fake_challenge, rp_id: "localhost", sign_count: 0, context: {})
11
+ @challenge = challenge
12
+ @rp_id = rp_id
13
+ @sign_count = sign_count
14
+ @context = context
15
+ end
16
+
17
+ def authenticator_data
18
+ @authenticator_data ||= rp_id_hash + raw_flags + raw_sign_count + attested_credential_data
19
+ end
20
+
21
+ def client_data_json
22
+ @client_data_json ||= { challenge: encode(challenge), origin: origin, type: type }.to_json
23
+ end
24
+
25
+ def credential_key
26
+ @credential_key ||= OpenSSL::PKey::EC.new("prime256v1").generate_key
27
+ end
28
+
29
+ def credential_id
30
+ @credential_id ||= SecureRandom.random_bytes(16)
31
+ end
32
+
33
+ def rp_id_hash
34
+ OpenSSL::Digest::SHA256.digest(rp_id)
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :challenge, :context, :rp_id
40
+
41
+ def raw_flags
42
+ ["#{bit(:user_present)}0#{bit(:user_verified)}000#{attested_credential_data_present_bit}0"].pack("b*")
43
+ end
44
+
45
+ def attested_credential_data_present_bit
46
+ if attested_credential_data.empty?
47
+ "0"
48
+ else
49
+ "1"
50
+ end
51
+ end
52
+
53
+ def attested_credential_data
54
+ ""
55
+ end
56
+
57
+ def raw_sign_count
58
+ [@sign_count].pack('L>')
59
+ end
60
+
61
+ def bit(flag)
62
+ if context[flag].nil? || context[flag]
63
+ "1"
64
+ else
65
+ "0"
66
+ end
67
+ end
68
+
69
+ def origin
70
+ @origin ||= context[:origin] || fake_origin
71
+ end
72
+
73
+ def encode(bytes)
74
+ Base64.urlsafe_encode64(bytes, padding: false)
75
+ end
76
+
77
+ def fake_challenge
78
+ SecureRandom.random_bytes(32)
79
+ end
80
+
81
+ def fake_origin
82
+ "http://localhost"
83
+ end
84
+ end
85
+
86
+ class Create < Base
87
+ def attestation_object
88
+ CBOR.encode(
89
+ "fmt" => "none",
90
+ "attStmt" => {},
91
+ "authData" => authenticator_data
92
+ )
93
+ end
94
+
95
+ private
96
+
97
+ def attested_credential_data
98
+ aaguid + [credential_id.length].pack("n*") + credential_id + cose_credential_public_key
99
+ end
100
+
101
+ def aaguid
102
+ @aaguid ||= SecureRandom.random_bytes(16)
103
+ end
104
+
105
+ def cose_credential_public_key
106
+ fake_cose_credential_key(
107
+ x_coordinate: key_bytes(credential_key.public_key)[1..32],
108
+ y_coordinate: key_bytes(credential_key.public_key)[33..64]
109
+ )
110
+ end
111
+
112
+ def type
113
+ "webauthn.create"
114
+ end
115
+
116
+ def fake_cose_credential_key(algorithm: nil, x_coordinate: nil, y_coordinate: nil)
117
+ kty_label = 1
118
+ alg_label = 3
119
+ crv_label = -1
120
+ x_label = -2
121
+ y_label = -3
122
+
123
+ kty_ec2 = 2
124
+ alg_es256 = -7
125
+ crv_p256 = 1
126
+
127
+ CBOR.encode(
128
+ kty_label => kty_ec2,
129
+ alg_label => algorithm || alg_es256,
130
+ crv_label => crv_p256,
131
+ x_label => x_coordinate || SecureRandom.random_bytes(32),
132
+ y_label => y_coordinate || SecureRandom.random_bytes(32)
133
+ )
134
+ end
135
+
136
+ def key_bytes(public_key)
137
+ public_key.to_bn.to_s(2)
138
+ end
139
+ end
140
+
141
+ class Get < Base
142
+ def signature
143
+ @signature ||= credential_key.sign(
144
+ "SHA256",
145
+ authenticator_data + OpenSSL::Digest::SHA256.digest(client_data_json)
146
+ )
147
+ end
148
+
149
+ private
150
+
151
+ def type
152
+ "webauthn.get"
153
+ end
154
+ end
155
+ end
156
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebAuthn
4
- VERSION = "1.5.0"
4
+ VERSION = "1.6.0"
5
5
  end
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: 1.5.0
4
+ version: 1.6.0
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: 2018-10-23 00:00:00.000000000 Z
12
+ date: 2018-11-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cbor
@@ -177,6 +177,7 @@ files:
177
177
  - lib/webauthn/authenticator_data/attested_credential_data/public_key_u2f.rb
178
178
  - lib/webauthn/authenticator_response.rb
179
179
  - lib/webauthn/client_data.rb
180
+ - lib/webauthn/fake_authenticator.rb
180
181
  - lib/webauthn/version.rb
181
182
  - webauthn.gemspec
182
183
  homepage: https://github.com/cedarcode/webauthn-ruby
@@ -202,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
203
  version: '0'
203
204
  requirements: []
204
205
  rubyforge_project:
205
- rubygems_version: 2.5.2.3
206
+ rubygems_version: 2.7.6
206
207
  signing_key:
207
208
  specification_version: 4
208
209
  summary: WebAuthn in ruby ― Ruby implementation of a WebAuthn Relying Party