webauthn 1.9.0 → 1.10.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
2
  SHA256:
3
- metadata.gz: 690e8753529b42c4acc5fa15f621c077ee9822c850aa19e8a322ea5d937dbb8d
4
- data.tar.gz: c0aa00203643d32d5bcdc673eced0dbc4185b05ab262fef5aa9fcdbf073de5c4
3
+ metadata.gz: 64d44e8b2917b4301f669f4f736814ab42c27e3541d81404169aedcec18f64c3
4
+ data.tar.gz: aa138c35bdcceaf5d6971ae306c2fb3adb9c0be12ffae3ee2c2ebcb051787521
5
5
  SHA512:
6
- metadata.gz: 66470f20b0365194b77753a664bdd759a204f62cf60c1dcabbf7181c472696c665e8946cf2c1073aad190cbeb3b6b557120aed8386525911cf65e25f5fb82762
7
- data.tar.gz: baea59ad89ba252e6da4ec1ddce5394d3ea484d186e7d48740bae1d136e973e4a34114b91c34d64ea65bb4bee4d2a6468300057a5877dfab269296b16ae1a4b0
6
+ metadata.gz: 18ce684f6613dd5d399ef413f3d9d0c8dae77e97ba8eaa7cafae0e785ce14cdaa5c852cb44ea1e41dc03a7a9cb78841f0038ad0e228f4579f0d904fdd90601fc
7
+ data.tar.gz: db18d834bbbe2870c8d05db904d4ae2852516b10a786e6c9f7b5b38ea3cbfde9c2cbc7fa9b27b4979e56af892e2fcf019f24821dcc03a13f93e9bf096f1eb198
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.10.0] - 2019-03-05
4
+
5
+ ### Added
6
+
7
+ - Parse and make AuthenticatorData's extensionData available
8
+
3
9
  ## [v1.9.0] - 2019-02-22
4
10
 
5
11
  ### Added
@@ -121,6 +127,7 @@ Note: Both additions should help making it compatible with Chrome for Android 70
121
127
  - `WebAuthn::AuthenticatorAttestationResponse.valid?` can be used to validate fido-u2f attestations returned by the browser
122
128
  - Works with ruby 2.5
123
129
 
130
+ [v1.10.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.9.0...v1.10.0/
124
131
  [v1.9.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.8.0...v1.9.0/
125
132
  [v1.8.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.7.0...v1.8.0/
126
133
  [v1.7.0]: https://github.com/cedarcode/webauthn-ruby/compare/v1.6.0...v1.7.0/
data/README.md CHANGED
@@ -9,7 +9,7 @@ Easily implement WebAuthn in your ruby/rails app
9
9
 
10
10
  - [WebAuthn article with Google IO 2018 talk](https://developers.google.com/web/updates/2018/05/webauthn)
11
11
  - [Web Authentication API draft article by Mozilla](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API)
12
- - [WebAuthn W3C Candidate Recommendation](https://www.w3.org/TR/webauthn/)
12
+ - [WebAuthn W3C Recommendation](https://www.w3.org/TR/webauthn/)
13
13
  - [WebAuthn W3C Editor's Draft](https://w3c.github.io/webauthn/)
14
14
 
15
15
  ## Prerequisites
@@ -15,6 +15,7 @@ module WebAuthn
15
15
  USER_PRESENT_FLAG_POSITION = 0
16
16
  USER_VERIFIED_FLAG_POSITION = 2
17
17
  ATTESTED_CREDENTIAL_DATA_INCLUDED_FLAG_POSITION = 6
18
+ EXTENSION_DATA_INCLUDED_FLAG_POSITION = 7
18
19
 
19
20
  def initialize(data)
20
21
  @data = data
@@ -23,8 +24,10 @@ module WebAuthn
23
24
  attr_reader :data
24
25
 
25
26
  def valid?
26
- if attested_credential_data_included?
27
- data.length > base_length && attested_credential_data.valid?
27
+ if attested_credential_data_included? || extension_data_included?
28
+ data.length > base_length &&
29
+ (!attested_credential_data_included? || attested_credential_data.valid?) &&
30
+ (!extension_data_included? || extension_data)
28
31
  else
29
32
  data.length == base_length
30
33
  end
@@ -46,6 +49,10 @@ module WebAuthn
46
49
  flags[ATTESTED_CREDENTIAL_DATA_INCLUDED_FLAG_POSITION] == "1"
47
50
  end
48
51
 
52
+ def extension_data_included?
53
+ flags[EXTENSION_DATA_INCLUDED_FLAG_POSITION] == "1"
54
+ end
55
+
49
56
  def rp_id_hash
50
57
  @rp_id_hash ||=
51
58
  if valid?
@@ -66,6 +73,10 @@ module WebAuthn
66
73
  AttestedCredentialData.new(data_at(attested_credential_data_position))
67
74
  end
68
75
 
76
+ def extension_data
77
+ @extension_data ||= CBOR.decode(data_at(extension_data_position))
78
+ end
79
+
69
80
  def flags
70
81
  @flags ||= data_at(flags_position, FLAGS_LENGTH).unpack("b*")[0]
71
82
  end
@@ -76,6 +87,18 @@ module WebAuthn
76
87
  base_length
77
88
  end
78
89
 
90
+ def attested_credential_data_length
91
+ if attested_credential_data_included?
92
+ attested_credential_data.length
93
+ else
94
+ 0
95
+ end
96
+ end
97
+
98
+ def extension_data_position
99
+ base_length + attested_credential_data_length
100
+ end
101
+
79
102
  def base_length
80
103
  RP_ID_HASH_LENGTH + FLAGS_LENGTH + SIGN_COUNT_LENGTH
81
104
  end
@@ -40,6 +40,12 @@ module WebAuthn
40
40
  end
41
41
  end
42
42
 
43
+ def length
44
+ if valid?
45
+ public_key_position + public_key_length
46
+ end
47
+ end
48
+
43
49
  private
44
50
 
45
51
  attr_reader :data
@@ -51,7 +57,7 @@ module WebAuthn
51
57
  end
52
58
 
53
59
  def public_key
54
- @public_key ||= PublicKeyU2f.new(data_at(public_key_position))
60
+ @public_key ||= PublicKeyU2f.new(data_at(public_key_position, public_key_length))
55
61
  end
56
62
 
57
63
  def id_position
@@ -70,6 +76,11 @@ module WebAuthn
70
76
  id_position + id_length
71
77
  end
72
78
 
79
+ def public_key_length
80
+ @public_key_length ||=
81
+ CBOR.encode(CBOR::Unpacker.new(StringIO.new(data_at(public_key_position))).each.first).length
82
+ end
83
+
73
84
  def data_at(position, length = nil)
74
85
  length ||= data.size - position
75
86
 
@@ -15,7 +15,7 @@ module WebAuthn
15
15
  end
16
16
 
17
17
  def authenticator_data
18
- @authenticator_data ||= rp_id_hash + raw_flags + raw_sign_count + attested_credential_data
18
+ @authenticator_data ||= rp_id_hash + raw_flags + raw_sign_count + attested_credential_data + extension_data
19
19
  end
20
20
 
21
21
  def client_data_json
@@ -39,7 +39,16 @@ module WebAuthn
39
39
  attr_reader :challenge, :context, :rp_id
40
40
 
41
41
  def raw_flags
42
- ["#{bit(:user_present)}0#{bit(:user_verified)}000#{attested_credential_data_present_bit}0"].pack("b*")
42
+ [
43
+ [
44
+ bit(:user_present),
45
+ "0",
46
+ bit(:user_verified),
47
+ "000",
48
+ attested_credential_data_present_bit,
49
+ extension_data_present_bit
50
+ ].join
51
+ ].pack("b*")
43
52
  end
44
53
 
45
54
  def attested_credential_data_present_bit
@@ -50,10 +59,22 @@ module WebAuthn
50
59
  end
51
60
  end
52
61
 
62
+ def extension_data_present_bit
63
+ if extension_data.empty?
64
+ "0"
65
+ else
66
+ "1"
67
+ end
68
+ end
69
+
53
70
  def attested_credential_data
54
71
  ""
55
72
  end
56
73
 
74
+ def extension_data
75
+ CBOR.encode("fakeExtension" => "fakeValue")
76
+ end
77
+
57
78
  def raw_sign_count
58
79
  [@sign_count].pack('L>')
59
80
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebAuthn
4
- VERSION = "1.9.0"
4
+ VERSION = "1.10.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.9.0
4
+ version: 1.10.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: 2019-02-22 00:00:00.000000000 Z
12
+ date: 2019-03-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cbor
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  - !ruby/object:Gem::Version
225
225
  version: '0'
226
226
  requirements: []
227
- rubygems_version: 3.0.2
227
+ rubygems_version: 3.0.3
228
228
  signing_key:
229
229
  specification_version: 4
230
230
  summary: WebAuthn in ruby ― Ruby implementation of a WebAuthn Relying Party