Skip to content

Commit 8e44ac9

Browse files
authored
Merge pull request #31 from jamescook/james/secure-compare
Use constant time string comparison
2 parents 6ea3a30 + 1da0fbb commit 8e44ac9

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

src/jwt.cr

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ require "base64"
33
require "bindata/asn1"
44
require "openssl/hmac"
55
require "openssl_ext"
6+
require "crypto/subtle"
67

78
require "./jwt/*"
89

@@ -58,7 +59,7 @@ module JWT
5859
raise VerificationError.new("Signature verification failed") if !result
5960
else
6061
expected_encoded_signature = encoded_signature(algorithm, key, verify_data)
61-
if encoded_signature != expected_encoded_signature
62+
unless Crypto::Subtle.constant_time_compare(encoded_signature, expected_encoded_signature)
6263
raise VerificationError.new("Signature verification failed")
6364
end
6465
end
@@ -156,7 +157,7 @@ module JWT
156157
if !payload["aud"]?
157158
raise InvalidAudienceError.new("Invalid audience (aud). Expected #{aud.inspect}, received nothing")
158159
elsif payload["aud"].as_s?
159-
if aud != payload["aud"].as_s
160+
unless Crypto::Subtle.constant_time_compare(aud.to_s, payload["aud"].as_s)
160161
raise InvalidAudienceError.new("Invalid audience (aud). Expected #{aud.inspect}, received #{payload["aud"].inspect}")
161162
end
162163
elsif payload["aud"].as_a?
@@ -173,14 +174,14 @@ module JWT
173174
private def validate_iss!(payload, iss)
174175
if !payload["iss"]?
175176
raise InvalidIssuerError.new("Invalid issuer (iss). Expected #{iss.inspect}, received nothing")
176-
elsif payload["iss"] != iss
177+
elsif !Crypto::Subtle.constant_time_compare(iss.to_s, payload["iss"].to_s)
177178
raise InvalidIssuerError.new("Invalid issuer (iss). Expected #{iss.inspect}, received #{payload["iss"].inspect}")
178179
end
179180
end
180181

181182
private def validate_sub!(payload, sub)
182183
if payload["sub"]?
183-
if payload["sub"] != sub
184+
unless Crypto::Subtle.constant_time_compare(sub.to_s, payload["sub"].to_s)
184185
raise InvalidSubjectError.new("Invalid subject (sub). Expected #{sub.inspect}, received #{payload["sub"].inspect}")
185186
end
186187
else

0 commit comments

Comments
 (0)