@@ -3,6 +3,7 @@ require "base64"
33require " bindata/asn1"
44require " openssl/hmac"
55require " openssl_ext"
6+ require " crypto/subtle"
67
78require " ./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