Skip to content

Commit 6a5d7e9

Browse files
authored
Suppressing unexpected error with WebAuthn::PublicKeyCredentialWithAttestation#verify (#413)
* Suppressing unexpected errors with `WebAuthn::PublicKeyCredentialWithAttestation#verify` * Fix `rubocop` offense `Layout/LineLength` * Made `challenge` check a common process in `WebAuthn::PublicKeyCredential`
1 parent 43a491b commit 6a5d7e9

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

lib/webauthn/public_key_credential.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
module WebAuthn
66
class PublicKeyCredential
7+
class InvalidChallengeError < Error; end
8+
79
attr_reader :type, :id, :raw_id, :client_extension_outputs, :authenticator_attachment, :response
810

911
def self.from_client(credential, relying_party: WebAuthn.configuration.relying_party)
@@ -36,7 +38,13 @@ def initialize(
3638
@relying_party = relying_party
3739
end
3840

39-
def verify(*_args)
41+
def verify(challenge, *_args)
42+
unless valid_class?(challenge)
43+
msg = "challenge must be a String. input challenge class: #{challenge.class}"
44+
45+
raise(InvalidChallengeError, msg)
46+
end
47+
4048
valid_type? || raise("invalid type")
4149
valid_id? || raise("invalid id")
4250

@@ -71,6 +79,10 @@ def valid_id?
7179
raw_id && id && raw_id == WebAuthn.standard_encoder.decode(id)
7280
end
7381

82+
def valid_class?(challenge)
83+
challenge.is_a?(String)
84+
end
85+
7486
def authenticator_data
7587
response&.authenticator_data
7688
end

spec/webauthn/public_key_credential_with_assertion_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,18 @@
119119
end
120120
end
121121

122+
context "when challenge class is invalid" do
123+
it "raise error" do
124+
expect do
125+
public_key_credential.verify(
126+
nil,
127+
public_key: credential_public_key,
128+
sign_count: credential_sign_count
129+
)
130+
end.to raise_error(WebAuthn::PublicKeyCredential::InvalidChallengeError)
131+
end
132+
end
133+
122134
context "when challenge is invalid" do
123135
let(:challenge) { Base64.urlsafe_encode64("another challenge") }
124136

spec/webauthn/public_key_credential_with_attestation_spec.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,15 @@
8787
end
8888
end
8989

90-
context "when challenge is invalid" do
90+
context "when challenge class is invalid" do
91+
it "raise error" do
92+
expect {
93+
public_key_credential.verify(nil)
94+
}.to raise_error(WebAuthn::PublicKeyCredential::InvalidChallengeError)
95+
end
96+
end
97+
98+
context "when challenge value is invalid" do
9199
it "fails" do
92100
expect {
93101
public_key_credential.verify(Base64.urlsafe_encode64("another challenge"))

0 commit comments

Comments
 (0)