Skip to content

Commit

Permalink
Merge pull request #31 from jamescook/james/secure-compare
Browse files Browse the repository at this point in the history
Use constant time string comparison
  • Loading branch information
stakach authored Jun 4, 2020
2 parents 6ea3a30 + 1da0fbb commit 8e44ac9
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions src/jwt.cr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ require "base64"
require "bindata/asn1"
require "openssl/hmac"
require "openssl_ext"
require "crypto/subtle"

require "./jwt/*"

Expand Down Expand Up @@ -58,7 +59,7 @@ module JWT
raise VerificationError.new("Signature verification failed") if !result
else
expected_encoded_signature = encoded_signature(algorithm, key, verify_data)
if encoded_signature != expected_encoded_signature
unless Crypto::Subtle.constant_time_compare(encoded_signature, expected_encoded_signature)
raise VerificationError.new("Signature verification failed")
end
end
Expand Down Expand Up @@ -156,7 +157,7 @@ module JWT
if !payload["aud"]?
raise InvalidAudienceError.new("Invalid audience (aud). Expected #{aud.inspect}, received nothing")
elsif payload["aud"].as_s?
if aud != payload["aud"].as_s
unless Crypto::Subtle.constant_time_compare(aud.to_s, payload["aud"].as_s)
raise InvalidAudienceError.new("Invalid audience (aud). Expected #{aud.inspect}, received #{payload["aud"].inspect}")
end
elsif payload["aud"].as_a?
Expand All @@ -173,14 +174,14 @@ module JWT
private def validate_iss!(payload, iss)
if !payload["iss"]?
raise InvalidIssuerError.new("Invalid issuer (iss). Expected #{iss.inspect}, received nothing")
elsif payload["iss"] != iss
elsif !Crypto::Subtle.constant_time_compare(iss.to_s, payload["iss"].to_s)
raise InvalidIssuerError.new("Invalid issuer (iss). Expected #{iss.inspect}, received #{payload["iss"].inspect}")
end
end

private def validate_sub!(payload, sub)
if payload["sub"]?
if payload["sub"] != sub
unless Crypto::Subtle.constant_time_compare(sub.to_s, payload["sub"].to_s)
raise InvalidSubjectError.new("Invalid subject (sub). Expected #{sub.inspect}, received #{payload["sub"].inspect}")
end
else
Expand Down

0 comments on commit 8e44ac9

Please sign in to comment.