sandal 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sandal.rb +3 -4
- data/lib/sandal/enc.rb +1 -1
- data/lib/sandal/enc/acbc_hs.rb +2 -3
- data/lib/sandal/enc/agcm.rb +2 -3
- data/lib/sandal/sig/hs.rb +1 -2
- data/lib/sandal/util.rb +3 -5
- data/lib/sandal/version.rb +1 -1
- data/sandal.gemspec +21 -21
- data/spec/sandal/enc/alg/rsa_spec.rb +0 -2
- data/spec/sandal/sig/es_spec.rb +4 -6
- data/spec/sandal/util_spec.rb +13 -15
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e87dc3dc16b78944fbce50e48565012d79f087f6
|
4
|
+
data.tar.gz: 59b76ed79701856db73f2967da1818063fa58400
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ebe5600b88a9026de7b5056b0d26832f259adb47556a5cbe7eb51d07e6ec9eddc08ae289769ce260bf053d424521cb21c4cd394c273bf11d084fab7c2122b3d
|
7
|
+
data.tar.gz: 78a7d2f1a4a13330719adb344534882ee8652dcf26ad3966c3f9532a61682daaddcc409fee36d7e5f008d1c0f5f4b2a9defc2ec9fff44a4f685b65d3c3633c8c
|
data/lib/sandal.rb
CHANGED
@@ -13,7 +13,6 @@ require "sandal/util"
|
|
13
13
|
#
|
14
14
|
# Currently supports draft-07 of the JWT spec, and draft-10 of the JWS and JWE specs.
|
15
15
|
module Sandal
|
16
|
-
extend Sandal::Util
|
17
16
|
|
18
17
|
# The base error for all errors raised by this library.
|
19
18
|
class Error < StandardError; end
|
@@ -112,9 +111,9 @@ module Sandal
|
|
112
111
|
|
113
112
|
payload = MultiJson.dump(payload) unless payload.is_a?(String)
|
114
113
|
|
115
|
-
sec_input = [header, payload].map { |p| jwt_base64_encode(p) }.join(".")
|
114
|
+
sec_input = [header, payload].map { |p| Sandal::Util.jwt_base64_encode(p) }.join(".")
|
116
115
|
signature = signer.sign(sec_input)
|
117
|
-
[sec_input, jwt_base64_encode(signature)].join(".")
|
116
|
+
[sec_input, Sandal::Util.jwt_base64_encode(signature)].join(".")
|
118
117
|
end
|
119
118
|
|
120
119
|
# Creates an encrypted JSON Web Token.
|
@@ -206,7 +205,7 @@ module Sandal
|
|
206
205
|
|
207
206
|
# Decodes the parts of a token.
|
208
207
|
def self.decode_token_parts(parts)
|
209
|
-
parts = parts.map { |part| jwt_base64_decode(part) }
|
208
|
+
parts = parts.map { |part| Sandal::Util.jwt_base64_decode(part) }
|
210
209
|
parts[0] = MultiJson.load(parts[0])
|
211
210
|
parts
|
212
211
|
rescue
|
data/lib/sandal/enc.rb
CHANGED
@@ -12,7 +12,7 @@ module Sandal
|
|
12
12
|
def self.token_parts(token)
|
13
13
|
parts = token.is_a?(Array) ? token : token.split(".")
|
14
14
|
raise ArgumentError unless parts.length == 5
|
15
|
-
decoded_parts = parts.map { |part| jwt_base64_decode(part) }
|
15
|
+
decoded_parts = parts.map { |part| Sandal::Util.jwt_base64_decode(part) }
|
16
16
|
return parts, decoded_parts
|
17
17
|
rescue ArgumentError
|
18
18
|
raise Sandal::InvalidTokenError, "Invalid token encoding."
|
data/lib/sandal/enc/acbc_hs.rb
CHANGED
@@ -6,7 +6,6 @@ module Sandal
|
|
6
6
|
|
7
7
|
# Base implementation of the A*CBC-HS* family of encryption methods.
|
8
8
|
class ACBC_HS
|
9
|
-
include Sandal::Util
|
10
9
|
|
11
10
|
# The JWA name of the encryption method.
|
12
11
|
attr_reader :name
|
@@ -44,13 +43,13 @@ module Sandal
|
|
44
43
|
cipher.iv = iv = SecureRandom.random_bytes(16)
|
45
44
|
ciphertext = cipher.update(payload) + cipher.final
|
46
45
|
|
47
|
-
auth_data = jwt_base64_encode(header)
|
46
|
+
auth_data = Sandal::Util.jwt_base64_encode(header)
|
48
47
|
auth_data_length = [auth_data.length * 8].pack("Q>")
|
49
48
|
mac_input = [auth_data, iv, ciphertext, auth_data_length].join
|
50
49
|
mac = OpenSSL::HMAC.digest(@digest, mac_key, mac_input)
|
51
50
|
auth_tag = mac[0...(mac.length / 2)]
|
52
51
|
|
53
|
-
remainder = [encrypted_key, iv, ciphertext, auth_tag].map { |part| jwt_base64_encode(part) }
|
52
|
+
remainder = [encrypted_key, iv, ciphertext, auth_tag].map { |part| Sandal::Util.jwt_base64_encode(part) }
|
54
53
|
[auth_data, *remainder].join(".")
|
55
54
|
end
|
56
55
|
|
data/lib/sandal/enc/agcm.rb
CHANGED
@@ -6,7 +6,6 @@ module Sandal
|
|
6
6
|
|
7
7
|
# Base implementation of the A*GCM family of encryption methods.
|
8
8
|
class AGCM
|
9
|
-
include Sandal::Util
|
10
9
|
|
11
10
|
@@iv_size = 96
|
12
11
|
@@auth_tag_size = 128
|
@@ -41,12 +40,12 @@ module Sandal
|
|
41
40
|
cipher.key = key
|
42
41
|
cipher.iv = iv = SecureRandom.random_bytes(@@iv_size / 8)
|
43
42
|
|
44
|
-
auth_data = jwt_base64_encode(header)
|
43
|
+
auth_data = Sandal::Util.jwt_base64_encode(header)
|
45
44
|
cipher.auth_data = auth_data
|
46
45
|
|
47
46
|
ciphertext = cipher.update(payload) + cipher.final
|
48
47
|
remaining_parts = [encrypted_key, iv, ciphertext, cipher.auth_tag(@@auth_tag_size / 8)]
|
49
|
-
remaining_parts.map! { |part| jwt_base64_encode(part) }
|
48
|
+
remaining_parts.map! { |part| Sandal::Util.jwt_base64_encode(part) }
|
50
49
|
[auth_data, *remaining_parts].join(".")
|
51
50
|
end
|
52
51
|
|
data/lib/sandal/sig/hs.rb
CHANGED
@@ -5,7 +5,6 @@ module Sandal
|
|
5
5
|
|
6
6
|
# Base implementation of the HMAC-SHA family of signature algorithms.
|
7
7
|
class HS
|
8
|
-
include Sandal::Util
|
9
8
|
|
10
9
|
# The JWA name of the algorithm.
|
11
10
|
attr_reader :name
|
@@ -36,7 +35,7 @@ module Sandal
|
|
36
35
|
# @param payload [String] The payload of the token.
|
37
36
|
# @return [Boolean] true if the signature is correct; otherwise false.
|
38
37
|
def valid?(signature, payload)
|
39
|
-
jwt_strings_equal?(sign(payload), signature)
|
38
|
+
Sandal::Util.jwt_strings_equal?(sign(payload), signature)
|
40
39
|
end
|
41
40
|
|
42
41
|
end
|
data/lib/sandal/util.rb
CHANGED
@@ -5,8 +5,6 @@ module Sandal
|
|
5
5
|
# Implements some JWT utility functions. Shouldn't be needed by most people
|
6
6
|
# but may be useful if you're developing an extension to the library.
|
7
7
|
module Util
|
8
|
-
|
9
|
-
private
|
10
8
|
|
11
9
|
# A string equality function that compares Unicode codepoints, and also
|
12
10
|
# doesn't short-circuit the equality check to help protect against timing
|
@@ -19,7 +17,7 @@ module Sandal
|
|
19
17
|
# @param a [String] The first string.
|
20
18
|
# @param b [String] The second string.
|
21
19
|
# @return [Boolean] true if the strings are equal; otherwise false.
|
22
|
-
def jwt_strings_equal?(a, b)
|
20
|
+
def self.jwt_strings_equal?(a, b)
|
23
21
|
return true if a.object_id == b.object_id
|
24
22
|
return false if a.nil? || b.nil? || a.length != b.length
|
25
23
|
a.codepoints.zip(b.codepoints).reduce(0) { |r, (x, y)| r |= x ^ y } == 0
|
@@ -29,7 +27,7 @@ module Sandal
|
|
29
27
|
#
|
30
28
|
# @param s [String] The string to encode.
|
31
29
|
# @return [String] The encoded base64 string.
|
32
|
-
def jwt_base64_encode(s)
|
30
|
+
def self.jwt_base64_encode(s)
|
33
31
|
Base64.urlsafe_encode64(s).gsub(/=+$/, "")
|
34
32
|
end
|
35
33
|
|
@@ -38,7 +36,7 @@ module Sandal
|
|
38
36
|
# @param s [String] The base64 string to decode.
|
39
37
|
# @return [String] The decoded string.
|
40
38
|
# @raise [ArgumentError] The base64 string is invalid or contains padding.
|
41
|
-
def jwt_base64_decode(s)
|
39
|
+
def self.jwt_base64_decode(s)
|
42
40
|
if s.end_with?("=")
|
43
41
|
raise ArgumentError, "Base64 strings must not contain padding."
|
44
42
|
end
|
data/lib/sandal/version.rb
CHANGED
data/sandal.gemspec
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
($LOAD_PATH << File.expand_path("../lib", __FILE__)).uniq!
|
2
|
-
require
|
2
|
+
require "sandal/version"
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name =
|
5
|
+
s.name = "sandal"
|
6
6
|
s.version = Sandal::VERSION
|
7
|
-
s.summary =
|
8
|
-
s.description =
|
9
|
-
s.author =
|
10
|
-
s.email =
|
11
|
-
s.homepage =
|
12
|
-
s.license =
|
7
|
+
s.summary = "A JSON Web Token (JWT) library."
|
8
|
+
s.description = "A ruby library for creating and reading JSON Web Tokens (JWT), supporting JSON Web Signatures (JWS) and JSON Web Encryption (JWE)."
|
9
|
+
s.author = "Greg Beech"
|
10
|
+
s.email = "greg@gregbeech.com"
|
11
|
+
s.homepage = "http://rubygems.org/gems/sandal"
|
12
|
+
s.license = "MIT"
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split($/)
|
15
15
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
16
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
17
|
-
s.require_paths = [
|
18
|
-
s.extra_rdoc_files = [
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.extra_rdoc_files = ["README.md", "LICENSE.md", "CHANGELOG.md"]
|
19
19
|
|
20
|
-
s.add_runtime_dependency
|
21
|
-
s.add_runtime_dependency
|
20
|
+
s.add_runtime_dependency "multi_json", "~> 1.7"
|
21
|
+
s.add_runtime_dependency "jruby-openssl", "~> 0.7", ">= 0.7.3" if RUBY_PLATFORM == "java"
|
22
22
|
|
23
|
-
s.add_development_dependency
|
24
|
-
s.add_development_dependency
|
25
|
-
s.add_development_dependency
|
26
|
-
s.add_development_dependency
|
27
|
-
s.add_development_dependency
|
28
|
-
s.add_development_dependency
|
29
|
-
s.add_development_dependency
|
30
|
-
s.add_development_dependency
|
23
|
+
s.add_development_dependency "bundler", ">= 1.3"
|
24
|
+
s.add_development_dependency "rake", ">= 10.0"
|
25
|
+
s.add_development_dependency "rspec", ">= 2.13"
|
26
|
+
s.add_development_dependency "simplecov", ">= 0.7"
|
27
|
+
s.add_development_dependency "coveralls", ">= 0.6"
|
28
|
+
s.add_development_dependency "yard", ">= 0.8"
|
29
|
+
s.add_development_dependency "redcarpet", ">= 2.2" unless RUBY_PLATFORM == "java" # for yard
|
30
|
+
s.add_development_dependency "kramdown", ">= 1.0" if RUBY_PLATFORM == "java" # for yard
|
31
31
|
|
32
|
-
s.requirements <<
|
32
|
+
s.requirements << "openssl 1.0.1c for EC signature methods"
|
33
33
|
end
|
data/spec/sandal/sig/es_spec.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require "helper"
|
2
2
|
require "openssl"
|
3
3
|
|
4
|
-
include Sandal::Util
|
5
|
-
|
6
4
|
# EC isn't implemented in jruby-openssl at the moment
|
7
5
|
if defined? Sandal::Sig::ES
|
8
6
|
|
@@ -111,7 +109,7 @@ describe Sandal::Sig::ES do
|
|
111
109
|
r = make_bn([14, 209, 33, 83, 121, 99, 108, 72, 60, 47, 127, 21, 88, 7, 212, 2, 163, 178, 40, 3, 58, 249, 124, 126, 23, 129, 154, 195, 22, 158, 166, 101])
|
112
110
|
s = make_bn([197, 10, 7, 211, 140, 60, 112, 229, 216, 241, 45, 175, 8, 74, 84, 128, 166, 101, 144, 197, 242, 147, 80, 154, 143, 63, 127, 138, 131, 163, 84, 213])
|
113
111
|
signature = Sandal::Sig::ES.encode_jws_signature(r, s, 256)
|
114
|
-
base64_signature = jwt_base64_encode(signature)
|
112
|
+
base64_signature = Sandal::Util.jwt_base64_encode(signature)
|
115
113
|
base64_signature.should == "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
|
116
114
|
end
|
117
115
|
|
@@ -119,7 +117,7 @@ describe Sandal::Sig::ES do
|
|
119
117
|
r = make_bn([1, 220, 12, 129, 231, 171, 194, 209, 232, 135, 233, 117, 247, 105, 122, 210, 26, 125, 192, 1, 217, 21, 82, 91, 45, 240, 255, 83, 19, 34, 239, 71, 48, 157, 147, 152, 105, 18, 53, 108, 163, 214, 68, 231, 62, 153, 150, 106, 194, 164, 246, 72, 143, 138, 24, 50, 129, 223, 133, 206, 209, 172, 63, 237, 119, 109])
|
120
118
|
s = make_bn([0, 111, 6, 105, 44, 5, 41, 208, 128, 61, 152, 40, 92, 61, 152, 4, 150, 66, 60, 69, 247, 196, 170, 81, 193, 199, 78, 59, 194, 169, 16, 124, 9, 143, 42, 142, 131, 48, 206, 238, 34, 175, 83, 203, 220, 159, 3, 107, 155, 22, 27, 73, 111, 68, 68, 21, 238, 144, 229, 232, 148, 188, 222, 59, 242, 103])
|
121
119
|
signature = Sandal::Sig::ES.encode_jws_signature(r, s, 521)
|
122
|
-
base64_signature = jwt_base64_encode(signature)
|
120
|
+
base64_signature = Sandal::Util.jwt_base64_encode(signature)
|
123
121
|
base64_signature.should == "AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn"
|
124
122
|
end
|
125
123
|
|
@@ -144,7 +142,7 @@ describe Sandal::Sig::ES256 do
|
|
144
142
|
y = make_bn([199, 241, 68, 205, 27, 189, 155, 126, 135, 44, 223, 237, 185, 238, 185, 244, 179, 105, 93, 110, 169, 11, 36, 173, 138, 70, 35, 40, 133, 136, 229, 173])
|
145
143
|
d = make_bn([142, 155, 16, 158, 113, 144, 152, 191, 152, 4, 135, 223, 31, 93, 119, 233, 203, 41, 96, 110, 190, 210, 38, 59, 95, 87, 194, 19, 223, 132, 244, 178])
|
146
144
|
data = "eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ"
|
147
|
-
signature = jwt_base64_decode("DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q")
|
145
|
+
signature = Sandal::Util.jwt_base64_decode("DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q")
|
148
146
|
|
149
147
|
group = OpenSSL::PKey::EC::Group.new("prime256v1")
|
150
148
|
public_key = OpenSSL::PKey::EC.new(group)
|
@@ -186,7 +184,7 @@ describe Sandal::Sig::ES512 do
|
|
186
184
|
y = make_bn([0, 52, 166, 68, 14, 55, 103, 80, 210, 55, 31, 209, 189, 194, 200, 243, 183, 29, 47, 78, 229, 234, 52, 50, 200, 21, 204, 163, 21, 96, 254, 93, 147, 135, 236, 119, 75, 85, 131, 134, 48, 229, 203, 191, 90, 140, 190, 10, 145, 221, 0, 100, 198, 153, 154, 31, 110, 110, 103, 250, 221, 237, 228, 200, 200, 246])
|
187
185
|
d = make_bn([1, 142, 105, 111, 176, 52, 80, 88, 129, 221, 17, 11, 72, 62, 184, 125, 50, 206, 73, 95, 227, 107, 55, 69, 237, 242, 216, 202, 228, 240, 242, 83, 159, 70, 21, 160, 233, 142, 171, 82, 179, 192, 197, 234, 196, 206, 7, 81, 133, 168, 231, 187, 71, 222, 172, 29, 29, 231, 123, 204, 246, 97, 53, 230, 61, 130] )
|
188
186
|
data = "eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA"
|
189
|
-
signature = jwt_base64_decode("AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn")
|
187
|
+
signature = Sandal::Util.jwt_base64_decode("AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn")
|
190
188
|
|
191
189
|
group = OpenSSL::PKey::EC::Group.new("secp521r1")
|
192
190
|
public_key = OpenSSL::PKey::EC.new(group)
|
data/spec/sandal/util_spec.rb
CHANGED
@@ -2,24 +2,22 @@ require 'helper'
|
|
2
2
|
require 'openssl'
|
3
3
|
require 'benchmark'
|
4
4
|
|
5
|
-
include Sandal::Util
|
6
|
-
|
7
5
|
describe Sandal::Util do
|
8
6
|
|
9
7
|
context '#jwt_base64_decode' do
|
10
8
|
|
11
9
|
it 'decodes base64 as per JWT example 6.1' do
|
12
10
|
encoded = 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ'
|
13
|
-
val = jwt_base64_decode(encoded)
|
11
|
+
val = Sandal::Util.jwt_base64_decode(encoded)
|
14
12
|
val.should == %!{"iss":"joe",\r\n "exp":1300819380,\r\n "http://example.com/is_root":true}!
|
15
13
|
end
|
16
14
|
|
17
15
|
it 'raises an ArgumentError if base64 strings contain padding' do
|
18
|
-
expect { jwt_base64_decode('eyJpc3MiOiJq=') }.to raise_error ArgumentError
|
16
|
+
expect { Sandal::Util.jwt_base64_decode('eyJpc3MiOiJq=') }.to raise_error ArgumentError
|
19
17
|
end
|
20
18
|
|
21
19
|
it 'raises an ArgumentError if base64 strings are invalid' do
|
22
|
-
expect { jwt_base64_decode('not valid base64') }.to raise_error ArgumentError
|
20
|
+
expect { Sandal::Util.jwt_base64_decode('not valid base64') }.to raise_error ArgumentError
|
23
21
|
end
|
24
22
|
|
25
23
|
end
|
@@ -28,7 +26,7 @@ describe Sandal::Util do
|
|
28
26
|
|
29
27
|
it 'encodes base64 as per JWT example 6.1' do
|
30
28
|
src = %!{"iss":"joe",\r\n "exp":1300819380,\r\n "http://example.com/is_root":true}!
|
31
|
-
encoded = jwt_base64_encode(src)
|
29
|
+
encoded = Sandal::Util.jwt_base64_encode(src)
|
32
30
|
encoded.should == 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ'
|
33
31
|
end
|
34
32
|
|
@@ -37,31 +35,31 @@ describe Sandal::Util do
|
|
37
35
|
context '#jwt_strings_equal?' do
|
38
36
|
|
39
37
|
it 'compares nil strings as equal' do
|
40
|
-
jwt_strings_equal?(nil, nil).should == true
|
38
|
+
Sandal::Util.jwt_strings_equal?(nil, nil).should == true
|
41
39
|
end
|
42
40
|
|
43
41
|
it 'compares empty strings as equal' do
|
44
|
-
jwt_strings_equal?('', '').should == true
|
42
|
+
Sandal::Util.jwt_strings_equal?('', '').should == true
|
45
43
|
end
|
46
44
|
|
47
45
|
it 'compares nil strings as unequal to empty strings' do
|
48
|
-
jwt_strings_equal?(nil, '').should == false
|
49
|
-
jwt_strings_equal?('', nil).should == false
|
46
|
+
Sandal::Util.jwt_strings_equal?(nil, '').should == false
|
47
|
+
Sandal::Util.jwt_strings_equal?('', nil).should == false
|
50
48
|
end
|
51
49
|
|
52
50
|
it 'compares equal strings as equal' do
|
53
|
-
jwt_strings_equal?('hello', 'hello').should == true
|
54
|
-
jwt_strings_equal?('a longer string', 'a longer string').should == true
|
51
|
+
Sandal::Util.jwt_strings_equal?('hello', 'hello').should == true
|
52
|
+
Sandal::Util.jwt_strings_equal?('a longer string', 'a longer string').should == true
|
55
53
|
end
|
56
54
|
|
57
55
|
it 'compares unequal strings as unequal' do
|
58
|
-
jwt_strings_equal?('hello', 'world').should == false
|
59
|
-
jwt_strings_equal?('a longer string', 'a different longer string').should == false
|
56
|
+
Sandal::Util.jwt_strings_equal?('hello', 'world').should == false
|
57
|
+
Sandal::Util.jwt_strings_equal?('a longer string', 'a different longer string').should == false
|
60
58
|
end
|
61
59
|
|
62
60
|
it 'compares strings without short-circuiting', :timing_dependent do
|
63
61
|
measure_equals = -> a, b do
|
64
|
-
Benchmark.realtime { 100.times { jwt_strings_equal?(a, b) } }
|
62
|
+
Benchmark.realtime { 100.times { Sandal::Util.jwt_strings_equal?(a, b) } }
|
65
63
|
end
|
66
64
|
ref = 'a' * 10000
|
67
65
|
cmp1 = ('a' * 9999) + 'b'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sandal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Beech
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -130,6 +130,7 @@ extensions: []
|
|
130
130
|
extra_rdoc_files:
|
131
131
|
- README.md
|
132
132
|
- LICENSE.md
|
133
|
+
- CHANGELOG.md
|
133
134
|
files:
|
134
135
|
- .coveralls.yml
|
135
136
|
- .gitignore
|